System.Collections.ArrayListクラスは特別な配列です。要素を追加および削除することにより、配列の長さを動的に変更できます。
1つ。アドバンテージ
1。自動サイズの変更関数をサポートします
2。要素の柔軟な挿入
3。要素の柔軟な削除
二。制限
通常のアレイと比較して、速度はわずかに悪化します
三つ。要素を追加します
1。publicVirtualIntadd(objectValue);
ArrayListの最後にオブジェクトを追加します
ArrayList Alist = new ArrayList(); Alist.Add( "a"); alist.add( "b"); alist.add( "c"); alist.add( "d"); alist.add( "e");
コンテンツはです
ABCDE
2。publicVirtualVoidInsert(intindex、objectValue);
ArrayListの指定されたインデックスに要素を挿入します
ArrayList Alist = new ArrayList(); Alist.Add( "a"); alist.add( "b"); alist.add( "c"); alist.add( "d"); alist.add( "e"); alist.insert(0、 "aa");
結果は次のとおりです
aaabcde
3。PublicVirtualVoidInserTrange(intindex、icollectionc);
コレクションの要素をアレイリストの指定されたインデックスに挿入します
ArrayList Alist = new ArrayList(); Alist.Add( "a"); alist.add( "b"); alist.add( "c"); alist.add( "d"); alist.add( "e"); arraylist list2 = newArrayList(); list2.add( "tt"); list2.add( "ttt"); alist.insertrange(2、list2);
結果は次のとおりです
abtttttcde
4。消去
1。PublicVirtualVoidRemove(objectObj);
アレイリストから特定のオブジェクトの最初の一致を削除し、最初のオブジェクトであることに注意してください
ArrayList Alist = new ArrayList(); Alist.Add( "a"); alist.add( "b"); alist.add( "c"); alist.add( "d"); alist.add( "e"); alist.remove( "a");
結果は次のとおりです
bcde
2。PublicVirtualVoidRemoveat(intindex);
ArrayListの指定されたインデックスで要素を削除します
alist.add( "a"); alist.add( "b"); alist.add( "c"); alist.add( "d"); alist.add( "e"); alist.removeat(0);
結果は次のとおりです
bcde
3。PublicVirtualVoidRemoverange(intindex、intcount);
ArrayListからさまざまな要素を削除します。インデックスはインデックスを表し、カウントはインデックスから始まる数を表します
alist.add( "a"); alist.add( "b"); alist.add( "c"); alist.add( "d"); alist.add( "e"); alist.removerange(1,3);
結果は次のとおりです
次のようにコードをコピーします:ae
4。publicVirtualVoidClear();
ArrayListからすべての要素を削除します。
五。選別
1.publicvirtualvoidsort();
ArrayListまたはその一部の要素をソートします。
ArrayListalist = newArrayList(); alist.add( "e"); alist.add( "a"); alist.add( "b"); alist.add.add( "c"); alist.add( "d"); dropdownlist1.datasource = alist;
結果は次のとおりです
EABCD
ArrayListalist = newArrayList(); alist.add( "a"); alist.add( "b"); alist.add( "c"); alist.add( "d"); alist.add( "e"); alist.sort(); //並べ替えdropdownlist1.datasource = alist; // dropdownlistdropdownlist1; dropdownlist1.databind();
結果は次のとおりです
ABCDE
2.PublicVirtualVoidReverse();
ArrayListまたはその一部の要素の順序を逆転させます。
ArrayListalist = newArrayList(); alist.add( "a"); alist.add( "b"); alist.add( "c"); alist.add( "d"); alist.add( "e"); alist.reverse(); // revers dropdownlist1.datasource = alist; // dropdownlistdropdownlist1; dropdownlist1.databind();
結果は次のとおりです
EDCBA
六。探す
1.publicvirtualintindexof(object);
2.publicvirtualintindexof(object、int);
3.PublicVirtualIntIndexof(object、int、int);
アレイリストまたはその一部の最初の一致のゼロベースのインデックスを返します。リターン-1は見つかりませんでした。
ArrayList Alist = new ArrayList(); alist.add( "a"); alist.add( "b"); alist.add( "c"); alist.add( "d"); alist.add( "e"); intnindex = alist.indexof( "a"); // 1 nindex = alist.indexof( "p"); // not not見つかり、-1
4.PublicVirtualIntLastIndExof(object);
5.PublicVirtualIntLastIndExof(object、int);
6.PublicVirtualIntLastIndExof(object、int、int);
アレイリストまたはその一部の最後の一致のゼロベースのインデックスを返します。
ArrayList Alist = new ArrayList(); alist.add( "a"); alist.add( "b"); alist.add( "a"); // 0 alist.add( "d"); alist.add( "e"); intnindex = alist.lastindexof( "a"); //値は0ではなく2です
7.publicvirtualboolcontains(objectem);
要素がアレイリストにあるかどうかを判断します。含まれている場合はtrueを返し、それ以外の場合はfalseを返します
セブン。他の
1。publicVirtualIntCapacity {get; set;}
ArrayListが含めることができる要素の数を取得または設定します。
2。publicVirtualIntCount {get;}
ArrayListに実際に含まれる要素の数を取得します。
容量は、ArrayListが保存できる要素の数です。カウントは、ArrayListに実際に含まれる要素の数です。容量は常にカウント以上です。要素を追加するときにカウントが容量を超えると、内部配列を自動的に再割り当てすることにより、リストの容量が2倍になります。
容量値が明示的に設定されている場合、指定された容量に対応するために内部配列も再割り当てする必要があります。容量が明示的に0に設定されている場合、共通言語のランタイムはそれをデフォルト容量に設定します。デフォルト容量は16です。
Clearを呼び出した後、Countは0であり、この時点で容量削減はデフォルト容量16ではなく16のデフォルト容量です
3。publicVirtualVoidTrimTosize();
ArrayListの実際の要素数に容量を設定します。
リストに新しい要素を追加しない場合、このメソッドを使用して、リストのメモリシステムのオーバーヘッドを最小限に抑えることができます。
リスト内のすべての要素を完全にクリアするには、TrimTosizeを呼び出す前にクリアメソッドを呼び出します。空の配列を切断すると、ゼロではなく、アレイリストの容量がデフォルトの容量に設定されます。
ArrayList Alist = new ArrayList(); Alist.Add( "a"); alist.add( "b"); alist.add( "c"); alist.add.add( "d"); alist.add( "e"); // count = 5、容量= 16、alist.trimtosize(); // count = 5;
8。ソースコード分析
リストインターフェイスの実装クラスは、配列を内部的に使用して要素値を保存します。これは、可変サイズの配列に相当します。
1。署名
Public Class ArrayList <e> extends AbstractList <e> expments List <e>、andomaccess、clononable、serializable
ArrayListがAbstractList Abstractクラスを継承していることがわかります。これにより、リストインターフェイスのほとんどの方法が実装されています。不変のリストを実装する場合は、このクラスを継承して、GET(INT)およびサイズのメソッドを実装してください。可変リストを実装する場合は、セットをオーバーライドする必要があります(int、e)。さらに、リストのサイズが可変の場合、追加(int、e)およびremove()メソッドもオーバーライドする必要があります。
2。コンストラクター
ArrayListは3つのコンストラクターに提供されます。
arrayList()arrayList(collection <?extends e> c)arrayList(int initialCapacity)
各コレクションクラスが2つの「標準」コンストラクターを提供する必要があるコレクションインターフェイス慣習は、パラメーターのないコンストラクター(上記の最初のコンストラクター)、もう1つは単一のパラメーターを持つコンストラクター(上記の2番目のコンストラクター)です。 ArrayListは、Arrayliの初期サイズを設定するためのINT値を受け入れる3番目のコンストラクターも提供します(デフォルトサイズは10)。
3。関連方法
trimtosizepublic void trimtosize(){modcount ++; int oldcapacity = elementdata.length; if(size <oldcapacity){elementData = arrays.copyof(elementData、size); }}ArrayListの容量を現在の実際のサイズに減らし、ストレージ容量を減らすために使用されます。変数ModCountはAbstractListから継承され、リストが構造的に変更される回数を記録します。 ArrayListの要素は、実際にはelementDataに保存されます。これは、次のように宣言されています。変数サイズは、ArrayListの要素の数です。 size <oldcapacityの場合、arrays.copyofメソッドを呼び出して削減を達成します。
4.indexofおよびlasindexof
public int indexof(object o){if(o == null){for(int i = 0; i <size; i ++)if(elementData [i] == null)return i; } else {for(int i = 0; i <size; i ++)if(o.equals(elementData [i]))return i; } return -1; }これらの2つの方法は、指定された要素の添え字を返し、パラメーターがnullであるかどうかを区別したいと思います。 LastIndexofはIndexofに似ていますが、後ろから前に検索します。
5。surecapacity
public void ensurecapacity(int mincapacity){if(mincapacity> 0)ensurecapacityinternal(mincapacity); } private void ensurecapacityinternal(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です。 }このメソッドは、アレイリストのサイズを保証します
6.addとaddall
public void add(int index、e element){rangecheckforadd(index); ensurecapacityinternal(size + 1); // increments modcount !! System.ArrayCopy(ElementData、Index、ElementData、Index + 1、Size -Index); elementData [index] = element;サイズ++; } (int index、e要素)を追加して、指定された位置に要素を追加します。まず、rangecheckforaddに電話して、インデックスが有効かどうかを確認します。インデックス>サイズの場合||インデックス<0、例外がスローされます。次に、容量が1ずつ増加することを確認し、System.ArrayCopyを呼び出して、インデックス1位からの要素を後方に移動します。最後に、追加の要素にインデックスの値を設定します。また、要素を直接追加するオーバーロードされたADD(E E)メソッドもあります。
addall(collection <?extends e> c)およびaddall(int index、collection <?extends e> c)コレクション内のすべての要素を、それぞれ指定された位置に追加します。
7. removeとremoveall
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を返します。 }削除(オブジェクトO)メソッドは、指定された要素を削除します。まず、要素の場所を探し、次にFastRemove(index)を呼び出して削除します。コードは次のとおりです。
private void fastremove(int index){modcount ++; int nummoved = size -index -1; if(nummoved> 0)//すべての要素をインデックスの背後に移動します+1 1位置の前方system.ArrayCopy(elementData、index+1、elementData、index、nummoved); elementData [ - size] = null; // GCにその仕事をさせてください}オーバーロードされた削除(intインデックス)メソッドは、指定された場所の要素を削除するために使用されます。 Removerange(int fromindex、int toindex)は、指定された場所間のすべての要素を削除するために使用されます。
Removeall(collection <?
public boolean removeall(collection <?> c){objects.requirenonnull(c); batchremove(c、false)を返します。 } public boolean resterall(collection <?> c){objects.requirenonnull(c);バッチレモーブを返す(c、true); }これらはすべて、BatchRemoveメソッドを呼び出すことによって実装されており、そのコードは次のとおりです。
プライベートブールバッチレモ(コレクション<? int r = 0、w = 0; Boolean Modified = false; try {for(; r <size; r ++)if(c.contains(elementData [r])== compropment)elementData [w ++] = elementData [r]; }最後に{// abstractCollectionとの行動互換性を保持します。 if(r!= size){system.arraycopy(elementData、r、elementData、w、size -r); w += size -r; } if(w!= size){// clear gc for(int i = w; i <size; i ++)elementData [i] = null; modcount += size -w; size = w; Modified = true; }} return modified; }この方法には2つのパラメーターがあります。 1つ目は操作コレクションで、2つ目はブール値です。 Trueまたはfalseに設定することにより、Removeallまたは保持するかどうかを選択します。 Tryのステートメントでは、残りのものを0とWの間に配置し、最終的に2番目の場合はWの後にスペースを処理し、最初のステートはC.Contains()が例外をスローするときに実行されます。