JavaにおけるVectorとArayListの違い

2909 ワード

回転:
http://www.cnblogs.com/wanlipeng/archive/2010/10/21/1857791.html
  まず、これらの2つのタイプがListインターフェースを実現しますが、Listインターフェースは全部で三つの実現クラスがあります.それぞれはArayList、Vector、LinkdListです.Listは、複数の要素を格納するために使用され、要素の順序を維持し、要素の繰り返しを許可する.3つの具体的な実現類に関する違いは以下の通りです.
1.ArayListは、最も一般的なListインプリメンテーションクラスであり、内部は配列によって実現され、要素の高速ランダムアクセスを可能にする.配列の欠点は、各要素の間に間隔がないことであり、配列サイズが満たされていない場合は記憶能力を増加させる必要があり、配列がすでにあるデータを新しい記憶空間にコピーするということである.ArayListの中間位置から要素を挿入または削除する場合、配列をコピー、移動、価格が高い必要があります.したがって、ランダム検索と巡回に適しています.挿入と削除には適していません.
2.VectorはArayListと同様に、配列によって実現されるものであり、異なるのはスレッドの同期をサポートするものであり、ある時点で1スレッドだけがVectorを書くことができ、マルチスレッドの同時書き込みによる不一致を回避するが、同期を実現するには高い費用が必要であるため、ArayListにアクセスするより遅い.
3.LinkdListはチェーン構造でデータを格納し、データの動的挿入と削除に適しています.ランダムアクセスとエルゴード速度は比較的遅いです.また、彼はまた、Listインターフェースに定義されていない方法を提供し、特に、ヘッダと表尾要素を操作するために、スタック、キューと双方向キューとして使用することができる.
--------------------------------------------------------------
     Javaソースコードを調べてみると、配列のサイズが足りない場合は、配列を再構築し、要素を新たな配列にコピーする必要があり、ArayListとVectorの拡張配列のサイズが異なることがわかった.
ArayListでは、

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);
 
     }
 
 }
ArayListとVectorの違いは以下の通りです.
1.ArayListはメモリが足りない時はデフォルトで50%+1個拡張し、Vectorはデフォルトで1倍拡張します.
2.VectorはindexOfインターフェースを提供していますが、ArayListはありません.
3.Vectorはスレッドセキュリティレベルですが、ほとんどの場合はVectorを使用しません.スレッドセキュリティはより大きなシステムオーバーヘッドが必要です.