0

我了解在类中覆盖哈希码和等于的基本概念,但是谁能给我一个示例(代码),其中等于仅因为哈希码未被覆盖而失败?提前致谢。

4

2 回答 2

5

并不是它equals本身会失败——而是任何依赖于合同hashCode及其关系的东西equals都可能失败。这是一个例子:

import java.util.*;

final class Person {
    private final String name;

    public Person(String name) {
        // TODO: Nullity prohibition
        this.name = name;
    }

    @Override
    public boolean equals(Object other) {
        if (other == null || other.getClass() != Person.class) {
            return false;
        }
        return name.equals(((Person)other).name);
    }
}

class Test {
    public static void main(String[] args) throws Exception {
        Person p1 = new Person("Jon");
        Person p2 = new Person("Jon");
        System.out.println(p1.equals(p2)); // true

        Set<Person> people = new HashSet<Person>();
        people.add(p1);
        people.add(p2);
        System.out.println(people.size()); // 2!
    }
}

HashSet假设因为p1.hashCode()p2.hashCode()等于 ,所以两个元素必须不相等,所以都可以在集合中。hashCode()如果被适当地覆盖,那将不会发生。

同样,您可以拥有(Person同班);

Map<Person, String> map = new HashMap<Person, String>();
map.put(p1, "foo");
System.out.println(map.get(p2)); // null

如果两个对象返回相同的哈希码,这打印出“foo”,正如它们的本意那样——但同样,因为它们没有,所以HashMap认为不匹配。

Eric Lippert 的博客文章GetHashCode很好地介绍了这一点 - 它基于 C#,但同样适用于 Java。

于 2013-07-15T20:05:41.290 回答
0

如果您的 equals 失败,那是因为您实施了 equals 错误。

以下是如何正确执行此操作:Java 中覆盖 equals 和 hashCode 时应考虑哪些问题答案?.

但是,只是为了好玩,这里有一个 equals 方法的示例,如果未覆盖哈希码,该方法将失败:

//NEVER DO THIS
@Override
public boolean equals(Object o){
    ThisObject obj = (ThisObject)o;
    return this.hashCode() == obj.hashCode();
}
于 2013-07-15T20:06:03.507 回答