Set インターフェイスは、List インターフェイスと同様に、Collection インターフェイスを継承します。Set インターフェイス内の要素には順序がなく、格納された要素が繰り返されないように特定のルールが使用されます。
HashSet は Set インターフェイスの実装クラスです。格納される要素は反復不可能であり、要素には順序がありません。HashSet コレクションにオブジェクトを追加するときは、まず、オブジェクトの hashCode() メソッドが呼び出され、オブジェクトのハッシュ値が計算され、要素の格納場所が決定されます。このときハッシュ値が同じ場合は、オブジェクトのequals()メソッドを呼び出して、この位置に重複する要素がないことを確認します。
package 集合类; import java.util.HashSet; import java.util.Iterator; public class Set { public static void main(String[] args) { HashSet set=new HashSet(); set.add("hello"); set.add("world"); set.add("abc"); set.add("hello"); Iterator it=set.iterator(); while(it.hasNext()){ Object obj=it.next(); System.out.print(obj+ " "); } } }
実行結果
## 実行結果から、要素を削除する順序と要素を追加する順序が一致しておらず、文字列が繰り返されていることがわかります。 HashSet コレクションの add() メソッドが要素を格納するとき、まず現在格納されているオブジェクトの hashCode() メソッドを呼び出してオブジェクトのハッシュ値を取得し、次にストレージを計算するため、追加されるのは 1 回だけです。ハッシュ値に基づく位置。この位置に要素がない場合、要素は直接保存されます。この位置に要素がある場合、equal() メソッドが呼び出され、現在保存されている要素と要素を比較します。この位置で。戻り結果が false の場合、要素はコレクションに格納されます。戻り結果が true の場合は、重複した要素があることを意味するため、その要素は破棄されます。package 集合类; import java.util.HashSet; class Student{ String id; String name; public Student(String id,String name){ this.id=id; this.name=name; } public String toString(){ String s = id + ":" + name; return s; } } public class Set1 { public static void main(String[] args) { HashSet hs=new HashSet(); Student stu1=new Student("1","hello"); Student stu2=new Student("2","world"); Student stu3=new Student("1","hello"); hs.add(stu1); hs.add(stu2); hs.add(stu3); System.out.println(hs); } }実行結果
重複要素が削除されない理由は、Student を定義するときに hashCode() メソッドとquals() メソッドがオーバーライドされなかったためです。クラス。
package API; import java.util.HashSet; class Student{ private String id; private String name; public Student(String id,String name){ this.id=id; this.name=name; } //重写toString方法 public String toString(){ return id+ ":"+name; } //重写hashCode方法 public int hashCode(){ //返回id属性的哈希值 return id.hashCode(); } public boolean equals(Object obj){ //判断是否是同一个对象 if(this==obj){ return true; } //判断对象是Student类型 if(!(obj instanceof Student)){ return false; } //将对象强转为Student类型 Student stu=(Student) obj; //判断id是否相同 boolean b=this.id.equals(stu.id); return b; } } public class Set2 { public static void main(String[] args) { HashSet hs=new HashSet(); Student stu1=new Student("1","hello"); Student stu2=new Student("2","world"); Student stu3=new Student("1","hello"); hs.add(stu1); hs.add(stu2); hs.add(stu3); System.out.println(hs); } }実行結果 Student クラスは Object クラスの hashCode() メソッドとquals() メソッドをオーバーライドするためです。 hashCode()メソッドでid属性のハッシュ値を返し、equals()メソッドでオブジェクトのid属性が等しいか比較して結果を返します。 HashSet コレクションの add() メソッドを呼び出して stu3 オブジェクトを追加すると、そのハッシュ値が stu2 オブジェクトと同じであることがわかり、stu2.equals(stu3) は true を返します。 HashSet は 2 つのオブジェクトが同じであると判断するため、重複する Student オブジェクトが削除されます。
以上がJava で Set インターフェイスを使用して重複要素のない配列を保存する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。