我們指定Set集合特征是:元素不可以重復,是無序的。
HashSet實現了Set接口,也就繼承了Set的特征。
HashSet集合數據結構是哈希表,所以存儲元素的時候,使用的是元素的hashCode方法確定位置,如果位置相同,再通過元素的equals來確定是否相同。
舉個例子:往hashSet集合里面存人物,我們視姓名和年齡相同就表示同一個對象。
public class Demo {
public static void main(String[] args){
HashSet hs=new HashSet();
hs.add(new Person("duwenjun", 25));
hs.add(new Person("zhanmusi", 30));
//如果存儲的對象不復寫hashCode方法,會調用Object的hashCode方法,Object的hashCode方法
//是比較兩個對象的地址值。所以不復寫,下面的元素也會添加進去
hs.add(new Person("duwenjun", 25));
for(Person person : hs){
System.out.println(person);
}
}
}
class Person {
@Override
public int hashCode() {
// TODO Auto-generated method stub
return this.name.hashCode()+this.age*25;
}
@Override
public boolean equals(Object obj) {
// TODO Auto-generated method stub
//如果傳進來的是同一對象,直接返回true
if(this==obj)
return true;
if(!(obj instanceof Person)){
return false;
}
Person p=(Person) obj;
return this.name.equals(p.getName()) && this.age==p.getAge();
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
private int age;
private String name;
public Person(String name,int age){
this.age=age;
this.name=name;
}
@Override
public String toString() {
// TODO Auto-generated method stub
return this.name+":"+this.age;
}
}
運行結果:
duwenjun:25
zhanmusi:30我們可以看到,實現我們自定義的規則后,后面添加的duwenjun:25就沒有添加進去了。