如何定义我自己的元素类以用于Set

我有以下代码:

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 set = new HashSet(); 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而且是真的。 为什么我的元素不被认为是相同的,我该如何纠正? 谢谢,韦恩。

您需要根据常规合约在MyElement上实现equals(Object o)hashCode() 。 缺少Set.contains()将使用比较对象的内存地址的默认实现。 由于您在contains调用中创建了一个新的MyElement实例,因此它返回false。

你应该覆盖一个equals(MyElement me)函数。 Equals返回一个布尔值

否则,您正在检查两个项目是否是对象的相同实例,而不是它们的内部内容是相同的。

 MyElement(String name, String type) { this.name = name; this.type = type; } public boolean Equals(MyElement me) { return this.name.equals(me.name) && this.type.equals(me.type); }