没有覆盖hashCode()和equals()方法。但是我可以找到我的东西

时间:2014-08-18 14:25:46

标签: java

根据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之间的区别吗?

2 个答案:

答案 0 :(得分:4)

在案例1中,您正在搜索您插入的同一个Dog1实例,这意味着来自hashCode()的{​​{1}}实现工作得很好(事实上,任何理智的实现都可以正常工作,因为你使用完全相同的对象)。

在第二种情况下,您在插入和检索时使用了两个不同的实例,但这些实例并不起作用。 Object方法通常通过将对象的内部地址转换为整数来实现,这意味着两个实例几乎总是具有不同的哈希码。

答案 1 :(得分:0)

在两种方式中,Dog对象都不会覆盖equals和hashcode。

方法1

使用相同的Dog参考来放置和加载。因此,如果未覆盖哈希码,则使用对象内存位置。由于两个参考都是相同的。所以使用相同的内存位置。然后它工作正常。

方法2 在这种方法中使用两种不同的参考。所以两个内存位置都不同。然后map没有找到第二个内存位置的值。