A。特徴
二つのインタフェースは、Collectionから継承され、一般的にデータを格納する項目に使用の集まりである、次のように、主な相違点は以下のとおりです。
①リストとセットの間の非常に重要な違いは、リストの重複要素の挿入を可能、重複要素が存在することを許可するかどうかですが、重複した要素がセットに存在し許可していません。
②およびシーケンスに関連する記憶素子を持ち、リストは順序集合で、順序は、要素が挿入されたとき、保持順不同コレクションを設定します。
③リストは、インデックスを介してアクセスしますが、設定はできません。
B。一般的な実装クラス
(1)一覧インタフェース
一般的な実装クラスを次のように
ArrayListの(アレイの実装では):コストが比較的高い、移動、コピーする中間位置のArrayList挿入または配列ニーズの削除要素から要素への高速なランダムアクセスを可能にします。したがって、それは、挿入や削除のために適しランダム探索とトラバーサルには適していません。
ベクトル(配列の実装):スレッド同期のサポートは、ベクトルを書き込むことができ、一度に一つのスレッド、生じた矛盾を書きながら、マルチスレッドを避けるため、しかし同期はそれより低速のArrayListにアクセスするよりも、このため、アクセスが非常に高いコストが必要となります。なぜなら大きなセキュリティスレッドのオーバーヘッドの必要性のベクターを使用することなく、スレッドセーフレベル属しますが、ほとんどの場合、ベクター、(ArrayListのメソッドに関連付けられているが、この方法では、同期の変更で、非常によく似ています)。
私たちは、配列が十分な大きさがにない場合には、その後、新しい配列にコピーされた配列の要素を再確立することを見つけるのArrayList(+ 1 1.5倍)、およびベクトル(2倍)異なるアレイサイズの拡大を。
LinkedListの(リストの実装):これは、データの動的な挿入および削除するのに適しているランダムアクセストラバース速度が遅くなります。また、操作ヘッダーとテイルの要素のために設計されたListインタフェースを定義されていないプロセスを提供し、スタック、キュー、キュー双方向用途として使用することができます。
(2)セット・インタフェース
一般的な実装クラスはHashSetの、TreeSetのLinkedHashSetのとがあります。
HashSetの:HashSetのへの結合要素に格納されている場合、HashSetのは、あろうオブジェクトハッシュコードの値を取得するオブジェクトのハッシュコード()メソッドを呼び出し、ハッシュコード値は、次に、HashSetのにオブジェクト格納場所に応じて決定(なぜ方法HashSetの非繰り返しの保証)。すなわち、決意のHashSetのセットは、2つの標準的な要素に等しい2つのオブジェクトが同じであると、2つのオブジェクトのhashCode()メソッドの戻り値が等しい比較することによって方法に等しいです。要素の順序を保証することはできません、順序が変更される可能性があり、コレクションの要素がだけヌルに、nullの場合もあります。
A LinkedHashSetのは:要素のハッシュコード要素値によって決定されるLinkedHashSetの同じ記憶位置を設定するが、それはまた、要素のリスト内での順序を維持するために使用されます。集合時間を横断する際の挿入要素があること、節約するためにのように見えるような、要素の集合の要素のLinkedHashSetのシーケンシャルアクセスを追加することになります。LinkedHashSetのときに設定のすべての要素への反復アクセスは、パフォーマンスが優れてHashSetのよりですが、ときにHashSetのにやや劣るパフォーマンスを挿入します。
TreeSetの :TreeSetのにSortedSetを実装インタフェース、基礎となるデータ構造はTreeSetのコレクション要素は、シーケンシング状態に確保することができ、赤黒木であることを唯一のクラスです。TreeSetのは自然な順序がデフォルトのソート順である自然の並べ替えやカスタムオーダーの2種の、次の例をサポートしています。
自然順序付けは - 要素の大小関係を比較する方法を自然の要素のCompareTo(オブジェクトobj)の並べ替えを使用してソートすると、要素が昇順に配置されています。
カスタムソート - あなたが発注コンパレータインターフェイスをカスタマイズしたい場合は自然順序付けは昇順に要素のコレクションのサイズに基づいており、比較INTを達成するために使用されなければならない(T O1、T O2)メソッド
次の例:
パッケージjavase.collection。 輸入はjava.util.Comparator; インポートするjava.util.Iterator; 輸入java.util.TreeSet; クラスの人は、Comparable <人> {実装 プライベートint型の年齢を、 プライベート文字列名; 公共パーソン(文字列名、int型の年齢){ this.name =名; this.ageは年齢を=。 } パブリック文字列のtoString(){ リターン"[" +名+ ":" +年齢+ "]"。 } 公共INT getAge(){ 戻り年齢; } パブリック文字列のgetName(){ 戻り名。 } @Override 公共のintのcompareTo(人の人){ //返回0表示相等、则不加入TreeSetの リターンthis.age> person.getAge()?1:-1; } } クラスPERSON2 { プライベートint型の年齢; プライベート文字列名; 公共PERSON2(文字列名、int型の年齢){ this.name =名; this.ageは年齢を=。 } パブリック文字列のtoString(){ リターン"[" +名+ ":" +年齢+ "]"。 } 公共INT getAge(){ 戻り年齢; } パブリック文字列のgetName(){ 戻り名。 } } クラスMYCOMP実装コンパレータ<PERSON2> { @Override 比較公共INT(PERSON2 O1、O2 PERSON2){ リターンo1.getAge()> O2。 } } publicクラスCollectionTest { パブリック静的無効メイン(文字列[] args){ // TreeSetの<人>のpset =新しいTreeSetの<>(新しいMYCOMP())。 // psets.add(新人物( "ボブ"、23)); // psets.add(新人物( "アリス"、36)); // psets.add(新人物( "トム"、18)); //イテレータ<人>それ= psets.iterator(); //一方(it.hasNext()){ //するSystem.out.println(it.next())。 //} TreeSetの<PERSON2>のpset =新しいTreeSetの<>(新しいMYCOMP())。 psets.add(新PERSON2( "ボブ"、23)); psets.add(新PERSON2(」 psets.add(新PERSON2( "トム"、18)); 反復子<PERSON2>それ= psets.iterator()。 一方、(it.hasNext()){ System.out.printlnは(it.next())。
//リスト转セットの 設定<文字列>セット=新しいHashSetの<>(リスト); //設定转リスト 一覧<文字列>リスト1 =新しいArrayListを<>(セット);
参考資料