保证唯一性
HashSet是调用的HashMap的put()方法,而put()方法中有这么一行逻辑,如果哈希值和key都一样,就会直接拿新值覆盖旧值,而HashSet就是利用这个特性来保证唯一性。
if (p.hash == hash && ((k = p.key) == key || (key != null && key.equals(k))))
e = p;
所以在存放对象的时候需要重写hashCode()和equals()方法,因为就是用这两个方法来判断唯一性的,否则就会出现下面这样的情况,创建两个属性一样的对象,放入HashSet中会发现重复了,那是因为创建两个对象肯定哈希值是不一样的,所以需要自己重写hashCode()和equals()。
public class TestVo {
int id;
String name;
public TestVo(int id, String name) {
this.id = id;
this.name = name;
}
@Override
public String toString() {
return "TestVo{" +
"id=" + id +
", name='" + name + '\'' +
'}';
}
}
public static void main(String[] args){
HashSet set = new HashSet();
TestVo testVo1 = new TestVo(1,"a");
TestVo testVo2 = new TestVo(1,"a");
set.add(testVo1);
set.add(testVo2);
Iterator iterator = set.iterator();
while (iterator.hasNext()){
System.out.println(iterator.next());
}
}
// 输出结果
TestVo{id=1, name='a'}
TestVo{id=1, name='a'}
重写hashCode()和equals()方法,都基于id来判断,这样重复``id的就不会重复存入了,所以存入对象的时候是可以自己设置按什么规则来去重的。
@Override
public int hashCode() {
return id;
}
@Override
public boolean equals(Object obj) {
return obj.equals(id);
}
}
// 输出结果
TestVo{id=1, name='a'}