arraylist
がArrayList<String> arraylist
として定義されていると仮定すると、 arraylist.removeAll(arraylist)
は arraylist.clear()
と同等ですか?
もしそうなら、clear()
メソッドが配列リストを空にするためにより効率的であると仮定することができますか?
arraylist.removeAll(arraylist)
の代わりにarraylist.clear()
を使用する際の注意点はありますか?
clear()
のソースコード:
public void clear() {
modCount++;
// Let gc do its work
for (int i = 0; i < size; i++)
elementData[i] = null;
size = 0;
}
removeAll()
のソースコード(AbstractCollection
で定義):
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(..)
は、removeAll
のO(n)とは対照的に、clear
の時間の複雑さをO(n ^ 2)に増やします。
ArrayList.clear()
の複雑さはO(n)
であり、removeAll
の複雑さはO(n^2)
です。
そう、ArrayList.clear
はずっと速いです。
clear()
メソッドは、単一のArrayList
のすべての要素を削除します。いくつかの配列要素をnull
に設定するだけなので、高速な操作です。
AbstractCollection
から継承されるremoveAll(Collection)
メソッドは、引数のコレクションにあるすべての要素を、そのメソッドを呼び出したコレクションから削除します。関連するコレクションの1つを検索しなければならないので、比較的遅い操作です。
それらは異なる目的を果たします。 clear()
はクラスのインスタンスをクリアし、removeAll()
は与えられたすべてのオブジェクトを削除して操作の状態を返します。
removeAll()
に渡される引数がコレクション自体であるかどうかを確認する特定の最適化がない限り(およびI 高そのような最適化が存在することを疑う)、かなり単純な.clear()
よりも遅い。
それとは別に(そして少なくとも同様に重要です):arraylist.removeAll(arraylist)
は単に鈍く、混乱を招くコードです。これは、「このコレクションをクリアする」という非常に逆行的な方法です。 非常に理解しやすいarraylist.clear()
に対してどのような利点がありますか?
clear()
は基礎となる配列をたどり、各エントリをnullに設定します。
removeAll(collection)
はArrayListでコレクションをチェックし、remove(Object)
が存在する場合はそれを調べます。
clear()
はremoveAllよりずっと速いと思います。
削除は削除する要素をループしないため、消去は速くなります。この方法では、すべての要素を削除できると想定できます。
Remove all
は必ずしもリスト内のすべての要素を削除するという意味ではなく、パラメーターとして指定されたものだけを削除する必要があります。したがって、削除すべきではないものを維持するためには、さらに努力が必要です。
_説明_
「ループ」とは、要素を保持するかどうかをチェックする必要がないことを意味します。指定された削除する要素のリストを検索しなくても、参照をnull
に設定できます。
Clear
ISはdeleteall
より速いです。
clear()ははるかに効率的になります。それは単にすべてのアイテムを削除します。 removeAll(arraylist)を使用すると、削除する前に、それがarraylist内のすべての項目がarraylist内に存在するかどうかを確認するため、作業が大幅に増えます。