下面的代码包含一组CustomObjects。我正在尝试搜索其中的对象。
我已经覆盖了equals()方法以将其与特定字段匹配,我无法理解为什么它无法找到它。
" XX \ t未找到\ tXX"
正在打印 的
"实测值!!"
import java.util.HashSet; import java.util.Set;
public class TestEquals {
private static Set<CustomObject> setCustomObjects;
public static void main(String[] args){
setCustomObjects = new HashSet<CustomObject>();
setCustomObjects.add(new CustomObject(2, "asas"));
setCustomObjects.add(new CustomObject(3, "gdhdf"));
setCustomObjects.add(new CustomObject(4, "bnbv"));
setCustomObjects.add(new CustomObject(5, "ljhj"));
AnotherObject anObj = new AnotherObject(3, 4);
if(setCustomObjects.contains(anObj)){
System.out.println("Found!!");
}else{
System.out.println("XX\tNot Found\tXX");
}
}
}
class CustomObject {
public CustomObject(int test, String name) {
this.test = test;
this.name = name;
}
private int test;
private String name;
@Override
public boolean equals(Object obj) {
if(obj instanceof AnotherObject){
AnotherObject temp = (AnotherObject)obj;
System.out.println("test" + temp.getOtherTest());
return this.test == temp.getOtherTest();
}
return true;
}
@Override
public int hashCode() {
int hash = 22;
hash = 32 * hash + this.test;
return hash;
}
}
class AnotherObject {
public AnotherObject(int otherTest, double test2) {
this.otherTest = otherTest;
this.test2 = test2;
}
private int otherTest;
private double test2;
public int getOtherTest() {
return otherTest;
}
public void setOtherTest(int otherTest) {
this.otherTest = otherTest;
}
}
答案 0 :(得分:2)
您尚未在equals
中覆盖hashCode
和AnotherObject
。这样做,你应该得到你期望的。
答案 1 :(得分:1)
这是不是一个好习惯,不要试图将来自不同无关类的2个对象视为等于。
您可以通过使用来自其他类的相同逻辑为hashCode()
编写AnotherObject
来解决此问题,但是您将拥有重复的代码,因为这两个类都需要它如果您希望使用HashSet将其视为相等,则以相同的方式计算
答案 2 :(得分:0)
HashSet内部使用HashMap。你的CustomObject&amp; AnotherObject哈希也必须等于找到它。
根据您所关注的int为AnotherObject实现hashCode。