Mr *_*r A 0 java equals hashcode
我理解在类中重写hashcode和equals的基本概念,但是任何人都可以给我一个例子(代码),其中equals将失败只因为hashcode没有被覆盖?提前致谢.
它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!
}
}
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
如果两个对象返回相同的哈希码,这将打印出"foo",因为它们是 - 但同样,因为它们没有,因此HashMap认为没有匹配.
Eric Lippert的博客文章GetHashCode是对此的一个很好的介绍 - 它是基于C#的,但它同样适用于Java.
| 归档时间: |
|
| 查看次数: |
220 次 |
| 最近记录: |