如果我们在 HashSet 中添加两个不同的对象(可变的),然后通过调用 setter 更改对象的值(使它们相同),则大小仍然是 hashSet 的 2
我无法理解其原因:
public static void main(String[] args) {
Employee e = new Employee();
e.setName("Amit");
Employee e1 = new Employee();
e1.setName("Jitender");
Set<Person> hashSet = new HashSet<Person>();
hashSet.add(e);
hashSet.add(e1);
// size of set is >>2
System.out.println("size of set is >>" + hashSet.size());
e1.setName("Amit");
// updated size of set is >>2
System.out.println("updated size of set is >>" + hashSet.size());
}
员工类别是:
public class Employee extends Person {
public Employee() {
}
public Employee(String name) {
this.name = name;
}
String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public int hashCode() {
// TODO Auto-generated method stub
return name.hashCode();
}
@Override
public boolean equals(Object obj) {
Employee e = (Employee) obj;
return this.name.equals(e.name);
}
}
HashSet
不打算对其包含的对象的变化做出反应。事实上,文档警告不要将可变对象添加到集合中并修改它们。
来自Set接口文档 http://docs.oracle.com/javase/7/docs/api/java/util/Set.html:
注意:如果将可变对象用作集合元素,则必须格外小心。如果对象的值以影响等于比较的方式更改,而该对象是集合中的元素,则不会指定集合的行为。此禁止的一个特殊情况是不允许集合将其自身包含为元素。
(还有一点是HashSet
使用会员的equals()
and hashCode()
方法,这意味着如果您没有为您的Employee
, two Employee
s 将不相等,除非它们是对同一对象的两个引用Employee
目的。 )在您的编辑中,您表明您已经实现了这一点。
实际的“如果我这样做会发生什么?”请注意,如果您查看的源代码HashMap http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/util/HashMap.java (b/c a HashSet
被实现为HashMap
将您插入的条目映射到虚拟对象)您可以看到,仅在添加和删除变量时更新大小,并且即使重新散列表以增加容量,也没有相等性检查,因此,您的重复对象将保留在您刚刚通过执行不应该执行的操作而破坏的集合中。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)