根据SCJP的书,如果我们不重写被用作密钥一部分的类中的hashCode()和equals()方法,我们的代码应该运行并编译,但我们不会找到东西。
没有覆盖我使用密钥的一部分的类中的hashCode()和equals()方法,但我可以获取检索的值。
请找到以下代码:
案例1:
import java.util.HashMap;
import java.util.Map;
class Dog1{
public Dog1(){}
public Dog1(String n) {
// TODO Auto-generated constructor stub
name=n;
}
String name;
}
public class MapGen {
public static void main(String[] args) {
Map<Object,Object> m = new HashMap<Object,Object>();
Dog1 d1=new Dog1("Clover");
//Dog1 d2 =new Dog1("Clover");
m.put(d1, "XYZ");
System.out.println(""+m.get(d1));
System.out.println(""+m.size());
}
}
输出:
XYZ
1
在以下情况下,我可以看到它无法检索该值。 案例2:
import java.util.HashMap;
import java.util.Map;
class Dog1{
public Dog1(){}
public Dog1(String n) {
// TODO Auto-generated constructor stub
name=n;
}
String name;
}
public class MapGen {
public static void main(String[] args) {
Map<Object,Object> m = new HashMap<Object,Object>();
Dog1 d1=new Dog1("Clover");
//Dog1 d2 =new Dog1("Clover");
m.put(new Dog1(), "XYZ");
System.out.println(""+m.get(new Dog1()));
System.out.println(""+m.size());
}
}
输出:
null
1
任何人都能解释一下案例1和案例2之间的区别吗?
答案 0 :(得分:4)
在案例1中,您正在搜索您插入的同一个Dog1
实例,这意味着来自hashCode()
的{{1}}实现工作得很好(事实上,任何理智的实现都可以正常工作,因为你使用完全相同的对象)。
在第二种情况下,您在插入和检索时使用了两个不同的实例,但这些实例并不起作用。 Object
方法通常通过将对象的内部地址转换为整数来实现,这意味着两个实例几乎总是具有不同的哈希码。
答案 1 :(得分:0)
在两种方式中,Dog对象都不会覆盖equals和hashcode。
方法1
使用相同的Dog参考来放置和加载。因此,如果未覆盖哈希码,则使用对象内存位置。由于两个参考都是相同的。所以使用相同的内存位置。然后它工作正常。
方法2 在这种方法中使用两种不同的参考。所以两个内存位置都不同。然后map没有找到第二个内存位置的值。