この記事では、主にJava ArrayList拡張の問題の例の関連コンテンツを次のように研究しています。
まず、ArrayListの本質が実際にはオブジェクトタイプの配列であることを知る必要があります。 ArrayListの拡張問題は、実際にはこのオブジェクトタイプの配列の拡張問題です。
一時的なオブジェクト[] elementData;
ArrayListを作成するには、3つの状況があります
arrayList al = new ArrayList();
作成が完了した後、ALの容量は0です。次のコードから知ることができます。
一時的なオブジェクト[] elementData; private static final object [] DefaultCapacity_Empty_ElementData = {}; public arrayList(){this.ElementData = defaultCapacity_Empty_ElementData;}arrayList al = new ArrayList(5);
容量が5のアレイリストオブジェクトを作成することは、実際には5の長さのオブジェクトアレイです。次のコードから知ることができます。
一時的なオブジェクト[] elementData; private static final object [] DefaultCapacity_Empty_ElementData = {}; public arrayList(int initialCapacity){if(initialCapacity> 0){this.ElementData = new Object [YielthyCapacity]; } else if(initialCapacity == 0){this.ElementData = empty_ElementData; } else {throw new IllegalargumentException( "違法容量:"+ initialcapacity); }}arrayList al = new ArrayList <Integer>(arrays.Aslist(1、2、3、4、5));
ArrayListオブジェクトは上に作成され、[1,2,3,4,5]としてリストを使用して初期化されます。実際、長さ5のオブジェクト配列を作成し、配列の内容は[1、2、3、4、5]です。次のコードから知ることができます。
private int size; Transient Object [] elementData; private static final object [] DefaultCapacity_Empty_ElementData = {}; public arrayList(collection <?extends e> c){elementData = C.ToArray(); if((size = elementdata.length)!= 0){// c.toArrayは(誤って)return object [](6260652)if(elementData.getClass()!= object []。class)elementData = arrays.copyof(elementdata、size、object、class []。 } else {//空の配列に置き換えます。 this.ElementData = empty_ElementData; }}arrayList <integer> collection = new arrayList <integer>(arrays.aslist(1、2、3、4、5)); integer [] moreints = {6、7、8、9、10}; collection.addall(arrays.aslist(moreints)); 1.コンテンツ[1、2、3、4、5]を使用して、サイズ5のアレイリストを作成します。 - 初期容量は5です
2。SET{6、7、8、9、10}をこのArrayListオブジェクトに追加します。 ---現時点では、このArrayListオブジェクトの容量を拡張する必要があります。
public boolean addall(collection <?extends e> c){//挿入配列オブジェクト[] a = c.toarray() 0;} private void ensurecapacityinternal(int mincapacity){// arrayListのコンテンツが空の場合(elementData == defacterCapacity_Empty_ElementData){mincapacity = math.max(default_capacity、mincapacacity);} {modcount ++; //さらに拡張されたサイズのmincapacacityif(mincapacity -elementdata.length> 0)成長(mincapacity);} private void grow(int mincapacity){// arraylist int oldcapacity = ementsdata.length; = oldcapacity +(oldcapacity >> 1); //以前に計算された拡張長のmincapacityと比較すると、拡張長としてより大きなものを取得します(newcapacity -mincapacity <0)newcapacity = mincapacity; //拡張長が最大長より大きい場合arrays.copyof(elementdata、newcapacity);} private static int hugcapacity(int mincapacity){// mincapacityは0未満で、オーバーフローを示します。 integer.max_value:max_array_size;} 1.アレイリストの元のサイズ +挿入されるコレクションのサイズnumnew =拡張されたarrayList mincapacityの最小長さを取得
2。アレイリストの元のサイズが0、つまりアレイリストが空である場合、拡張後のアレイリストの最小長さはmincapacity = math.max(10、mincapacity)、つまり、拡張の最小長さは元の長さのサイズと挿入セットの長さだけではありません。
3.上記で得られた拡張最小長さのミンキャパシティは最終的な拡張長ではなく、さらなる計算が必要です。
(1)ArrayList OldCapacityの元のサイズを取得します
(2)新しい拡張されたサイズを取得します:NewCapacity = OldCapacity*1.5;
(3)計算された拡張された最小長さのミンキャパシティと、ここで得られた拡張サイズの新しい能力を比較し、最終的な拡張サイズとして大きいものを取ります。
上記は、この記事のArrayList拡張の問題の例のすべての詳細な説明です。私はそれがすべての人に役立つことを願っています。興味のある友人は、このサイトの他の関連トピックを引き続き参照できます。欠点がある場合は、それを指摘するためにメッセージを残してください。このサイトへのご支援をありがとうございました!