web-dev-qa-db-ja.com

Java ArrayList clear()関数

_ArrayList<String> data;_があるとします

data.add()関数を使用して、この配列にデータを追加しています。この配列に10個の文字列を追加したとしましょう。配列のサイズは現在10です。

配列内のすべての要素を破棄するにはどうすればよいですか? data.clear()関数は、10個すべての要素をnullに設定するだけです。したがって、別の要素を追加しようとすると、11の位置になります。 0からやり直したいだけです。

Forループを使用してすべてのデータを置き換えることができますが、ArrayListを空にする方法は本当にあると思います。それは...ですか?

33
artouiros

あなたの仮定は正しくないようです。 clear()の後、新しく追加されたデータはインデックス0から始まります。

65
Dan D.

疑問がある場合は、JDKソースコードをご覧ください

ArrayList.clear()ソースコード:

_public void clear() {
    modCount++;

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

    size = 0;
}
_

sizeが0に設定されているため、0の位置から開始します。

ArrayListに要素を追加すると、新しいアイテムを追加できるように、バックエンド配列が拡張されます(つまり、必要に応じて配列データがより大きな配列にコピーされます)。 ArrayList.clear()を実行する場合、配列要素への参照のみを削除し、sizeを0に設定しますが、capacityはそのままです。

26
Tom

ArrayList.clear(From Java Doc ):

このリストからすべての要素を削除します。この呼び出しが返された後、リストは空になります

10
Hui Zheng

data.clear()の後、ゼロインデックスから確実に再び開始されます。

9
NIkhil Gupta

data.removeAll(data);が作業を行うと思います。

8
Juvanis

clear()関数がArraylistをクリアし、インデックス0から開始するのは正しくありません

5
Alya'a Gamal

明確なソースコードは、新しく追加されたデータが最初の位置を取得する理由を示しています。

 public void clear() {
    modCount++;

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

    size = 0;
    }

ちなみに、clear()はremoveAll()よりも高速です。最初のものはO(n)で、後者はO(n_2)です

3
fatma.ekici