JavaにおけるVectorとArrayListの違いの詳細

2550 ワード

まず、この2つのクラスがリストインタフェースを実装しているのを見てみましょう.リストインタフェースには、ArrayList、Vector、LinkedListの3つの実装クラスがあります.Listは、複数の要素を格納するために使用され、要素の順序を維持し、要素の重複を許可することができる.
3つの具体的な実装クラスの違いは以下の通りです.
1.ArrayListは最も一般的なList実装クラスであり、内部は配列によって実装され、要素への高速ランダムアクセスを可能にする.配列の欠点は、各要素間に間隔を置くことができず、配列サイズが満たされていない場合に記憶能力を増加させる必要があることであり、すでに配列されているデータを新しい記憶空間にコピーすることである.ArrayListの中間位置から要素を挿入または削除する場合、配列のコピー、移動、コストが比較的高い必要があります.したがって、ランダムな検索と遍歴に適しており、挿入と削除には適していません.
2.VectorはArrayListと同様に配列によって実現されるが、異なるのはスレッドの同期をサポートすることである.すなわち、ある時点で1つのスレッドだけがVectorを書くことができ、マルチスレッド同時書きによる不一致性を回避するが、同期を実現するには高い費用がかかるため、ArrayListへのアクセスよりも遅い.
3.LinkedListはチェーンテーブル構造でデータを格納しており、データの動的挿入と削除に適しており、ランダムアクセスと遍歴速度が遅い.また、リストインタフェースに定義されていない方法を提供し、スタック、キュー、双方向キューとして使用できるように、ヘッダおよびテーブルテール要素を操作するために特化しています.
Javaソースコードを見ると、配列のサイズが足りない場合、配列を再構築し、要素を新しい配列にコピーする必要があることがわかります.ArrayListとVectorの拡張配列のサイズが異なります.
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倍拡張します.
2.VectorはindexOf(obj,start)インタフェースを提供し、ArrayListはありません.
3.Vectorはスレッドセキュリティレベルに属しますが、ほとんどの場合、Vectorは使用されません.スレッドセキュリティにはより大きなシステムオーバーヘッドが必要です.