如果我以 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
来过滤 double ,像这样:
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
set 不包含这些 double ?所以m1
和 m2
是不同的实例,但具有相同的内容,所以我只需要 m1
.
编辑
根据 Mathias Schwarz 的回答,我实现了 hashCode()
功能如下:
@Override
public int hashCode() {
return text.hashCode();
}
但是如果我有一个包含多个字段的更复杂的类,我该如何实现这个方法呢?
最佳答案
HashSet
根据对对象调用equals
和hashCode
的结果判断两个对象是否相同。如果您实现 equals
,则必须实现 hashCode
。如果它们不一致,HashSet
将无法正常运行...
所以重要的是这两个方法是如何在 MyObject
上实现的(顺便说一句,这实际上是一个类...)。
关于java - 集合的唯一性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12857882/