
由于Set集合是不存儲(chǔ)重復(fù)元素的,所以在做此案例時(shí),如果我正常添加一個(gè)重復(fù)元素是什么結(jié)果呢?
public class HashSetDemo {
public static void main(String[] args) {
//創(chuàng)建HashSet集合對(duì)象
HashSet<Student> hashSet = new HashSet<Student>();
//創(chuàng)建學(xué)生對(duì)象
Student s1 = new Student("愛學(xué)習(xí)", 21);
Student s2 = new Student("愛Java", 22);
Student s3 = new Student("堅(jiān)持不懈", 23);
Student s4 = new Student("愛Java", 22);
//把學(xué)生添加到集合
hashSet.add(s1);
hashSet.add(s2);
hashSet.add(s3);
hashSet.add(s4);
//遍歷集合(增強(qiáng)for循環(huán))
for (Student s : hashSet) {
System.out.println(s.getName() + "," + s.getAge());
}
}
}
運(yùn)行結(jié)果:

通過運(yùn)行結(jié)果,我們發(fā)現(xiàn),重復(fù)的元素仍然被添加進(jìn)去,是什么原因呢? 根據(jù)源碼分析和HashSet底層數(shù)據(jù)結(jié)構(gòu)可以知道,如果兩個(gè)對(duì)象的哈希值相同(hashCode方法),并且對(duì)象的內(nèi)容也相同(equals方法),是不會(huì)存儲(chǔ)在哈希表的。所以我們需要在被存儲(chǔ)的對(duì)象類中重寫hashCode方法和equals方法,來解決添加了重復(fù)元素的問題。
在對(duì)象類中重寫hashCode方法和equals方法后(自動(dòng)生成即可)運(yùn)行上面的代碼,運(yùn)行結(jié)果:

可見,重復(fù)的元素未被添加到集合。
