違いと関係のリスト、セット、マップ(仕上げ)

免責事項:この記事はブロガーオリジナル記事です、BY-SAの著作権契約、複製、元のソースのリンクと、この文を添付してくださいCC 4.0に従ってください。
このリンクします。https://blog.csdn.net/zhangqunshuai/article/details/80660974
ソースを明記してください:Javaのコレクションリスト、セット、および地図などの詳細な収集システム(最も完全な履歴)
概要:
リスト、セット、地図インタフェースがあり、最初の2つの独立したインタフェースは、地図、Collectionインタフェースを継承するために
設定し、LinkedHashSetの下HashSetのを持って、TreeSetのは、
リストの下のArrayListを持って、ベクターは、LinkedListのは
地図のHashtable、のLinkedHashMap、HashMapの、TreeMapの下にい
Collectionインタフェースの下にキュー・インターフェースがありますそこに優先度つきキュークラス


注意:
キュー・インターフェース・リストを、同じレベルを設定し、それらがCollectionインタフェースを継承しています。
あなたは見つけるでしょう。図は、LinkedListのは、キューのインターフェイスを実装するか、Listインタフェースを実現することができます。しかし、それは、LinkedListのは、キューのインターフェイスを実装しています。(キュー、キューアクセス方式のみ完全インターフェースによって定義することができるが、直接のLinkedListの非キューメソッドにアクセスすることができない場合、メソッド、すなわちパラメータの型)LinkedListのメソッドへのアクセスを狭くキューインタフェース、ようにのみ、適切な方法を使用することができます。

たSortedSetは内部インタフェースである(これだけTreeSetの実装が利用可能である)の要素は、順序付けされなければなりません。

概要:
接続インターフェイス:
-リスト秩序、繰り返し可能

ArrayListの
利点:基礎となるデータ構造は、配列、クエリ速い、遅いの追加です。
短所:スレッドセーフな、高効率の
ベクター
の利点:基礎となるデータ構造速い、遅い付加および欠失を問い合せ配列です。
短所:スレッドセーフな、低効率
のLinkedListの
利点:基礎となるデータ構造は、リスト、遅いクエリ、追加、削除速いです。
短所:スレッドセーフな、高効率
-Set障害、のみ

HashSetの
基礎となるデータ構造は、ハッシュテーブルです。(順不同のみ)
どのように要素の一意性を確保するには?
1.二つの方法に依存している:のhashCode()とequals()

LinkedHashSetの
基礎となるデータ構造は、リンクリストやハッシュテーブルです。(FIFOのみ、挿入を注文)
を保証するための要素の順序付けられたリストによって1
のみの要素を確実にするためにハッシュテーブルにより2.

TreeSetの
基礎となるデータ構造は赤黒木です。(のみ注文)
1.ソートそれを確保する方法の要素?
自然な順序
コンパレータ並べ替え
要素の一意性を確保する方法2.?
戻り値の比較に基づいて決定することは0であります

それを使用する最後に私たちのためのコレクションのコレクション?(マスター)

唯一の右?

です:セット

それをソート?

TreeSetのかLinkedHashSetの:彼らは
HashSetの:いいえ
、あなたが設定を知っていれば、しかし、HashSetのを使用するために、どの設定を知りません。

いいえ:一覧ありません

保護するには?

です:ベクトル
番号:ArrayListのか、LinkedListの

マルチクエリ:ArrayListの
追加やより:LinkedListの
あなたは、リストを知っているが、ArrayListのを使用するリスト、わからない場合。

あなたがコレクションのコレクションを知っているが、使用するのか分からない場合は、ArrayListのを使用しています。
あなたは、コレクションを知っている場合は、ArrayListのを使用しています。

単に地図を見て、コレクションを持ちます。

地図インタフェース:
上:


Mapインタフェースは、3つの重要なカテゴリー、すなわちHashMapの、TreeMapのとハッシュテーブルを実現するために持っています。

TreeMapのが発注され、HashMapのハッシュテーブルは順不同です。
Hashtableのメソッドは同期化され、メソッドのHashMapが同期されません。これは、二つの主な違いです。
これが意味します。

ハッシュテーブルは、スレッドセーフである、HashMapのは、スレッドセーフではありません。
HashMapの高効率、低Hashtableの効率。
レガシーコードまたは推奨のHashMapとの互換性のために無同期要件の場合。ハッシュテーブルは、ソースコードはHashMapのソースコードはないがハッシュテーブルのすべてのパブリックメソッドを宣言は、キーワードを同期化され、コンストラクターに加えて、見ることができる表示します。
ハッシュテーブルがnull値を許可しない、HashMapのは、null値(キーと値が許可されている)ことができます
別の親クラス:親辞書、HashMapの親がAbstractMapのハッシュテーブルクラスをです
:重要な問題に焦点を当てて
(a)の.TreeSet、違いLinkedHashSetのとHashSetの
1.はじめに

TreeSetの、LinkedHashSetのとHashSetのは、セットのJavaデータ構造に実装され
TreeSetのソートにメイン関数
(先入れ先出し)LinkedHashSetの即ち順序集合FIFOを確保するための主な機能を
汎用データ・ストレージのHashSetの単にコレクション
2。同じポイント

重複要素:すべての3つのセットのインタフェースを実現するために、その三つの要素が重複含まれていないので、
スレッドセーフを:3は、スレッドセーフではありません、あなたはスレッドセーフ使用する場合はすることができますCollections.synchronizedSet()
3.違い

パフォーマンスとスピード:HashSetのは、内部実装TreeSetをソートするので、LinkHashSet続く、最速のデータを挿入する最も遅い
HashSetのは、秩序を保証し、LinkHashSet挿入の順にソートされたFIFO、内部実装のソートTreeSetのインストールを保証するものではありません、あなたはまた、ソートカスタマイズすることができます。発注ルール
ヌル:HashSetのとはLinkHashSetヌルデータを許容するが、NullPointerExceptionがヌルデータが挿入報告される場合TreeSetの
4比較コード

公共の静的な無効メイン(文字列引数[]){
HashSetの<ストリング> HashSetの=新しいHashSetの<>();
LinkedHashSetの<文字列> LinkedHashSetの=新しいLinkedHashSetの<>();
TreeSetの<文字列> TreeSetの=新しいTreeSetの<>();

用(Stringデータ:は、Arrays.asList( "B"、 "E"、 "D"、 "C"、 "A")){
hashSet.add(データ)。
linkedHashSet.add(データ)。
treeSet.add(データ)。
}

//秩序を保証していない
のSystem.out.println(「HashSetので注文:」 + HashSetのを)。

// FIFOは、順次発注インサート取付確保
するSystem.out.println(「LinkedHashSetの中の要素の順序 :」+ LinkedHashSetのを)。

//内部ソートを実装
するSystem.out.println(「TreeSetの中のオブジェクトの順序 :」+ TreeSetのを)。


}
実行結果:
HashSetのに順序:[A、B、C、D、E](非順次)
LinkedHashSetの内の要素の順序:[B、E、D、C、A](FIFO順を挿入)
オブジェクトの順序でTreeSetの:[A、B、C 、D、E]( ソート)

比較(II).TreeSet 2つのソート
(例えば、基本的なデータタイプをソート)ソート1.組み込ま
TreeSetのソート要素は、次の例のように、一定の規則に従って実施することができるので

公共MyClassクラス{

静的な無効メインパブリック(文字列[]引数){
//オブジェクトのコレクションを作成するには、
順序//自然ソート
TreeSetの<整数> TS =新しいTreeSetの <整数>();

//要素の作成と追加
// 20,18,23,22,17,24,19,18,24
ts.add(20);
ts.add(18);
ts.add(23);
ts.add( 22)であり;
ts.add(17)。
ts.add(24);
ts.add(19)。
ts.add(18である);
ts.add(24)。

//遍历
(整数I:TS)のための{
のSystem.out.println(I)。
}
}
}

結果:
17
18である
19。
20
22であり、
23は
24

?2.それは、このようなカスタムオブジェクトとして参照データ型であれば、どのようにそれをソートするため
のテストクラスを:

パブリッククラスMyClassの{
パブリック静的無効メイン(文字列[] args){
TreeSetの<学生> TS =新しいTreeSetの<学生>();
//创建元素对象
学生S1 =新しい学生( "zhangsan"、20);
学生S2 =新しい学生( "LIS"、22);
学生S3 =新しい学生( "wangwu"、24);
学生S4 =新しい学生( "chenliu"、26);
学生S5 =新しい学生( "zhangsan"、22);
学生S6 =新しい学生( "qianqi"、24);

//収集要素オブジェクトにオブジェクトを追加
ts.add(S1);
ts.add(S2);
ts.add(S3);
ts.add(S4);
ts.add(S5);
ts.add(S6 );

//遍历
用(学生S:TS){
System.out.printlnは(s.getName()+ "-----------" + s.getAge())。
}
}
}
Student.java。

パブリッククラス学生{
プライベート文字列名;
プライベートint型の年齢;

公共学生(){
スーパー();
// TODO自動生成されたコンストラクタスタブ
}

公共学生(文字列名、int型の年齢){
スーパー();
this.name =名前;
this.age =年齢;
}

パブリック文字列のgetName(){
名前を返します。
}

公共ボイドのsetName(文字列名){
this.name =名。
}

公共int型getAge(){
戻り値の年齢。
}

公共ボイドsetAge(int型の年齢){
this.age =年齢;
}
}

結果は与えられました:


分析:
ソートでそのようなセキュリティの並べ替えを知らなくても、それが与えられます。
解決策:
1.自然ソート
2.ソートコンパレータ

(1)自然順序
以下の操作を実行する自然な順序:
1.Studentクラスが同等のインタフェースを実装
2.法同等インターフェースのcompareToをオーバーライド

compareTo(T o)の指定されたオブジェクトとこのオブジェクトを比較してください。
。1人の
パブリッククラスの学生が実装匹敵<学生> {
プライベート文字列名;
プライベートint型の年齢;

公共学生(){
スーパー();
// TODO自動生成されたコンストラクタスタブ
}

公共学生(文字列名、int型の年齢){
スーパー();
this.name =名前;
this.age =年齢;
}

パブリック文字列のgetName(){
名前を返します。
}

公共ボイドのsetName(文字列名){
this.name =名。
}

公共int型getAge(){
戻り値の年齢。
}

公共ボイドsetAge(int型の年齢){
this.age =年齢;
}

@Override
のcompareTo(スチューデントS){int型公衆
。戻す// -1; - // 1出力を反転、すなわち、左側に赤黒木を表し
; // 1、すなわち、右側の赤黒木を表す1を返す//順次出力
//は同一の要素、最初の記憶素子表し; O戻す//
小さい長さの名前が左サブツリーにある場合、//一次条件名の長さ、または右サブツリー上
のint NUM =この。 name.length() - s.name.length();
この文字列オブジェクト辞書パラメータ文字列が配置される前に、比較結果が負の整数である場合、同じ//名前の長さは、同じ内容を表すものではありません。
このStringオブジェクトが辞書的にパラメータ文字列が配置された後ならば//、比較結果が正の整数です。
2つの文字列が等しい場合、//、結果は0である
int型NUM1 = NUM == 0 this.name.compareTo(s.name):NUMは;?
同じ名前//長さやコンテンツを、そう、同じ年齢を意味するものではありませんだけでなく、年齢を決定する
INT NUM2 = NUM1 == 0 this.age-s.age :? NUM1と、
NUM2を返します;
}
}

結果:

11月22日-----------
Qianqi ----------- 24
Wangwu ----------- 24
chenliu ---------- -26
zhangsan ----------- 20
zhangsan ----------- 22

(2)比較器を注文する。
コンパレータ選別手順を:
1.ここでMyComparatorための例として、別のクラスの比較を作成し、およびletその後継コンパレータインタフェースを
方法2コンパレータインタフェースリライタブル比較

ソートされた2つのパラメータを比較する(T O1、T 02)を比較します。
1
3.メインカテゴリに以下の構成を使用する方法

TreeSetの(コンパレータ<?SuperE>コンパレータ )
新しい空のTreeSetのを構築し、それが指定されたコンパレータに従ってソートされます。
。1つの
2
テストの種類:

公共MyClassクラス{

静的な無効メインパブリック(文字列[] args)を{
コレクションオブジェクトの作成//
// TreeSetの(コンパレータ<?スーパーE >コンパレータは) 新しい空のTreeSetのを構築し、それが指定されたコンパレータに従ってソートされます。
TreeSetの<学生> TS =新しいTreeSetの <学生>(新MyComparator());

//创建元素对象
学生S1 =新しい学生( "zhangsan"、20);
学生S2 =新しい学生( "LIS"、22);
学生S3 =新しい学生( "wangwu"、24);
学生S4 =新しい学生( "chenliu"、26);
学生S5 =新しい学生( "zhangsan"、22);
学生S6 =新しい学生( "qianqi"、24);

//収集要素オブジェクトにオブジェクトを追加
ts.add(S1);
ts.add(S2);
ts.add(S3);
ts.add(S4);
ts.add(S5);
ts.add(S6 );

//遍历
用(学生S:TS){
System.out.printlnは(s.getName()+ "-----------" + s.getAge())。
}
}
}

Student.java:

パブリッククラス学生{
プライベート文字列名;
プライベートint型の年齢;

公共学生(){
スーパー();
// TODO自動生成されたコンストラクタスタブ
}

公共学生(文字列名、int型の年齢){
スーパー();
this.name =名前;
this.age =年齢;
}

パブリック文字列のgetName(){
名前を返します。
}

公共ボイドのsetName(文字列名){
this.name =名。
}

公共int型getAge(){
戻り値の年齢。
}

公共ボイドsetAge(int型の年齢){
this.age =年齢;
}

}

MyComparatorカテゴリ:

パブリッククラスMyComparatorはコンパレータ<学生>実装{

@Override
公共INT比較(スチューデントS1、S2学生){
//名前長
のint NUM = s1.getName()の長さ() - s2.getName()の長さは(); ...
//コンテンツの名前
INT NUM2 = NUM == ?0 s1.getName()のcompareTo(s2.getName()):NUM ;.
//年齢
INT NUM2 NUM3 = == 0 s1.getAge() - s2.getAge():? NUM2;
NUM3を返します;
}

}

結果:

11月22日-----------
Qianqi ----------- 24
Wangwu ----------- 24
chenliu ---------- -26
zhangsan ----------- 20
zhangsan ----------- 22

(C)性能試験
オブジェクトクラス:

クラス犬同等<犬> {実装
int型のサイズと、
公共犬(INT秒){
サイズ=秒;
}
パブリック文字列のtoString(){
戻りサイズ+ ""。
}
@Override
公共のintのcompareTo(犬0){
//数值大小比较
戻りサイズ- o.size。
}
}

主类。

公共MyClassクラス{

パブリック静的無効メイン(文字列[] args){

ランダムはr =新しいランダム();
HashSetの<犬> HashSetの=新しいHashSetの<犬>();
TreeSetの<犬> TreeSetの=新しいTreeSetの<犬>();
LinkedHashSetの<犬> linkedSet =新しいLinkedHashSetの<犬>();

//時間に開始
長いのstartTime = System.nanoTimeのを();
{(;私は1000 <I ++はiが0 = INT)のために
、+ 10 - INT X = r.nextInt(10 1000)
hashSet.add(新しい犬(X));
}

//終了時刻
長いendTimeは= System.nanoTimeの()。
長い期間= endTimeは- startTimeの。
System.out.println( "HashSetの:" +期間)。

//は、開始時刻
のstartTime = System.nanoTimeの()を。
{(;私は1000 <I ++はiが0 = INT)のために
、+ 10 - INT X = r.nextInt(10 1000)
treeSet.add(新しい犬(X));
}
//終了時間
endTimeは= System.nanoTimeの()。
期間= endTimeは- startTimeの。
System.out.println( "TreeSetの:" +期間)。

//は、開始時刻
のstartTime = System.nanoTimeの()を。
{(;私は1000 <I ++はiが0 = INT)のために
、+ 10 - INT X = r.nextInt(10 1000)
linkedSet.add(新しい犬(X));
}

//終了時刻
endTimeは= System.nanoTimeの()。
期間= endTimeは- startTimeの。
System.out.println( "LinkedHashSetの:" +期間)。
}

}


結果:

HashSetの:1544313
TreeSetの:2066049
LinkedHashSetの:629 826
テストは十分に正確ではありませんが、それが反映して来ることができますが、TreeSetのは、はるかに遅い、それが注文されているため。

 

さて、この目的のために。ジュニアパートナーは疑問を持って、メッセージを残してください

おすすめ

転載: www.cnblogs.com/dblb/p/11470556.html