java.util.HashSet中的contains()方法的行为与我对它的预期不同

时间:2011-04-20 06:42:14

标签: java hashset

这是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))。“

那么,谁能解释我哪里错了?或者......?

感谢。

2 个答案:

答案 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 equalshashCode的实现基于地址(或对象ID)。如果您覆盖equals进行内容比较,则应覆盖hashCode以根据内容生成哈希值。