基礎となるArrayListは動的な配列を維持し、各ArrayListインスタンスには容量があります。この容量とは、リスト要素を保存するために使用される配列のサイズを指します。それは常にリストのサイズに少なくとも等しくなります。要素は常にアレイリストに追加されるため、その容量も自動的に増加します。
ArrayListは同期していません(つまり、スレッドセーフではありません)。複数のスレッドが同時にArrayListインスタンスにアクセスし、少なくとも1つのスレッドがリストを構造的に変更する場合、外部同期を維持する必要があります。マルチスレッド環境では、コレクションを使用してスレッドセーフアレイリストを宣言できます。
list arrayList = collections.synchronizedList(new ArrayList());
以下は、その原則を分析するためのArrayListのソースコードです。
1。アレイリスト構造方法: ArrayListは3つの異なる建設方法を提供します
1)arrayList()、初期容量が10の空のリストを作成します。
2)ArrayList(int initialCapacity)、指定された初期容量で空のリストを作成します。
3)arrayList(collection <?extends e> c)は、指定されたコレクションを含む要素のリストを作成します。これらは、コレクションのイテレーターがそれらを返す順序で配置されます。
ソースコードは次のとおりです。
プライベートトランジェントオブジェクト[] elementData; public arrayList(int initialCapacity){super(); if(initialcapacity <0)を新しいIllegalargumentException( "違法容量:"+ initial -capacity); this.ElementData = new Object [initialCapacity]; //オブジェクトタイプの配列を生成します10} public arrayList(){this(10); // call arraylist(int i)} <br> <br> public arrayList(collection <?extends e> c){elementData = C.ToArray(); //このコレクションのすべての要素を含む配列を返しますsize = elementData.length; // C.ToArrayは(誤って)オブジェクトを返しない可能性があります[](6260652を参照)if(elementData.getClass()!= object []。class)elementData = arrays.copyof(ementsdata、size、object []。class); //指定された配列をコピーし、同じ要素と長さを含むオブジェクトタイプの配列を返します} ArrayList()を使用してパラメーターのないコレクションオブジェクトを生成する場合、ArrayList(int initialCapacity)コンストラクターが呼び出され、長さ10のオブジェクトタイプの配列を生成します。
2。追加方法: ArrayListは、要素を追加する2つの追加メソッドを提供します
1)(e e)を追加し、指定された要素をこのリストの最後に追加します。
2)(int index、e e)を追加し、指定された要素をこのリストの指定された位置に挿入します。現在その位置(ある場合)に要素を右に移動し、すべての後続の要素(1でインデックス付け)プライベートINTサイズ。
public boolean add(e e){ensurecapacity(size + 1); //配列容量elementData [size ++] = e; // subscriptサイズのオブジェクト配列に要素Eを追加し、サイズ++を実行しますtrueを返します。 } public void add(int index、e element){if(index> size || index <0)//挿入する指定された配列添え字が配列容量を超えている場合、または指定されたサブスクリプトが0未満の場合、例外をスローします。 ensurecapacity(size+1); //配列容量System.ArrayCopy(ElementData、Index、ElementData、Index + 1、Size -Index)を展開します。 //指定されたソースアレイから配列をコピーすると、コピーは指定された位置からターゲット配列の指定された位置まで開始されます。 <br> // elementData ---ソースアレイインデックス---ソースアレイでの開始位置<br> // elementData ---ターゲット配列インデックス+1 ---ターゲット配列の開始位置<br> // size-インデックス---コピーされる配列要素の数[index] = element; //指定された配列インデックスサイズ++に追加される要素を追加します。 } public void ensurecapacity(int mincapacity){modcount ++; int oldcapacity = elementdata.length; //元の配列の容量if(mincapacity> oldcapacity){object olddata [] = elementData; int newcapacity =(oldcapacity * 3)/2 + 1; //新しい配列の容量を定義します。これは、元の配列+1の容量の1.5倍ですif(newcapacity <mincapacity)newcapacity = mincapacity; // mincapacityは通常サイズに近いため、これはwinです。 //指定された配列をコピーし、新しい配列の容量をnewcapacityとして返します}}コレクションに10を超える要素が追加されている場合、ArrayList Botom Layerは、元の配列の長さ1.5倍 + 1の新しい配列を生成し、元の配列の要素を新しい配列にコピーし、その後の追加要素が新しいアレイに配置されます。このプロセスは、新しい配列の長さが新しく追加された要素に対応できない場合に繰り返されます。これは、コレクションに要素を追加するという実装の原則です。
3。メソッドを取得:
1)(intインデックス)を取得し、このリストの指定された位置に要素を返します。
public e get(int index){rangecheck(index); //渡された指定されたインデックスが法的リターン(e)elementData [index]であるかどうかを確認します。 //配列subscript Indexで配列要素を返します} private void rangecheck(int index){if(index> = size)//着信サブスクリプトがセットの容量以上である場合、例外をスローします。 } 4。メソッドの削除:
1)e削除(intインデックス)、このリストの指定された位置の要素を削除します。後続のすべての要素を左に移動します(インデックスの減少は1による)。
2)Boolean Remot(オブジェクトO)、このリストで初めて表示される指定された要素を削除します(存在する場合)。リストにこの要素が含まれていない場合、リストは変更されず、ブール値が返されます。
public e remove(int index){rangecheck(index); //指定されたインデックスがLegal ModCount ++であるかどうかを確認します。 e oldvalue =(e)elementData [index]; //指定されたインデックスの配列要素を取得int nummoved = size -index -1; //移動する要素の数(nummoved> 0)system.arraycopy(elementdata、index+1、elementdata、index、nummoved); //配列要素elementData [ - size] = nullを移動します。 // GCにその仕事をさせてくださいoldvalueを返します。 } public boolean remove(object o){if(o == null){//渡されたパラメーターが(int index = 0; index <size; index ++)if(elementData [index] == null){// null fastremove(index); trueを返します。 }} else {for(int index = 0; index <size; index ++)if(o.equals(elementData [index])){fastRemove(index); trueを返します。 }} falseを返します。 } private void fastremove(int index){//指定された位置で要素を削除すると、実装方法は削除(int i)modcount ++に似ています。 int nummoved = size -index -1; if(nummoved> 0)System.ArrayCopy(elementData、index+1、elementData、index、nummoved); elementData [ - size] = null; // GCにその仕事をさせてください} 5。クローン方法:
1)オブジェクトクローン()は、このアレイリストインスタンスの浅いコピーを返します(これらの要素自体をコピーすることはありません)。
public object clone(){try {arraylist <e> v =(arraylist <e>)super.clone(); //オブジェクトクラスのクローンメソッドを計算して、arrayListオブジェクトv.ElementData = arrays.copyof(elementData、size)を返します。 //ターゲット配列v.modcount = 0をコピーします。 vを返します。 } catch(clonenotsuptedexception e){//これは、新しい内部侵入を投げるので、これは起こりません。 }} ArrayListのいくつかの主要なソースコードの上記の分析では、ArrayListの基礎となる実装原則がわかります。 ArrayListソースコードには、次のポイントとポイントがあります。
1)アレイリストの基礎となる層は配列に基づいて実装され、ターゲット要素は次の標準で正確に見つけることができるため、検索効率が高くなります。ただし、要素を追加または削除するには、多数の要素の位置の動きが含まれますが、これは非効率的です。
2)ArrayListは3つの異なる構造方法を提供します。パラメーターレス構造方法は、下位層でデフォルトで長さ10のオブジェクトタイプの配列を生成します。セットに追加された要素の数が10を超えると、アレイが自動的に展開します。つまり、新しい配列を生成し、元の配列の要素を新しい配列に配置します。
3)EnsureCapacityメソッドは配列を展開し、元の配列の長さ1.5倍 + 1の新しい配列を生成します。要素は常にアレイリストに追加されているため、配列の長さがニーズを満たしていない場合にプロセスを繰り返します。
上記はこの記事のすべての内容です。みんなの学習に役立つことを願っています。誰もがwulin.comをもっとサポートすることを願っています。