HashSet除了在元素的儲存上是無序的以外,還是不能夠儲存重複的元素。
HashSet如何判斷元素是否重複呢?是根據元素繼承的兩個方法來判斷,hashCode和equals,當儲存元素時,首先判斷要存入的元素和已存在的元素的雜湊值是否相同,若不相同存入,若相同則利用equals判斷兩個元素是否相同,若不相同,則存入,若相同則放棄。而hashCode和equlas是在存入元素自動呼叫的。
一下繼續利用Person類舉例
import java.util.*; class Person { private String name; //姓名 private int age; //年齡 public Person(String name, int age) { this.name = name; this.age = age; } //用於生成自定義的雜湊值 public int hashCode() { return this.name.hashCode()+this.age*36; } //自己定義比較規則,與ArrayList相同 public boolean equals(Object obj) { if(!(obj instanceof Person)) return false; Person p = (Person)obj; return p.getName().equals(this.getName()) && (p.getAge() == this.getAge()); } public String getName() { return this.name; } public int getAge() { return this.age; } public void setName(String name) { this.name = name; } public void setAge(int age) { this.age = age; } } public class Test { public static void main(String[] args) { HashSet<Person> hs = new HashSet<>(); hs.add(new Person("zhangsan", 23)); hs.add(new Person("lisi", 23)); hs.add(new Person("zhangsan", 23)); hs.add(new Person("wangwu", 35)); hs.add(new Person("zhangsan", 67)); hs.add(new Person("zhaoliu", 45)); Iterator<Person> it = hs.iterator(); while(it.hasNext()) { Person p = it.next(); System.out.println(p.getName()+"...."+p.getAge()); } } }