arrayList
基礎となる実装は、要素へのアクセスに高い効率を持つ配列です(高速クエリ、ゆっくりと挿入、変更、要素の削除)
LinkedListと比較して、効率的ですが、スレッドセーフです。
ArrayList配列は、NULLを含むすべての要素にアクセスできる可変配列です
基礎となる実装は、配列を使用して行われます
一時的なオブジェクト[] elementData;
建設方法
private static final int default_capacity = 10; private static final object [] empty_elementdata = {}; private static final object [] defaultcapacity_empty_elementdata = {}; transient object [] elementdata; private int size; //空のリストを作成しますpublic arrayList(){this.ElementData = defaultCapacity_Empty_ElementData; } //指定された初期容量の空のリストを作成しますpublicArrayList(int initialCapacity){if(initialCapacity> 0){this.ElementData = new Object [initialCapacity]; } else if(initialCapacity == 0){this.ElementData = empty_ElementData; } else {throw new IllegalargumentException( "違法容量:"+ initialcapacity); }} //接続要素の反復リターンの順序で配置された指定されたコレクション要素のリストを作成しますパブリックアレイリスト(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; }}ストレージ
//リストの指定された位置の要素は要素に置き換えられ、その位置の元の要素はpublic e set(int index、e element){rangecheck(index); //配列容量を確認し、スロー:indexoutofofboundsexception e oldvalue = elementData(index); elementData [index] = element; OldValueを返します。 } //リストの最後に指定された要素を追加しますパブリックブールアンド(e e){ensurecapacityinternal(size + 1); //配列拡張elementData [size ++] = e; trueを返します。 } //リストの指定された位置に要素を追加しますパブリックブールアンド(e e){ensurecapacityinternal(size ++] = e; return true;} //リストの指定された位置public void add(int index、e element){rangecheckforadd(index); ensurecapacacityinternal(size arements+1); / / srced modcount+1/ srement SRCPRO:ソースアレイの開始//宛先アレイ、ターゲットアレイの開始:コピーするアレイの数は、この位置にあるすべての要素を1つの位置に戻しますリストの最後にある要素は、接続の順序でパブリックブールアダル(e> c){] elementData、numNew); Insternal(nummoved = nummoved> 0)system(nummoved、numnew)読む
//このリストの指定された位置で要素を削除しますpublic e remove(int index){rangecheck(index); modcount ++; e oldvalue = elementData(index); int nummoved = size -index -1; if(nummoved> 0)System.ArrayCopy(elementData、index+1、elementData、index、nummoved); elementData [ - size] = null; // gcに作業を行わせるようにクリアしますoldvalueを返します。 } //このリストの要素を削除しますpublic boolean remove(object o){if(o == null){for(int index = 0; index <size; index ++)if(elementData [index] == 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){modcount ++; int nummoved = size -index -1; if(nummoved> 0)System.ArrayCopy(elementData、index+1、elementData、index、nummoved); elementData [ - size] = null; // gcにその仕事をさせるためにクリア}配列拡張
要素が配列に追加されるたびに、要素の数が要素を追加した後の現在の配列の長さを超えるかどうかを確認する必要があります。長さを超えると、データの追加ニーズを満たすために配列が拡張されます。
public void ensurecapacity(int mincapacity){int minexpand =(elementData!= defaultCapacity_Empty_ElementData)? 0:default_capacity; if(mincapacity> minexpand){suresexplicitcapacity(mincapacity); }} private void ensurecapacityinternal(int mincapacity){if(elementData == DefaultCapacity_Empty_ElementData){MinCapacity = Math.Max(Default_Capacity、MinCapacity); } suresexplicitcapacity(mincapacity); } private void suresexplicitcapacity(int mincapacity){modcount ++; //オーバーフロー - 意識コードif(mincapacity -elementdata.length> 0)grow(mincapacity); } private void grow(int mincapacity){//オーバーフロー - 意識コードint oldcapacity = elementdata.length; int newcapacity = oldcapacity +(oldcapacity >> 1); if(newcapacity -mincapacity <0)newcapacity = mincapacity; if(newcapacity -max_array_size> 0)newcapacity = hugecapacity(mincapacity); // mincapacityは通常サイズに近いため、これはwinです。 } private static int hugecapacity(int mincapacity){if(mincapacity <0)//オーバーフロー新しいoutofmemoryerror(); return(mincapacity> max_array_size)? integer.max_value:max_array_size; }手書きアレイリスト
Public Class MyArrayList /*List list <e>* /{private Transient Object [] elementData;プライベートINTサイズ。 //要素の数public myArrayList(){this(10); } public MyArrayList(int initialCapacity){if(initialCapacity <0){try {throw new Exception(); } catch(Exception e){e.printstacktrace(); }} elementData = new object [InitialCapacity]; } public int size(){return size; } public boolean isempty(){return size == 0; } //インデックスに従ってオブジェクトを削除するpublic void remove(int index)throws exception {rangecheck(index); int nummoved = size-index-1; if(nummoved> 0){System.ArrayCopy(elementData、index+1、elementData、index、nummoved); } elementData [ - size] = null; } //オブジェクトを削除しますpublic boolean remove(オブジェクトobj)を除去します{for(int i = 0; i <size; i ++){if(get(i).equals(obj)){remove(i); } trueを返します。 } trueを返します。 } //要素の変更パブリックオブジェクトセット(int index、object obj)スロー例外{rangecheck(index);オブジェクトoldvalue = elementData [index]; elementData [index] = obj; OldValueを返します。 } //指定された位置に要素を挿入public void add(int index、object obj)スロー例外{rangecheck(index); EnsureCapacity(); System.ArrayCopy(ElementData、Index、ElementData、Index+1、Size-Index); elementData [index] = obj;サイズ++; } public void add(object object){ensurecapacity(); /*elementData [size] = object; size ++;*/ elementData [size ++] = object; //最初に値を割り当ててから、自分自身を増やします} public Object get(int index)throws exception {rangecheck(index); return elementData [index]; } public void rangeCheck(int index)スロー例外{if(index <0 || index> = size){throw new Exception(); }} // public void ensureCapacity(){//配列拡張とコンテンツコピーif(size == elementData.length){// elementData = new Object [size*2+1];このように書き込み、元の配列のコンテンツは失われたオブジェクト[] newArray = newオブジェクト[サイズ*2+1]; //配列のコンテンツをコピー/*for(int i = 0; i <newArray.length; i ++){newArray [i] = elementData [i]; }*/ System.ArrayCopy(elementData、0、newArray、0、elementData.length); elementData = newArray; }} // public static void main(string [] args){myArrayList myArrayList = new MyArrayList(3); myarraylist.add( "111"); myarraylist.add( "222"); myarraylist.add( "333"); myarraylist.add( "444"); myarraylist.add( "555"); try {myarraylist.remove(2); myarraylist.add(3、 "new Value"); myArrayList.set(1、 "Modify"); } catch(例外E1){// todo auto-enerated catch block e1.printstacktrace(); } system.out.println(myarraylist.size()); for(int i = 0; i <myarraylist.size(); i ++){try {system.out.println(myarraylist.get(i)); } catch(Exception e){e.printstacktrace(); }}}}