两个不同的对象可以具有相同的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));
}
}
OutPut: -
爱子
爱子
然而,d1的值是aiko1,但是当我们取出时,打印的值是aiko。我们如何获取实际的d1值?
答案 0 :(得分:0)
由于您的密钥(d1
和d2
)相等(根据您对eqauls(Object)
的实现),因此地图中没有两个元素 - 只有一个。第二次调用put
会覆盖之前的值。
答案 1 :(得分:0)
让我向您解释HashMap
在这种情况下的工作原理。
hashCode()
方法HashMap
会先查看。length
name
字段作为哈希码。HashMap
将落到equals
方法,以进一步检查它,再次被你覆盖。equals
再次,你在做同样的事情。您还可以在此处比较name
字段的长度。您可以对其进行验证,但在m.size()
方法的末尾调用main
。
但我建议使用String
作为名称字段的键。
Map<String, Object> m = new HashMap<String, Object>();
在这种情况下,您不需要覆盖hashCode
以及equals
。
import java.util.HashMap;
import java.util.Map;
class Dog {
public String name;
public Dog(String n) {
this.name = n;
}
@Override
public String toString() {
return name;
}
}
public class MapTest {
public static void main(String ar[]) {
Map<String, Object> m = new HashMap<String, Object>();
Dog d1 = new Dog("clover");
Dog d2 = new Dog("abcdef");
m.put(d1.name, new Dog("aiko1"));
m.put(d2.name, new Dog("aiko"));
System.out.println(m.get(d1.name));
System.out.println(m.get(d2.name));
}
}