【发布时间】:2018-06-11 12:36:11
【问题描述】:
考虑员工类 -
public class Employer implements Serializable{
private Long id;
private String name;
@Override
public boolean equals(Object obj) {
if (obj == null)
return false;
if (obj instanceof Employer) {
Employer employer = (Employer) obj;
if (this.id == employer.id) {
return true;
}
}
return false;
}
//Idea from effective Java : Item 9
@Override
public int hashCode() {
int result = 17;
result = 31 * result + id.hashCode();
//result = 31 * result + name.hashCode();
return result;
}
}
创建了 2 个员工对象 -
Employer employer1 = new Employer();
employer1.setId(10L);
Employer employer2 = new Employer();
employer2.setId(11L);
将它们添加到哈希集中后,大小将为 2。 HashSet 内部使用 hashmap 来保持唯一性-
private transient HashMap<E,Object> map;
public boolean add(E e) {
return map.put(e, PRESENT)==null;
}
现在,如果我将第二个员工的 id 设置为与第一个员工的相同,即-
employer2.setId(10L);
大小仍然是 2。 为什么不是1?内部变量会被破坏吗?
【问题讨论】:
-
在一般情况下,对存储在 HashSet 中的对象的 any 突变(或者,就此而言,几乎任何其他基于散列或比较的数据结构)除非另有证明,否则应假定违反了数据结构的不变量。