【发布时间】:2014-05-10 08:42:13
【问题描述】:
两个不同的对象可以有相同的hashCode并且相等。如何通过引用获取实际对象?
例如:-
class Dog {
public String name;
public Dog(String n){
this.name = n;
}
public boolean equals(Object o){
if((o instanceof Dog) && ((Dog)o).name.length() == this.name.length()){
return true;
}else{
return false;
}
}
public int hashCode(){
return name.length();
}
@Override
public String toString(){
return name;
}
}
public class MapTest {
public static void main(String ar[]){
Map<Object, Object> m = new HashMap<Object, Object>();
Dog d1 = new Dog("clover");
Dog d2 = new Dog("abcdef");
m.put(d1, new Dog("aiko1"))
m.put(d2, new Dog("aiko"));
System.out.println(m.get(d1));
System.out.println(m.get(d2));
}
}
输出:-
爱子
爱子
然而,d1 的值是 aiko1,但是当我们获取时,打印的值是 aiko。我们如何获取实际的 d1 值?
【问题讨论】:
-
我不明白你的问题。您已经拥有
d1。您正在使用它作为密钥。 -
缺陷在于您的
equals()方法。你说 Dog("clover")` 和 Dog("abcdef") 是一样的。那么你期待什么?键 d2 和 d1 相同!因此 m.put(d2,...) 替换条目 (d1, Dog("aiko1"))。 -
我想了解如果两个对象具有相同的哈希码,哈希图是如何工作的?通过 Hashcode 合约,如果 hashcode 相同,则通过 equals 方法对象应该相同。当哈希码相同时,有没有一种方法可以在 java 中检索 d1 值?
-
如果两只狗的名字长度相同,你真的打算断言它们相等吗?例如,Fido 等于 Spot 吗?这对我来说似乎是一个奇怪的断言。
-
"通过 Hashcode 合约,如果 hashcode 相同,那么通过 equals 方法的对象应该相同。" 这是错误的!反之亦然:如果两个对象相等,则它们必须具有相同的哈希码。哈希码方法应该努力为不相等的对象产生不同的哈希码,但它们可能是相同的。
标签: java data-structures map hashmap