arrayListの概要:
ArrayListはアレイに基づいて実装され、容量が自動的に成長できる動的配列であり、C言語の動的アプリケーションメモリと同様に、メモリを動的に増加させます。
ArrayListはスレッドセーフではなく、単一スレッド環境でのみ使用できます。マルチスレッド環境では、collections.synchronizedList(list l)関数を使用して、スレッドセーフアレイリストクラスを返すことを検討することも、並行パッケージでCopyonWritearraylistクラスを使用することもできます。
ArrayListはシリアル化可能なインターフェイスを実装するため、シリアル化をサポートし、シリアル化を介して送信し、ランダムアクセスインターフェイスを実装し、高速のランダムアクセスをサポートできます。実際、サブスクリプトのシリアル番号を介して迅速にアクセスし、クローン可能なインターフェイスを実装し、クローン化できます。
各ArrayListインスタンスには容量があり、リスト要素を保存するために使用される配列のサイズを指します。それは常にリストのサイズに少なくとも等しくなります。要素は常にアレイリストに追加されるため、その容量も自動的に増加します。自動成長は、新しい配列にデータの反論をもたらすため、データの量を予測できる場合は、配列リストを構築するときにその容量を指定できます。多数の要素を追加する前に、アプリケーションはEnsureCapacity操作を使用してArrayListインスタンスの容量を増やすこともできます。
この実装は同期していないことに注意してください。複数のスレッドが同時にArrayListインスタンスにアクセスし、少なくとも1つのスレッドがリストを構造的に変更する場合、外部的に同期したままでなければなりません。
Java ArrayListのレコードと要約を作成しましょう
public class arrayList <e> { / ***コレクションを保存する要素** / private transientオブジェクト[] elementData; / **要素サイズ*/プライベートINTサイズ。コレクション内の要素の数を記録するための一般的なクラス、オブジェクトの配列、プライベート変数を定義します。元のテキストには追加のプライベート変数があり、何を使用するかわかりません。著者は説明も言及もありません。使用しなければ大丈夫です。
/ ** *指定されたサイズに従って初期化 * @param initialCapacity */ public arrayList(int initialCapacity){super(); if(initialcapacity <= 0){//例外新しいIllegalargumentException( "初期化パラメーターは0より少ない"); } else {//配列を初期化this.elementData = new Object [initialCapacity]; }} / ***デフォルト初期化* / public arrayList(){this(10); } /***コレクションクラスに従って初期化* @param cコレクションインターフェイスを継承する必要があるクラス* /public arrayList(collection <?extends e> c){// elementData = c.toarray(); size = elementdata.length; //オブジェクトタイプを変換するif(elementData.getClass()!= object []。class){elementData = arrays.copyof(elementData、size、object []。class); }} 3初期化方法、デフォルトのサイズに従って配列を初期化し、指定されたサイズを初期化し、コンバージョン割り当ての初期化のためにコレクションコレクションインターフェイスを継承するクラスを渡す
/ ***拡張コレクション* @param mincapacity*/ public void ensurecapacity(int mincapacity){/ ** arrayの現在のサイズ*/ int oldcapacity = elementdata.length; if(mincapacity> oldcapacity){ /*** oldDataは使用されていませんが、これはメモリ管理とarrays.copyof()メソッドはスレッドセーフではありません* oldDataは、IFのライフサイクル中にelementData変数を指します。メモリelementDataメモリを侵入することから割り当てる。 *終了が終了すると、OldDataサイクルが終了してリサイクルされます*/ Object OldData [] = ElementData; int newcapacity =(oldcapacity * 3)/2 + 1; // 50%+1を増やしてくださいif(newcapacity <mincapacity)newcapacity = mincapacity; // arrays.copyofを使用してコレクションの要素をコピーし、新しい配列elementdata = arrays.copyof、newcapacity)を生成します。 }}これはコア方法です。セットの拡張は、実際にアレイの拡張とMincapacityコレクションのサイズを比較して、拡張する必要があるかどうかを判断することです。 arrays.copyof()メソッドは拡張に使用されます。
元のテキストには詳細な説明があります。このメソッドは、最初のパラメーターのコンテンツを新しい配列にコピーします。配列のサイズは2番目のパラメーターであり、新しい配列を返します。 OldDataの変数に関する詳細なコメントがあります。
/ ***インデックスが範囲外であるかどうかを確認* @param index*/ private void rangecheck(int index){if(index> size || index <0){throw new indexoutofboundsexception( "indicator ribss、index:" + index + "、size:" + size); }}添え字検索が1 /**かどうか
*要素の追加*指定された要素をコレクションの最後に追加* @param e追加要素* @return*/ public boolean add(e e){ensurecapacity(size+1); elementData [size] = e;サイズ++; trueを返します。 }要素を追加し、最初に容量を展開し、値を割り当ててから、要素を追加します。サイズ+1のフィールドサイズは追加されていないことに注意してください。これが算術操作ですので、後で増やす必要があります。
/ **要素の追加*指定された位置に要素を追加* @paramインデックス指定インデックスインデックスインデックス要素* @param要素* @return*/ public boolean add(int index、e element){rangecheck(index); ensurecapacity(size+1); // indexの位置から始まる要素要素サイズインデックスの長さ、// index+1としてインデックス位置から始まる新しいElementDataアレイへのコピー。 //これは、現在この位置にある要素と、すべての後続の要素が1つの位置で右に移動されることを意味します。 System.ArrayCopy(ElementData、Index、ElementData、Index+1、Size-Index); elementData [index] = element; size ++; //要素1を追加しますtrue; }ここでの違いは、System.ArrayCopy(ElementData、Index、ElementData、Index+1、Size-Index)です。
これはcの内部方法です。詳細なオリジナルのテキストには説明があるので、ここでは話しません。これはまた、ArrayList全体のコアであり、arrays.copyof()の内部実装原則でもあります。
/***すべての要素を追加*指定されたコレクションのiteratorによって返される要素の順序で、このリストの最後にコレクション内のすべての要素を追加します。 * @param c * @return */ public boolean addall(collection <?extends e> c){object [] newElement = c.toarray(); int elementlength = newElement.length; EnsureCapacity(size+elementlength); // newElement 0のサブスクリプト、ElementLength Elements、ElementDataサイズ添えsystem.ArrayCopy(newElement、0、elementData、size、elementLength); size+= elementlength; return elementlength!= 0; }基本的に、他のメソッドは、インターフェイスを介してデータオブジェクトを渡したり、拡張のために長さを取得したり、システムとArrayCopyを使用して新しい配列にデータをコピーするなど、異なる状況に応じて異なる処理を実行します。
/ ***すべての要素を追加し、すべての要素を追加* @paramインデックス挿入ポジションインデックス* @param c挿入要素コレクション*/ public boolean addall(int index、collection <?extends e> c){if(index> size || index <0){throw new indexoutofboundsexception( "index:" + "、size:" + size: " + size); } object [] newElement = C.ToArray(); int elementlength = newElement.length; EnsureCapacity(size+elementlength); int nummoved = size-index; //挿入位置が配列の中央にあるかどうかを判断します(nummoved> 0){//インデックス挿入位置の背後にあるすべての要素を後方に移動します} // newElementのElementLengthを0からElementDataインデックスがSystem.ArrayCopy(newElement、0、ElementData、index、ementLength)を開始する位置に追加する; size += elementlength; return elementlength!= 0; } / ** * indexの値を指定 * @param index * @param element * @return * / public e set(int index、e element){rangecheck(index); e oldelement =(e)elementData [index]; elementData [index] = element; oldelementを返します。 } / ** * indexに基づいて値を取得 * @param index * @return * / public e get(int index){rangecheck(index); return(e)elementData [index]; } / *** subscriptに従って要素を削除* @param index* / public e remove(int index){rangecheck(index); e oldelement =(e)elementData [index]; / **削除された添え字の後の要素の数*/ int nummoved = size-index-1; //アレイ範囲内で移動する場合(nummoved> 0)system.arraycopy(elementData、index+1、elementData、index、nummoved); // elementData [ - size] = nullを削除します。 oldelementを返します。 } /** *要素に従って削除 * @param obj * @return * /public boolean remove(Object obj){// arrayListはnullを許可するため、(obj == null){(int index = 0; index <size; index ++){if(elementdata [index] = null){removed){for(index ++){for(index ++){for(index ++){if(ementdata [index] = null)も実行する必要があります。 trueを返します。 }}} else {for(int index = 0; index <size; index ++){if(obj.equals(elementData [index])){remover(index); trueを返します。 }}} falseを返します。 } / *** subscriptに従って指定された範囲の要素を削除* @param fromindex start* @param toindex* / protected void removerange(int fromindex、int toindex){rangecheck(fromindex); RangeCheck(toindex); //移動する要素の数int nummoved = size -toindex; // fromindex system.arraycopy(elementdata、toindex、elementdata、fromindex、nummoved)にindexに要素を移動します。 //削除される要素の数int newsize = size-(toindex-fromindex); while(size!= newsize){elementData [-size] = null; }} / ***配列容量を実際の容量に調整* / public void trimtosize(){int length = ementdata.length; if(size <leng){object [] old = elementData; elementData = arrays.copyof(elementData、size); }} / ***コレクション要素を配列に変換* @return* / public object [] toarray(){return arrays.copyof(elementData、size); } public <t> t [] toarray(t [] a){if(a.length <size){return(t [])arrays.copyof(elementdata、size、a.getclass()); } //コレクション要素を配列asystem.arraycopy(elementdata、0、a、0、size)にコピーします。 if(a.length> size){for(int index = size; index <a.length; index ++){a [index] = null; }} return a; }基本的に、それはすべてアレイを操作し、Cメソッドを使用して値を割り当てて移動することです。元のテキストを詳細に表示できます。プライベート変数を除いて、元のテキストには多くの問題はありません。コードは完全に実行できます。これの難しさと拡張方法でのOldData変数の使用は、システムの2つの方法、ArrayCopyとArrayist.Copy()と、拡張方法でのOldData変数の使用です。この変数は本当に良いです。最初は、なぜこのように使用したのかわかりませんでした。元のテキストの最後に説明します。
上記は、編集者が紹介したJava ArrayListの実装の例です。それがあなたに役立つことを願っています。ご不明な点がございましたら、メッセージを残してください。編集者はあなたに時間内に返信します。 Wulin Network Webサイトへのサポートに感謝します!