web-dev-qa-db-ja.com

ArrayList.clear()とArrayList.removeAll()の違いは何ですか?

arraylistArrayList<String> arraylistとして定義されていると仮定すると、 arraylist.removeAll(arraylist)arraylist.clear() と同等ですか?

もしそうなら、clear()メソッドが配列リストを空にするためにより効率的であると仮定することができますか?

arraylist.removeAll(arraylist)の代わりにarraylist.clear()を使用する際の注意点はありますか?

254
ateiob

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)に増やします。

360
Jeffrey

ArrayList.clear()の複雑さはO(n)であり、removeAllの複雑さはO(n^2)です。

そう、ArrayList.clearはずっと速いです。

45
Geoff

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

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

14

それらは異なる目的を果たします。 clear()はクラスのインスタンスをクリアし、removeAll()は与えられたすべてのオブジェクトを削除して操作の状態を返します。

7
lucapette

removeAll()に渡される引数がコレクション自体であるかどうかを確認する特定の最適化がない限り(およびI そのような最適化が存在することを疑う)、かなり単純な.clear()よりも遅い。

それとは別に(そして少なくとも同様に重要です):arraylist.removeAll(arraylist)は単に鈍く、混乱を招くコードです。これは、「このコレクションをクリアする」という非常に逆行的な方法です。 非常に理解しやすいarraylist.clear()に対してどのような利点がありますか?

7
Joachim Sauer

clear()は基礎となる配列をたどり、各エントリをnullに設定します。

removeAll(collection)はArrayListでコレクションをチェックし、remove(Object)が存在する場合はそれを調べます。

clear()はremoveAllよりずっと速いと思います。

4
Nicholas

削除は削除する要素をループしないため、消去は速くなります。この方法では、すべての要素を削除できると想定できます。

Remove allは必ずしもリスト内のすべての要素を削除するという意味ではなく、パラメーターとして指定されたものだけを削除する必要があります。したがって、削除すべきではないものを維持するためには、さらに努力が必要です。

_説明_

「ループ」とは、要素を保持するかどうかをチェックする必要がないことを意味します。指定された削除する要素のリストを検索しなくても、参照をnullに設定できます。

Clear ISはdeleteallより速いです。

2

clear()ははるかに効率的になります。それは単にすべてのアイテムを削除します。 removeAll(arraylist)を使用すると、削除する前に、それがarraylist内のすべての項目がarraylist内に存在するかどうかを確認するため、作業が大幅に増えます。

1
CDelaney