我有以下代码:
public class MyElement {
String name;
String type;
MyElement(String name, String type) {
this.name = name;
this.type = type;
}
}
public class Test {
public static void main(String[] args) {
Set<MyElement> set = new HashSet<MyElement>();
set.add(new MyElement("foo", "bar"));
set.add(new MyElement("foo", "bar"));
set.add(new MyElement("foo", "bar"));
System.out.println(set.size());
System.out.println(set.contains(new MyElement("foo", "bar")));
}
}
执行时返回:
3
false
我原本期望结果是1而且是真的。为什么我的元素不被认为是相同的,我该如何纠正? 谢谢, 韦恩。
答案 0 :(得分:12)
您需要根据一般合约在MyElement上实施equals(Object o)
和hashCode()
。缺少Set.contains()
将使用比较对象的内存地址的默认实现。由于您在包含调用中创建了一个新的MyElement实例,因此它将返回false。
答案 1 :(得分:1)
你应该覆盖一个equals(MyElement me)函数。 Equals返回一个布尔值
否则,您正在检查两个项目是否与对象的实例相同,而不是它们的内部内容相同。
MyElement(String name, String type) {
this.name = name;
this.type = type;
}
public boolean Equals<MyElement>(MyElement me) {
return this.name.equals(me.name) && this.type.equals(me.type);
}