2011-08-11 1 views
212

arraylistArrayList<String> arraylistと定義すると、arraylist.removeAll(arraylist)arraylist.clear()に相当しますか?ArrayList.clear()とArrayList.removeAll()の違いは何ですか?

もしそうなら、clear()メソッドが配列リストを空にする方が効率的だと思いますか?

arraylist.clear()の代わりにarraylist.removeAll(arraylist)を使用する際に警告がありますか?

+0

この質問には、次のような結論が生じる可能性があります。 –

+3

@Corey:いつも誰かが 'arraylist.removeAll(arraylist)'を使いたいのですか?私はそれをする理由は絶対に見ません。 –

+0

@Joachim Sauerそれはまさに私が検証したかったものです。おかげさまで+2。しかし、 'elementData [i] = null'と' e.remove() 'の違いは重要ですか? – ateiob

答えて

304

clear()のソースコード:

public void clear() { 
    modCount++; 

    // Let gc do its work 
    for (int i = 0; i < size; i++) 
     elementData[i] = null; 

    size = 0; 
} 

AbstractCollectionで定義されているように)removeAll()のソースコード:

public boolean removeAll(Collection<?> c) { 
    boolean modified = false; 
    Iterator<?> e = iterator(); 
    while (e.hasNext()) { 
     if (c.contains(e.next())) { 
      e.remove(); 
      modified = true; 
     } 
    } 
    return modified; 
} 

clear()はそれがすべてに対処する必要はありませんので、はるかに高速ですそれらの余分なメソッド呼び出し。

とAtreyが指摘するように、c.contains(..)clearのO(n)ではなく、removeAllの時間複雑さをO(n^2)に増加させます。

+20

'c.contains(...)'は操作の複雑さの時間を二乗すると、この答えが完了することに注意してください。 – Atreys

+0

@Jeffrey 'elementData [i] = null'と' e.remove() 'の違いは何ですか? – ateiob

+5

このソースは強いです。 (他のすべての回答には、ルーク元を使用してください) clear()は1行だけで実装できることに注意してください。ガベージコレクションでは、配列の到達不能部分の要素を収集することはわかりません。 –

1

削除する要素をループしないため、消去が高速になります。このメソッドは、すべての要素を削除できると想定できます。

Remove allは必ずしもリスト内のすべての要素を削除することを意味するものではなく、パラメータとして提供された要素のみが削除されるべきである。したがって、削除すべきでないものを保持するためにより多くの努力が必要である。 「ループ」によって

明確化

、私はそれは要素が保持するかどうかを確認する必要はありません意味します。削除する要素のリストを検索することなく、参照をnullに設定することができます。

Cleardeleteallより速くなります。

+1

'ArrayList.clear()'もループしなければならないと確信しています。 –

+0

@JVerstry clear()**は、ArrayListから削除する要素を削除しない**ことを意味しますか? – ateiob

+1

間違っていると、内部配列をループし、すべての参照をnullに設定して、ガベージコレクタにその作業を許可します。 – devconsole

4

これらは、2つの異なる目的を果たします。 clear()はクラスのインスタンスを消去するだけで、removeAll()は指定されたすべてのオブジェクトを削除し、操作の状態を返します。

+0

あなたは、上記の問題を参照するためのリソースを提供してください。 –

+1

@ KasunSiyambalapitiya 2つのソースコードを含む[受け入れ可能な回答](http://stackoverflow.com/a/7032144/3040381)はどうですか? ? – Abdul

7

removeAll()に渡される引数は、コレクション自体(と私そのような最適化があることが非常に疑い)であるかどうかを確認する具体的な最適化が存在しない限り、それは簡単な.clear()よりも大幅に遅くなります。

それ以外(少なくともでも同じです):arraylist.removeAll(arraylist)は単なる紛らわしく混乱するコードです。これは、「このコレクションをクリアする」という非常に後方の方法です。 にはどのような利点がありますか?arraylist.clear()

1

clear()ははるかに効率的です。それは単に各項目を削除するだけです。 removeAll(arraylist)を使用すると、arraylist内のすべての項目をチェックしてarraylistに存在するかどうかを調べるため、より多くの作業が必要になります。

35

ArrayList.clear()の時間複雑度はO(n)であり、removeAllO(n^2)である。

だから、ArrayList.clearははるかに高速です。

9

clear()メソッドは、単一のArrayListのすべての要素を削除します。配列の要素をnullに設定するだけで、高速な操作です。

AbstractCollectionから継承されたremoveAll(Collection)メソッドは、メソッドを呼び出すコレクションから引数コレクション内にあるすべての要素を削除します。それは関連するコレクションの1つを検索しなければならないので、比較的遅い操作です。

3

clear()は、基本となる配列を通過し、各エントリをnullに設定します。

removeAll(collection)は、コレクションのコレクションチェックとそれが存在する場合はremove(Object)になります。私はclear()はそれが比較ではないのでがremoveAllその後、道高速であることを想像

など

-5

アレイ=>スペースは実行時に配列変数に割り当てられると、割り当てられたスペースを拡張することができませんか、除去された。

ArrayList =>これはarraylistのケースではありません。 ArrayListは、実行時に伸縮できます。 割り当てられた領域は、実行時に最小化または最大化できます。

+0

これは、ArrayList.clear()とArrayList.removeAll()の違いで、ArrayとArrayListの違いではありません。 – Pierre

+0

この回答は不要です。それは問題のことではありません。 –

関連する問題