web-dev-qa-db-ja.com

ArrayList.clear()メソッドはメモリを解放しますか?

間違っていなければ、ArrayListには、リストに追加した変数が保存されているメモリ位置の値が含まれています。したがって、私の想定では、ArrayList.clear()メソッドを呼び出すと、前述の(メモリロケーションの)値のみが解放されますが、それらのメモリロケーション自体は解放されません。例でこれを説明してみましょう。

メモリの現在のステータスがあるとしましょう:

[Memory location] (type of variable) *value*

[1000] (int) 32

[1002] (int) 12

[1003] (float) 2.5

そして、それらをリストmyListに追加すると、1000、1002、1003のメモリ位置へのポインタが含まれます。

MyList.clear()を呼び出すと、ポインターは無効になりますが、メモリー位置1000、1002、1003には以前に指定された値が含まれています。私が間違っている?

23
nstosic

メモリはガベージコレクターによって非同期的にクリアされ、そのようなライブラリ関数によって直接クリアされるわけではないので、あなたは正しいです。 clearnullのみをすべて出力し、それに応じてArrayList状態を更新します。

これらの要素のいずれかまたはすべてがコードの他の部分によって参照されていない場合、それらはガベージコレクションの対象となり、その呼び出しの直後から終わりまでいつでも破棄され、割り当て解除される可能性があります。

13
Karthik T

clearはバッキング配列要素のみをnullにします

public void clear() {
    modCount++;
    for (int i = 0; i < size; i++)
        elementData[i] = null;
    size = 0;
}

しかし、ArrayList.trimToSizeafter clearバッキング配列は縮小します

public void trimToSize() {
    modCount++;
    int oldCapacity = elementData.length;
    if (size < oldCapacity) {
        elementData = Arrays.copyOf(elementData, size);
    }
}
5

いいえ、メモリをクリアしません。clear()を実行した後。

Clear()のソースコードを参照してください

 public void More ...clear() {
    modCount++;

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

この方法は、要素をガベージコレクターに適格にすることで、すぐにはクリアしません。 GCが実行されると、それらはなくなります。

5
Suresh Atta

あなたの質問への答え、それはFREEメモリではありません。すべての_object references_を削除するだけです。これらのオブジェクトは、他の場所での参照方法に応じて、garbageコレクターによって収集される場合とされない場合があります。

例えば、

_Object 1 refers - > Object 2
ArrayList refers - > Object 2
ArrayList refers - > Object 3
_

この場合、Arraylist.clear()の後、オブジェクト3は_clean-up_に適格になりますが、オブジェクト2には適格になりません。

2
Amol Sonawane