間違っていなければ、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には以前に指定された値が含まれています。私が間違っている?
メモリはガベージコレクターによって非同期的にクリアされ、そのようなライブラリ関数によって直接クリアされるわけではないので、あなたは正しいです。 clear
はnull
のみをすべて出力し、それに応じてArrayList
状態を更新します。
これらの要素のいずれかまたはすべてがコードの他の部分によって参照されていない場合、それらはガベージコレクションの対象となり、その呼び出しの直後から終わりまでいつでも破棄され、割り当て解除される可能性があります。
clear
はバッキング配列要素のみをnullにします
public void clear() {
modCount++;
for (int i = 0; i < size; i++)
elementData[i] = null;
size = 0;
}
しかし、ArrayList.trimToSize
after clear
バッキング配列は縮小します
public void trimToSize() {
modCount++;
int oldCapacity = elementData.length;
if (size < oldCapacity) {
elementData = Arrays.copyOf(elementData, size);
}
}
いいえ、メモリをクリアしません。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が実行されると、それらはなくなります。
あなたの質問への答え、それはFREE
メモリではありません。すべての_object references
_を削除するだけです。これらのオブジェクトは、他の場所での参照方法に応じて、garbage
コレクターによって収集される場合とされない場合があります。
例えば、
_Object 1 refers - > Object 2
ArrayList refers - > Object 2
ArrayList refers - > Object 3
_
この場合、Arraylist.clear()
の後、オブジェクト3は_clean-up
_に適格になりますが、オブジェクト2には適格になりません。