まず、両方のカテゴリが List インターフェイスを実装しており、List インターフェイスには ArrayList、Vector、LinkedList という 3 つの実装クラスがあることを確認してください。リストは複数の要素を格納するために使用され、要素の順序を維持でき、要素の複製が可能です。 3 つの特定の実装クラスの関連する違いは次のとおりです。
ArrayList は、最も一般的に使用される List 実装クラスであり、配列を通じて内部的に実装され、要素への高速なランダム アクセスが可能になります。配列の欠点は、各要素間にギャップを設けることができないことです。配列のサイズが満たされない場合、記憶容量を増やす必要があり、既存の配列のデータを新しい記憶領域にコピーする必要があります。 ArrayList の途中で要素を挿入または削除する場合は、配列をコピーして移動する必要があり、比較的コストがかかります。したがって、ランダムな検索や走査には適していますが、挿入や削除には適していません。
Vector も ArrayList と同様に配列を通じて実装されますが、違いはスレッド同期をサポートしていることです。つまり、同時に 1 つのスレッドが Vector に書き込むことができ、複数のスレッドが同時に書き込むことによって生じる不一致を回避できます。 、同期を達成するのに多くの時間がかかるため、ArrayList にアクセスするよりも時間がかかります。
LinkedList はリンクされたリスト構造を使用してデータを保存します。これは、データの動的な挿入と削除に非常に適しており、比較的低速です。さらに、List インターフェイスで定義されていないメソッドも提供します。これらは、特にリストの先頭要素と末尾要素を操作するために使用され、スタック、キュー、および双方向キューとして使用できます。
Java ソースコードを見ると、配列のサイズが十分でない場合は、配列を再作成してから、ArrayList と の拡張配列のサイズを新しい配列にコピーする必要があることがわかりました。ベクトルが違います。
ArrayList内:
public boolean add(E e) { ensureCapacity(size + 1); // 增加元素,判断是否能够容纳。不能的话就要新建数组 elementData[size++] = e; return true; } 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); } }
Vector内:
private void ensureCapacityHelper(int minCapacity) { int oldCapacity = elementData.length; if (minCapacity > oldCapacity) { Object[] oldData = elementData; int newCapacity = (capacityIncrement > 0) ? (oldCapacity + capacityIncrement) : (oldCapacity * 2); if (newCapacity < minCapacity) { newCapacity = minCapacity; } elementData = Arrays.copyOf(elementData, newCapacity); } }
ArrayListとVectorの違いは以下の通りです:
ArrayListはメモリ不足時にデフォルトで50%+1倍に拡張し、Vectorはデフォルトで1倍に拡張します。
Vector は、indexOf(obj, start) インターフェイスを提供しますが、ArrayList は提供しません。
Vector はスレッド セーフですが、スレッド セーフにはより大きなシステム オーバーヘッドが必要となるため、Vector はほとんどの場合使用されません。