設定インターフェイスの概要
Collectionインタフェース、そのメソッドとCollectionインタフェースから継承されたのと同じjava.util.Set java.util.Listにインターフェイスとインターフェイスは、基本的には同じではない、とCollectionインタフェースよりもCollectionインタフェース機能の拡張が、より厳しいです。違いは、Listインタフェースで、Setインタフェース障害の要素、およびいくつかのルールが要素に非重複を確保することです。
複数のサブカテゴリーのコレクションを設定し、ここではそれらはjava.util.HashSet、java.util.LinkedHashSet 2セットをご紹介します。
Setインタフェースの特性を要約すると:
- インタフェースjava.util.Setは、コレクションのインターフェイスを拡張し
- ストレージは、要素を繰り返しません
- いいえ指標、無バンドインデックス方法は、通常のループの反復のために使用することはできません
HashSetのコレクションが導入します
java.util.HashSetがセットインタフェースの実装で、その格納された要素が繰り返し可能ではなく、(すなわち、一貫性のないアクセスシーケンス)要素が乱れています。java.util.HashMapをサポートで根本的な事実を達成はjava.util.HashSet。HashSetのは、コレクション内のオブジェクトの保管場所のハッシュ値に基づいて決定され、それが良いのアクセスと検索性能を有します。要素を確保するための唯一の方法は、によって異なりますのhashCodeとequalsメソッドを。HashSetのコレクションの特徴を要約すると:
- java.util.HashSetコレクション道具セット・インタフェース
- ストレージは、要素を繰り返しません
- いいえ指標、無バンドインデックス方法は、通常のループの反復のために使用することはできません
- 矛盾を除去することができる要素の順序なしコレクションとストレージ要素の順序があります
- 底部層は、ハッシュテーブル構造である(クエリ速度は非常に高速です)
データを格納するための構造のHashSetのセット(ハッシュ・テーブル)
ハッシュ値とは何ですか?
- ハッシュ値:小数の整数であるランダム系で与えられる(で、オブジェクトのアドレス値、論理アドレス物理アドレスがアドレスを取得するためにシミュレートされ、データが実際に格納されていません)。
ハッシュテーブル、それは何ですか?
- JDK1.8、リンクされたリストの実装+を使用して、基礎となるハッシュテーブルアレイ、すなわち競合リンクされたリストは、リストの前に同じハッシュ値がリンクされたリストに格納されています。しかし、時にバケット内の要素の多くは、それは、キー値を見つけるために効率が低い要素のハッシュ値により等しいです。チェーンの長さが閾値(8)を超えJDK1.8、達成するためにリンクされたリスト+ +赤黒木を使用して、ハッシュ・テーブル・アレイ・メモリは、リストが大幅に検索時間を短縮赤黒木、に変換されます。簡単に言えば、ハッシュテーブルを実現(JDK1.8が赤黒木部の増加)リンクされたリスト配列+ +赤黒木です。すべてのすべてで、JDK1.8はハッシュコードを決定するために、実際には、そう私たちのために、HashMapのパフォーマンスを最適化するために、赤黒木のみの保証を大きくを紹介し、要素のHashSetのコレクションの対象に係る方法に等しいです。我々はコレクションにカスタムオブジェクトを格納する場合は、唯一の保証ので、そのオブジェクトの複製のhashCodeに属するとequalsメソッドをより多くの現在の方法を確立する必要があります。
設定保存されたデータセットの一意性を確保する方法
我々はコレクションにカスタムオブジェクトを格納する場合は、唯一の保証ので、そのオブジェクトの複製のhashCodeに属するとequalsメソッドをより多くの現在の方法を確立する必要があります。
詳細設定の記憶素子の原則:
我々はコレクションに追加メソッドセットコレクションの追加要素を使用する場合:
- Addメソッドは、追加される要素のハッシュ値を計算するために要素を追加するhashCodeメソッドを呼び出します。
- そして、その後、コレクションに行っていない場合は、要素のハッシュ値を追加するためにそこに見つけるために、収集方法に追加します。
- あなたは(ハッシュ衝突)を見つけた場合は、通話の要素を追加する必要があります、それはtrueを返した場合、メソッドおよびハッシュ値の同じ要素に等しいです。そして、識別される2つの要素が同じで、コレクションは行ってセットに追加されません。結果が偽メソッドが返すと等しい場合は、コレクションにアクセスしてください。
コード例
要件: 彼の年齢と同じ名前で、同じ人として扱わは、一度だけ保存することができます
Personクラスの定義
パッケージdemo02HashSetを。 輸入java.util.Objects。 パブリック クラス人{ プライベート文字列名; プライベート int型の年齢; パブリック人(){ } 公共パーソン(文字列名、int型の年齢){ この .nameの= 名前; この .age = 年齢; } //は重写方法等しい @Override パブリック ブール{等しい(オブジェクトo)の 場合(これは == O)戻り 真。 もし(O == nullを!||はgetClass()= o.getClass())のリターン はfalse ; 人物人物 = (人物)O; リターン年齢== person.age && Objects.equals(名前、person.name)。 } // 重写のhashCode @Override 公共 int型のhashCode(){ リターンObjects.hash(名前、年齢); } @オーバーライド 公共の文字列のtoString(){ リターン "人{" + "名前= '" +名+ '\'' + 「年齢=」+年齢+ 「}」。 } パブリック文字列のgetName(){ 戻り名。 } 公共 ボイドのsetName(文字列名){ この .nameの= 名前。 } 公共 int型getAge(){ 戻り値の年齢。 } 公共 のボイド setAge(int型の年齢){ この .age = 年齢; } }
Personクラス定義されたセットは、HashSetの保存されています
パッケージdemo02HashSetを。 輸入はjava.util.HashSet。 パブリック クラスDemo01HashSetPersonTest { 公共 静的 ボイドメイン(文字列[]引数){ // HashSetのは、人設定ストレージ作成 HashSetの<人> SET = 新しい新しい HashSetのを<> (); P1人 = 新しい新規人物(「リトル・ミス」、18 )。 P2人 = 新しい新規人物(「リトル・ミス」、18 )。 P3人 = 新しい新しい人( "リトル・ミス"、19 ); // ビューのハッシュ値 のSystem.out.println(p1.hashCode()); // 734 175 839 のSystem.out.println(p2.hashCode()); / / 734 175 839 のSystem.out.println(p1.equals(P2)); // trueに set.add(P1)。 set.add(P2)。 set.add(P3)。 // コレクション要素を確認 するSystem.out.println(SET)を; // [{個人名= '少し美しさ'、年齢= 19}、人 {名= ' 少し美しさ'を、年齢= 18です}] } }
LinkedHashSetのクラス
私たちは、HashSetの保証要素ということを知っているが、要素が順番に格納されていない場合、我々はそれを行う方法を、秩序を確保する必要がありますか?java.util.LinkedHashSet以下サブクラスHashSetのでは、データ記憶構造のリストと組み合わされたハッシュテーブルです。以上のリスト(要素のレコード格納順)より秩序の要素を確実にするために
可変パラメータの導入
可変パラメータ: JDK1.5後に発生した新機能。我々は複数のパラメータを受信する方法、およびパラメータの同じタイプを複数定義する必要がある場合、我々は変数パラメータを使用することができます。
前提を使用します。
- プロセスパラメータリストのデータ型が決定された場合が、不確定パラメータの数、変数パラメータを使用することができます。
フォーマットを使用します:
修飾子戻り値の型メソッド名(パラメータタイプ名パラメータ...){
メソッド本体
}
実際には、これは完全な書き込みに相当します
修飾子戻り型メソッド名(パラメータタイプ[]パラメータ名){
メソッド本体
}
可変パラメータの原則:
- 可変パラメータの基礎となることは、アレイで渡されるパラメータの数に応じて、これらのパラメータを格納するために、異なる長さの配列を作成します。パラメータの数が渡され、0(無送信)、1,2-複数であってもよいです、...
メモ変数パラメータ
- メソッドのパラメータリスト、1つの変数のみのパラメータ
- メソッドの複数のパラメータがある場合は、可変パラメータは、パラメータリストの末尾に記述する必要があります
コード例
パッケージdemo02HashSetを。 パブリック クラスChangeArgs { 公共 静的 ボイドメイン(文字列[]引数){ INT [] ARR = {1、4、62、431、2 }。 int型の合計= getSum(ARR)。 System.out.println(合計)。// 500 // 求 这几个元素和 6 7 2 12 2121 int sum2 = getSum(6, 7, 2, 12, 2121); System.out.println(sum2);//2148 } /* * 完成数组 所有元素的求和 原始写法 public static int getSum(int[] arr){ int sum = 0; for(int a : arr){ sum += a; } return sum; } */ //可变参数写法 public static int getSum(int... arr) { int sum = 0; for (int a : arr) { sum += a; } return sum; } //可变参数的特殊(终极)写法 public static void method(Object... obj) { } }