ArrayList は、舞台裏で配列を維持します。と のソース コードを深く掘り下げたいと思いjava.util.ArrayList
ますjava.util.LinkedList
。
まず、ArrayList はバックグラウンドで配列を維持します。ArrayList インスタンスを作成すると、サイズが 10 の配列が作成され、要素が挿入されるとサイズが大きくなります。サイズは3(サイズ)/2+1まで伸びます
これがソースコードです。
arrat リストのデフォルト サイズ。コンストラクター コードを見てください。
public ArrayList() {
this(10);
}
そのサイズは 3(size)/2 + 1 になります。ソース コードは次のとおりです。ArrayList#ensureCapacityメソッドはArrayList#add内で呼び出されます
public void ensureCapacity(int minCapacity) {
modCount++;
int oldCapacity = elementData.length;
if (minCapacity > oldCapacity) {
Object oldData[] = elementData;
int newCapacity = (oldCapacity * 3)/2 + 1;
if (newCapacity < minCapacity)
newCapacity = minCapacity;
// minCapacity is usually close to size, so this is a win:
elementData = Arrays.copyOf(elementData, newCapacity);
}
}
ArrayList から項目を削除する場合。リストから削除され、他のリスト項目は削除された項目の場所に移動します。このオブジェクトへの参照は null に設定され、オブジェクトは GC の対象になりますが、ArrayList に割り当てられた参照がまだあることに注意してください。ArrayList の後ろの配列サイズは同じです。
ここにソースコードがあります
public E remove(int index) {
rangeCheck(index);
modCount++;
E oldValue = elementData(index);
int numMoved = size - index - 1;
if (numMoved > 0)
System.arraycopy(elementData, index+1, elementData, index,
numMoved);
elementData[--size] = null; // Let gc do its work
return oldValue;
}
Jon Skeetが答えたように、アイテムが削除されると、削除されたアイテムの次のアイテムが削除されたアイテムの場所になります。
ただし、割り当てられたメモリ空間は削除後も同じです。java.util.LinkedList は、この問題を表しています。LinkedList 内のすべてのアイテムは、動的に割り当ておよび割り当て解除されます (もちろん、GC の作業です)。
java.util.LinkedList は、舞台裏で二重にリンクされたリストを維持します。追加操作と削除操作のたびに、LinkedList が使用するメモリ領域が変更されます。アイテムが削除され、前のアイテムと次のアイテムからのアイテムへの参照が更新されます。
ソースコードは次のとおりです。
private Entry<E> entry(int index) {
if (index < 0 || index >= size)
throw new IndexOutOfBoundsException("Index: "+index+
", Size: "+size);
Entry<E> e = header;
if (index < (size >> 1)) {
for (int i = 0; i <= index; i++)
e = e.next;
} else {
for (int i = size; i > index; i--)
e = e.previous;
}
return e;
}
GC は削除されるとすぐにアイテムを収集すると思いますが、確かではありません。ただし、削除されたメモリ ロケーションは GC の候補です。オブジェクトへの参照とオブジェクト自体に注意してください。
ArrayList と LinkedList の両方が項目を削除しますが、ArrayList はオブジェクト型の参照とプリミティブ型のメモリ空間を格納します。リンク リストも参照とメモリ空間を削除します。少なくとも、参照とメモリも GC の対象になります。