Javaのセットインターフェイスには、次の特性があります。
繰り返される要素は許可されていません。
セットの要素は決して順序ではありません。
nullの値を持つ要素は1つだけです。
Javaのセットインターフェイスは数学セットの抽象化を模倣しているため、対応する数学セット特性は次のとおりです。
相互異性:セットでは、任意の2つの要素が異なると見なされます。つまり、各要素は一度しか表示できません。
障害:セットでは、各要素の状態は同じで、要素間で無秩序です。シーケンシャル関係は、セットで定義できます。順序関係を定義した後、要素は順序関係に従ってソートできます。しかし、セット自体の特性に関しては、要素間に必要な順序はありません。
空のセットの性質:空のセットはすべてのセットのサブセットです
セットは重複要素を保存しません。最も一般的に使用されるセットはテスト属性です。オブジェクトがセットにあるかどうかを簡単に尋ねることができます。セットにはコレクションとまったく同じインターフェイスがあるため、追加の機能はありません。実際、セットはコレクションですが、動作は異なります。
セットインターフェイスを実装する主なものは、ハッシュセット、ツリーセット、およびLinkedHashsetです。これは、同じアイテムの一般的なポイントであるコピーのみが保存されます。違いもあり、違いは次のとおりです。
1.ハッシュセット:
Hashsetは、非常に複雑な方法を使用して要素を保存します。ハッシュセットを使用すると、コレクション内の要素ができるだけ速く要素を取得できます。これは非常に効率的です(スペースから取引時間の場合)。 Pangduanが同じオブジェクトであるかどうかは、ハッシュコードと等しいものに基づいて決定されます。ハッシュコードが同じで、等しいものがtrueである場合、それは同じオブジェクトであり、繰り返し保存することはできません。
パッケージcn.set; import java.util.hashset; import java.util.set; class Student {int id; Public Student(int id){this.id = id; } @Override public String toString(){return this.id+""; } @Override public int hashcode(){return this.id; } @Override public boolean equals(object obj){if(obj instanceof sudent){sudine stu =(desute)obj; if(stu.id == this.id)return true; } falseを返します。 }} public class hashsettest {public static void main(string [] args){set <susted> set = new Hashset <Student>();学生S1 =新しい学生(1);学生S2 =新しい学生(1);学生S3 =新しい学生(2); set.add(s1); set.add(s2); set.add(s3); for(Student s:set){system.out.println(s); }}}上記の例に示すように、HashCode()とEquals()メソッドを書き換えた後、同意オブジェクトを区別するために、同じオブジェクトを保存できません。これらの2つの方法に注釈が付けられている場合、すべての学生オブジェクトは異なるオブジェクトと見なされ、保存できます。
2.TreeSet
Treesetは重複したオブジェクトを保存できませんが、Treesetは自動的にソートされます。保存されたオブジェクトをソートできない場合、エラーが報告されるため、保存されたオブジェクトはソートルールを指定する必要があります。ソートルールには、自然な並べ替えと顧客の並べ替えが含まれます。
①自然並べ替え:ツリーセットを追加するオブジェクトは、java.lang.comの比類のないインターフェイスを実装し、Comparato()メソッドをオーバーライドします。 0を返すことは、それが同じオブジェクトであることを意味します。そうでなければ、異なるオブジェクトです。
customerソート:サードパーティのクラスを作成し、java.util.comparatorインターフェイスを実装します。メソッドを書き直します。コレクションフォームを定義しますtreset ts = new Treeset(新しいサードパーティクラス());
次の例では、ツリーセットを使用して、自然にソートされたオブジェクトを保存します。
パッケージcn.set; import java.util.set; import java.util.treeset; class desudent1を実装します<Student1> {int id; public Student1(int id){this.id = id; } @Override public String toString(){return this.id+""; } @Override public int hashcode(){return this.id; } @Override public boolean equals(object obj){if(obj instanceof student1){desudent1 stu =(desutent1)obj; if(stu.id == this.id)return true; } falseを返します。 } public int compareoto(sustent1 o){return(this.id-o.id); }} public class troedSettest {public static void main(string [] args){set <sudtent1> set = new Treeset <Student1>(); Student1 S1 = new Student1(5); Student1 S2 = new Student1(1); Student1 S3 = new Student1(2); Student1 S4 = new Student1(4); Student1 S5 = new Student1(3); set.add(s1); set.add(s2); set.add(s3); set.add(s4); set.add(s5); for(student1 s:set){system.out.println(s); }}}出力の結果は次のとおりです。
次の例では、ツリーセットを使用して顧客のソートオブジェクトを保存します。
パッケージcom.set; import java.util.set; import java.util.treeset; class desudent1を実装します<Student1> {int id; public Student1(int id){this.id = id; } @Override public String toString(){return this.id+""; } @Override public int hashcode(){return this.id; } @Override public boolean equals(object obj){if(obj instanceof student1){desudent1 stu =(desutent1)obj; if(stu.id == this.id)return true; } falseを返します。 } public int compareoto(sustent1 o){return(this.id-o.id); }} public class troedSettest {public static void main(string [] args){set <sudtent1> set = new Treeset <Student1>(); Student1 S1 = new Student1(5); Student1 S2 = new Student1(1); Student1 S3 = new Student1(2); Student1 S4 = new Student1(4); Student1 S5 = new Student1(3); set.add(s1); set.add(s2); set.add(s3); set.add(s4); set.add(s5); for(student1 s:set){system.out.println(s); }}}出力の結果は次のとおりです。
誰もが、保存時にリストが挿入順にソートされることを知っています。実際、自然な並べ替えと顧客の並べ替えによってリストコレクションを並べ替えることもできます。参照してください:
パッケージcn.set; import java.util.arraylist; import java.util.collections; import java.util.list; class mysort1を実装しますjava.util.comparator <tudent3> {public int compare(sudents3 o1、dustent3 o2){return o2.id-o1.id; }} class desudent3を実装します<student3> {int id; public Student3(int id){this.id = id; } @Override public String toString(){return this.id+""; } public int compareto(desudent3 o){return(this.id-o.id); }} public class listsort {public static void main(string [] args){list <sudtent3> list = new ArrayList <Student3>(); Student3 S1 = new Student3(5); Student3 S2 = new Student3(1); Student3 S3 = new Student3(2); Student3 S4 = new Student3(4); Student3 S5 = new Student3(3); list.add(s1); list.add(s2); list.add(s3); list.add(s4); list.add(s5); System.out.println(list); //ナチュラルソート:collections.sort(list); System.out.println(list); // Customer Sorting Collections.sort(list、new mysort1()); System.out.println(list); }}出力の結果は次のとおりです。
[5、1、2、4、3]
[1、2、3、4、5]
[5、4、3、2、1]
以下は、Javaのセットコレクションインターフェイスがオブジェクトの挿入の重複を実装していないという原則です。
Javaコレクションでは、2つのオブジェクトが等しいかどうかを判断するルールは次のとおりです。
1)2つのオブジェクトのハッシュコードが等しいかどうかを判断します
等しくない場合、2つのオブジェクトが等しくないと見なされます。それが等しい場合は、2に頼ります)
(これはストレージ効率を改善するためにのみ必要です。実際、理論的にはないことは可能ですが、そうでない場合は、実際の使用中に効率が大幅に低下するため、ここで必要になります。この問題は後で焦点を当てます。)
2)2つのオブジェクトが平等を使用して等しく計算されるかどうかを判断します
等しくない場合は、2つのオブジェクトが等しくないと考えてください。それが等しい場合、2つのオブジェクトが等しい(equals()が2つのオブジェクトが等しいかどうかを判断するための鍵であると考えてください)
一般的なクラスオブジェクトの場合(文字列などのカプセル化されたオブジェクトを除く):
通常のクラスがHashCode()とEqual()メソッドをオーバーライドしない場合、オブジェクトを比較すると、継承されたオブジェクトクラスのHashCode()メソッドを比較すると、オブジェクトクラスのHashCode()メソッドはローカルメソッドです。メソッドの返品値を比較すると、オブジェクトアドレス(参照アドレス)が比較されます。新しい方法を使用して、同じコンテンツを持つオブジェクトを作成します。もちろん、さまざまなオブジェクトが2回生成されます。 HashCode()メソッドがオーバーライドされていない限り。オブジェクトクラスで定義されているequals()メソッドも、オブジェクトアドレスの比較です。一言で言えば、通常のクラスのHashCode()およびEquals Method()メソッドを書き換えない場合、オブジェクト参照アドレスはセットコレクションで異なり、オブジェクトは繰り返されません。
String(String、Integer、Double ...など)などのオブジェクトの場合:
これらのカプセル化クラス自体がHashCode()メソッドを書き直しているため、書き換えられたメソッドの返品値は、参照アドレスではなく、オブジェクトのコンテンツに関連しています。これらのカプセル化されたクラスのequals()メソッドも書き直され、参照アドレスではなくオブジェクトのコンテンツを比較します。一言で言えば、文字列などのクラスのオブジェクトは、コレクション内のコンテンツを比較し、同じコンテンツが上書きされた場合、既存のオブジェクトがカバーされます。
上記はこの記事に関するものです。すべての人の学習に役立つことを願っています。