这是java main()方法:
public static void main(String[] args) {
HashSet set = new HashSet();
Mapper test = new Mapper("asd", 0);
set.add(test);
System.out.println(new Mapper("asd", 0).equals(test));
System.out.println(set.contains(new Mapper("asd", 0)));
}
我的Mapper类是:
class Mapper {
String word;
Integer counter;
Mapper (String word, Integer counter) {
this.word = word;
this.counter = counter;
}
public boolean equals(Object o) {
if ((o instanceof Mapper) && (((Mapper)o).word == this.word)) {
return true;
}
return false;
}
}
结果是:
真
假
根据HashSet规范,在这个方法中我读到:“如果此set包含指定的元素,则返回true。更正式地,当且仅当此set包含元素e时才返回true(o == null?e = = null:o.equals(e))。“
那么,谁能解释我哪里错了?或者......?
感谢。
答案 0 :(得分:8)
您需要实施正确的hashCode()
功能。
public int hashCode() {
// equal items should return the same hashcode
}
Java utilites java.util
包含许多依赖于散列的类。要允许其覆盖equals()
,因为他们认为合适,也必须正确覆盖hashCode()
才能匹配。
hashCode()
的正确实现将为equals()
返回true的任何两个对象返回相同的哈希值。散列相关函数在检查对象是否相等(以解决散列冲突)之前检查散列是否相等。
答案 1 :(得分:1)
hashCode contract表示如果两个对象相等,则它们应具有相同的哈希码。像HashSet
这样的集合假设这是坚持的。
Object
equals
和hashCode
的实现基于地址(或对象ID)。如果您覆盖equals
进行内容比较,则应覆盖hashCode
以根据内容生成哈希值。