Java VectorとArrayListの比較
今日、私はベクターとアレイリストのソースコードを研究し、これら2つのクラスの理解を深めました。
リストインターフェイスには、ArrayList、Vector、およびLinkedListの3つのクラスが実装されています。 LinkedListについてはあまり言いません。通常、データの挿入の順序を維持するために使用されます。
ArrayListとVectorはどちらも配列を使用して実装されており、3つの主な違いがあります。
1.ベクトルはマルチスレッドで安全ですが、アレイリストはそうではありません。これはソースコードから見ることができます。ベクトルクラスの多くの方法は同期によって変更され、アレイリストと比較できないベクトルの効率につながります。
2。どちらも線形連続空間ストレージ要素を使用しますが、スペースが不十分な場合、2つのクラスが異なる方法で追加されます。多くのネチズンは、ベクターが元のスペースを2倍にし、アレイリストは元のスペースを50%増加させると言います。実際、これはほぼ同じです。ただし、ソースコードから見ることができるいくつかの問題がまだいくつかあり、後でソースコードから分析されます。
3.ベクターは成長因子を設定できますが、ArrayListはできません。私が最初にこれを見たとき、私は増分係数が何であるかを理解していませんでした。ただし、2つのソースコードを比較することでこれを理解しました。まず、2つのクラスの建設方法を見てみましょう。
ArrayListには3つの構造方法があります。
public arrayList(int initialCapacity)//指定された初期容量で空のリストを作成します。 Public ArrayList()// 10の初期容量で空のリストを作成します。パブリックアレイリスト(コレクション<?e> c)
Vectorには4つのコンストラクターがあります。
public vector()//指定された初期容量と容量増分をゼロに等しく使用して空のベクトルを構築します。 public vector(int initialcapacity)//空のベクトルを構築して、内部データアレイのサイズを作成し、標準容量の増分はゼロです。パブリックベクトル(collection <?extends e> c)//指定されたコレクションパブリックベクトル(int initialcapacity、int capatiouncrement)にベクトルを構築する要素を構築します//指定された初期容量と容量の増分を使用して空のベクトルを構築します
Vectorには、ArrayListよりも1つの構造方法があります。そうです、パブリックベクトルの構築方法(int initial -capacity、int capationalcrement)。容量摂取量は容量の成長であり、これは上記の成長因子であり、ArrayListでは利用できません。
次に、2つのクラスを投稿してソースコード分析(JDK1.7バージョン)を追加します。
// arrayListクラスソースコードの追加:public boolean add(e e){ensurecapacityinternal(size + 1); // increments modcount !! elementData [size ++] = e; trueを返します。 } private void ensurecapacityinternal(int mincapacity){modcount ++; //オーバーフロー - 意識コード//要素を追加した後、新しいコンテナのサイズがコンテナの容量よりも大きい場合、値は保存できません。 (mincapacity -elementdata.length> 0)成長する場合、スペースを拡張する必要があります(mincapacity); } private void grow(int mincapacity){//オーバーフロー - 意識コードint oldcapacity = elementdata.length; int newcapacity = oldcapacity +(oldcapacity >> 1); //拡張スペースは50%増加します(つまり、元の1.5倍)if(newcapacity -mincapacity <0)//拡張後もコンテナがまだ不十分な場合は、mincapacityをコンテナnewcapacity = mincapacacityのサイズに設定するだけです。 if(newcapacity -max_array_size> 0)//拡張コンテナが大きすぎる場合、hugecapacity newcapacity = hugecapacity(mincapacity)を実行します。 // mincapacityは通常サイズに近いため、これはwinです。 }ベクトルクラスにソースコードを追加します:
パブリックシンクロナイズドブールアディング(e){modcount ++; EnsureCapacityHelper(elementCount + 1); elementData [ementscount ++] = e; trueを返します。 } private void ensurecapacityhelper(int mincapacity){//オーバーフロー - 意識コードif(mincapacity -elementdata.length> 0)成長(mincapacity); } private void grow(int mincapacity){//オーバーフロー - 意識コードint oldcapacity = elementdata.length; int newcapacity = oldcapacity +((caputerincrement> 0)?caputerincrement:oldcapacity); /**この容量の拡張には判断が必要です。容量の増分が0で初期化されない場合、つまりパブリックベクトル(int initial -capacity、int capativeincrement)コンストラクターの初期化、容量の拡張容量は(oldcapacity+capationalincrement)であり、これは元の容量と容量の増分です。容量の増分が設定されていない場合、拡張後の容量は(OldCapacity+OldCapacity)であり、これは元の容量の2倍です。 **/ if(newcapacity -mincapacity <0)newcapacity = mincapacity; if(newcapacity -max_array_size> 0)newcapacity = hugecapacity(mincapacity); elementData = arrays.copyof(elementData、newCapacity); }分析を通じて、それは今理解できるはずです!
読んでくれてありがとう、私はそれがあなたを助けることができることを願っています。このサイトへのご支援ありがとうございます!