【发布时间】:2021-05-12 09:14:40
【问题描述】:
我有一个集合,其中添加了两个不同的对象。插入后,我以两个对象相等的方式更改其中一个对象(由对象类中覆盖的 equals 方法验证)。此时我在一个集合中有两个重复的元素。现在我尝试将这两个重复的对象添加到一个新集合中,即使 equals 方法为它们返回 true,我仍然可以添加它们。下面是相同的代码。谁能告诉我我到底错过了什么?
public class BasicSetImpl{
public int num; String entry;
public BasicSetImpl(int num, String entry){
this.num = num;
this.entry = entry;
}
@Override
public int hashCode() {
return Objects.hash(entry, num);
}
@Override
public boolean equals(Object obj) {
BasicSetImpl newObj = (BasicSetImpl)obj;
if (this.num == newObj.num)
return true;
else
return false;
}
public static void main(String[] args){
Set<BasicSetImpl> set = new HashSet<>();
BasicSetImpl k1 = new BasicSetImpl(1, "One");
BasicSetImpl k2 = new BasicSetImpl(2, "Two");
set.add(k1);
set.add(k2);
k2.num = 1;
System.out.println(k1.equals(k2)); //This line returns True
Set<BasicSetImpl> newSet = new HashSet<>();
newSet.add(k1);
newSet.add(k2);
//Set.size here is two
【问题讨论】:
-
如果两个对象相等(根据
equals方法),那么两个对象必须从它们的hashCode方法返回相同的值。在您的代码中并非如此。参考stackoverflow.com/questions/2265503/…
标签: java collections set