如果我以HashSet<E>
为例,并向其添加对象,它如何检查对象是否已存在?
我有以下简单的设置:
private class MyObject {
String text;
public MyObject(String text) {
this.text = text;
}
@Override
public boolean equals(Object o) {
if (o != null && o instanceof MyObject) {
return ((MyObject) o).text.equals(text);
}
return false;
}
}
在我的项目中,我有很多像这样的对象,但都是单独初始化的。我希望通过将所有内容添加到Set
来过滤双打,如下所示:
MyObject m1 = new MyObject("1");
MyObject m2 = new MyObject("1");
MyObject m3 = new MyObject("2");
System.out.println(m1.equals(m2)); //expected: true, result: true
System.out.println(m1.equals(m3)); //expected: false, result: false
Set<MyObject> myObjects = new HashSet<MyObject>();
myObjects.add(m1);
myObjects.add(m2);
myObjects.add(m3);
System.out.println(myObjects.size()); //expected: 2, result: 3
Set<String> stringList = new HashSet<String>();
stringList.add("1");
stringList.add("1");
stringList.add("2");
System.out.println(stringList.size()); //expected: 2, result: 2
我怎样才能使myObjects
集合不包含这些双打?因此m1
和m2
是不同的实例,但内容相同,所以我只需要m1
。
修改
根据Mathias Schwarz的回答,我已经实现了hashCode()
函数,如下所示:
@Override
public int hashCode() {
return text.hashCode();
}
但是如果我有一个包含多个字段的更复杂的类,我将如何实现此方法?
答案 0 :(得分:7)
HashSet
确定两个对象在对象上调用equals
和hashCode
的结果是否相同。如果您实施hashCode
,则必须实施equals
。如果它们不一致,HashSet
将无法正常运行......
所以重要的是如何在MyObject
上实现这两种方法(btw实际上是一个类......)。
答案 1 :(得分:2)
如果您使用eclipse,则右键单击 - &gt;来源 - &gt;生成hashCode和Equals 。如果您想了解更多有关哈希码的知识,请等同于this portion中的Effective Java。
答案 2 :(得分:1)
我同意Mathias Schwarz的观点。
有关详细信息:http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/Object.html#hashCode()和http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/Object.html#equals(java.lang.Object)
答案 3 :(得分:0)
将以下内容添加到您的类MyObject
中public String hashCode() {
return text.hashCode();
}
(我认为文本不为空。如果它可能为null,则必须将其转换为acccoutn并使NPE无效)