java.util.HashSet中的contains()方法不像我期望的那样

art*_*rxe 0 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)));

    }

Run Code Online (Sandbox Code Playgroud)

我的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;

}

}
Run Code Online (Sandbox Code Playgroud)

结果是:

真正

根据HashSet规范,在这个方法中我读到:"如果此set包含指定的元素,则返回true.更正式地,当且仅当此set包含元素e时才返回true(o == null?e == null: o.equals(e))."

那么,任何人都可以解释我错在哪里吗?要么 ...?

谢谢.

Edw*_*uck 8

您需要实现适当的hashCode()功能.

public int hashCode() {
  // equal items should return the same hashcode
}
Run Code Online (Sandbox Code Playgroud)

Java utilites java.util包含许多依赖于散列的类.允许一个人在equals()他们认为合适时覆盖意味着必须正确覆盖hashCode()以匹配.

正确的实现hashCode()将为equals()返回true的任何两个对象返回相同的哈希值.散列相关函数在检查对象是否相等(以解决散列冲突)之前检查散列是否相等.