Java ArayListは方法を深く理解し、遍歴しています。

6474 ワード

1、ArayListについて    ArayListは伝説のダイナミック配列であり、MSDNによるとArayの複雑なバージョンであり、以下のような利点を提供しています。
  • ダイナミックな増加と減少要素
  • は、ICollectionとIlistインターフェース
  • を実現した。
  • フレキシブルな配列のサイズ
  • 2、ArayListを使用する    最も簡単な例:ArayList List = new ArayList()フォーム( 要点 i=0;i<10;i++ ) //配列に10個のInt元素List.Add(i)を追加する。 //..プログラムはList.RemoveAt(5)を処理します。/6番目の要素をfor(for)を削除します。 要点 i=0;i<3;i++ ) //3つの要素を追加します  List.Add(i+20);Int 32[] values = (Int 32[]List.ToAray(typeof(Int 32)、/ArayListに含まれる配列に戻るのは簡単な例であり、ArayListのすべての方法は含まれていないが、ArayListの最も一般的な使い方3、ArayListの重要な方法と属性(1)構成器を反映することができる。    ArayListは三つのコンストラクタを提供しています。 ArayList();デフォルトのコンストラクタは、デフォルト(16)の大きさで内部の配列publicを初期化します。 ArayList(ICollection)は、一つのICollectionオブジェクトで構成され、このセットの要素をArayListpublicに追加する。 ArayList(int)内部配列(2)IsSynchronized属性とArayList.Synchronizedメソッドを指定のサイズで初期化する。    Isynchronized属性は、現在のArayListの例がスレッド同期をサポートしているかどうかを示し、ArayList.Synchronized静的方法は、ArayListのスレッド同期のパッケージに戻る。    非スレッド同期の例を使用すると、マルチスレッドアクセス時には、自分で手動でロックを起動してスレッド同期を維持する必要がある。 リスト = new ArayList()//…ロック( list.Sync Root ) //ArayListが非スレッド包装の場合、SyncRoot属性は自分自身ですが、ICollectionのSyncRoot定義を満たすために、ここではSyncRootを使ってソースコードの規範性を維持します。 「Add」 a. Item」 );}     ArayList.Synchronized方法を使用して戻る場合は、スレッド同期の問題を考慮する必要はなく、この例自体がスレッドセキュリティであり、実際にはArayList内部でスレッド同期を保証する内部クラスが実現されており、ArayList.Syncronizedはこのクラスの例を返しており、それぞれの属性はロックキーでスレッド同期を保証している。
    ****
    しかし、この方法を使うと、エニュメレーションの同期は保証されません。例えば、スレッドが一つのアイテムを削除したり追加したりしていますが、他のスレッドが同時にエニュメレーションを行うと、エニュメレーションは異常となります。エニュメレーションの際には、明確に使用しなければなりません。 SyncRoot この集合をロックします。
     
    HashtableとArayListのスレッド安全性に関する使用方法は類似している。
    **(3)Count属性とCapacity属性    Count属性は、現在のArayListに含まれる要素の数です。この属性は読み取り専用です。Capacity属性は、現在のArayListに含まれる最大数です。手動でこの属性を設定できますが、Count値以下に設定すると、異常を引き起こします。(4)Add、Addrange、Remove、RemoveAt、RemoveRange、Insert、Insert    これらの方法は、要素を現在のリストの末尾に追加するためのAddrange方法と同様に、現在のリストの末尾にあるRemove方法に要素を追加して削除し、要素自体の参照によってRemoveAt方法を削除し、インデックス値によってRemoveRangeを削除し、一連の要素を削除するために使用します。指定された位置に要素を追加するためにInsertを削除します。リストの後の要素は順にInsertRangeを後ろに移動します。指定された位置からいくつかの要素を追加します。リストの後の要素は順次後ろに移動します。    また、いくつかの類似の方法があります。Clear方法は、既存のすべての要素Conttainsをクリアする方法で、あるオブジェクトをリスト内に検索するために使用されます。    他のものはいちいち邪魔しません。MSDNを確認してください。上記のように詳しく(5)TrimSize方法を教えてください。    この方法は、ArayListを実際の要素の大きさに固定するためのもので、動的配列要素が追加されていないと判断した場合、空きメモリを解放するためにこの方法を呼び出すことができる。    この方法はArayListの元素Copyを新しい配列にする。
    4、ArayListと配列変換    例1:ArayList List = new ArayList();List.Add(1);List.Add(2);List.Add(3);Int 32[] values = (Int 32[]List.ToAray(typeof(Int 32))    例2:ArayList List = new ArayList();List.Add(1);List.Add(2);List.Add(3);Int 32[] values = new Int 32[List.Coount];List.CoopyTo(values);    上記では、ArayListから配列に変換する2つの方法を紹介しています。    例3:ArayList List = new ArayList();List.Add( ストリングス );List.Add( 1 );//配列に異なる種類の要素を追加します。 values = List.ToAray(typeof(object)//正確なstring[] values = (string[])List.ToAray(typeof(string); //エラーは配列と違っています。Object配列に変換できるので、異なる種類の要素をArayListに追加するのは間違いありません。しかし、ArayListメソッドを呼び出すと、すべての要素が正確に変換できるタイプまたはObjectタイプを伝えるか、そうでないと、モデルチェンジできない異常を投げかけることができます。5、ArayListの最適な使用提案です。    このセクションでは、ArayListと配列の違い、およびArayListの効率問題について議論します。  (1)ArayListはArayの複雑なバージョンであるArayList内部にObjectタイプの配列を封入しており、一般的には配列と本質的な違いはなく、Index、IndexOf、Conttains、Sortなどの多くの方法は内部配列に基づいて直接Aray対応方法を呼び出す。  (2)内部のObjectタイプの影響         この部分の影響は一般的な引用タイプにはそれほど大きくないが、値の種類については、アラーリストに要素を追加したり修正したりすると、箱詰めや箱詰めの操作を引き起こし、頻繁な操作は一部の効率に影響を与える可能性がある。しかし、多くの人にとっては、値の種類の配列が使われている。この影響をなくすのは仕方がない。それを使わない限り、一部の効率損失を負担しますが、この部分の損失は大きくないです。  (3)配列拡張容量は、ArayListの効率に大きな影響を与える要因の一つです。Add、AddRange、Insert、InsertRangeなどの要素添加方法を実行するたびに、内部配列の容量が足りないかどうかを確認します。もしそうであれば、現在の容量の2倍で配列を再構築し、古い要素Copyを新しい配列に捨てます。この臨界点にあります。の拡大操作は、効率に影響を与えるということです。     例1:たとえば、200個の要素があるかもしれないデータが、デフォルトの16個の要素サイズで作成されたArayListにダイナミックに追加されると、経過します。 = 256四回の拡大は最終的な要求を満たすことができます。 List = new ArayList( 210 );の方式でArayListを作成し、4次配列作成とCopyの操作を減らすだけでなく、メモリの使用も減少します。     例2:30の要素が期待されているため、ArayListを作成しました。 List = new ArayList(30)は、実行中に31の要素を加えると、配列は60の要素の大きさに拡張され、新しい要素が追加されることはなく、TrimSizeメソッドを呼び出すことができますか? List = new ArayList(40)は、すべて解決しました。だから、可能な要素を正確に予測し、適切な時にTrimSize方法を呼び出すことが、ArayListの使用効率を高める重要な方法です。   (4)頻繁にIndexOfを呼び出す、Conttainsなどの方法(Sort、BinarySearchなどの方法は最適化されていますが、この列ではありません。)効率損失は、まず、ArayListがダイナミック配列であることを明確にしたいです。KeyまたはValueを通じて迅速にアクセスするアルゴリズムを含んでいないので、実際にIndexOf、Conttainsなどを呼び出して、簡単なループを実行して要素を検索するので、頻繁にこのような方法を呼び出すのは、あなた自身の書き込みサイクルよりも速く、そして少し最適化する必要があります。を選択します。HashtableやSorted Listなどのキーペアのセットを使用することを推奨します。
    6、四種類のエルゴード方法
    import java.util.ArrayList;
    
    
    
      import java.util.Iterator;
    
    
    
      import java.util.List;
    
    
    
      public class ArrayListDemo {
    
    
    
      public static void main(String args[]){
    
    
    
      List<String> list = new ArrayList<String>();
    
    
    
      list.add("luojiahui");
    
    
    
      list.add("luojiafeng");
    
    
    
      //  1
    
    
    
      Iterator it1 = list.iterator();
    
    
    
      while(it1.hasNext()){
    
    
    
      System.out.println(it1.next());
    
    
    
      }
    
    
    
      //  2 
    
    
    
      for(Iterator it2 = list.iterator();it2.hasNext();){
    
    
    
      System.out.println(it2.next());
    
    
    
      }
    
    
    
      //  3
    
    
    
      for(String tmp:list){
    
    
    
      System.out.println(tmp);
    
    
    
      }
    
    
    
      //  4
    
    
    
      for(int i = 0;i < list.size(); i ++){
    
    
    
      System.out.println(list.get(i));
    
    
    
      }
    
    
    
      }
    
    
    
      }