这个陈述对重写hashcode和equals意味着什么?

时间:2012-01-13 15:15:45

标签: java hash hashcode

我有关于java equals和hashcode的声明。

  

如果我们将这样的Integer对象用于HashMap中的键,我们将无法可靠地检索关联值

这意味着什么?为什么它说“不可靠”?我写了一个测试程序,它总是有效。

public class Test1 {

    public static void main(String[] args){
        Map<Integer, Student> map = new HashMap<Integer, Student>();

        map.put(1, new Student("john"));        
        map.put(2, new Student("peter"));

        Student s1 = map.get(1);
        Student s2 = map.get(1);
        Student s3 = map.get(2);
        System.out.println("s1:"+s1+" s2:"+s2+" s3:"+s3);

        System.out.println(s1==s2);
        System.out.println(s1==s3);
        System.out.println(s1.equals(s3));
        System.out.println(s1.equals(s2));
    }   
}

class Student{
    private String name;
    public Student(String name){        
        this.name = name;       
    }

    public String getName(){
        return this.name;
    }   
}

3 个答案:

答案 0 :(得分:12)

你误会了!阅读整个段落:

  

如果Integer没有覆盖equals()和hashCode(),会发生什么?strong?   没有,如果我们从未使用过Integer作为HashMap或其他的键   基于散列的集合。但是,如果我们使用这样的整数   对象是HashMap中的键,我们无法可靠   检索关联的值,除非我们使用完全相同的Integer   我们在put()调用中执行的get()调用中的实例。

http://www.ibm.com/developerworks/java/library/j-jtp05273/index.html

这就是说Integer类必须有hashCode()方法和equals()才能工作。 确实拥有这些方法,所以没关系。它会起作用。

示例说,不应比较对存储值的对象的引用,因为具有相同整数值的两个Integers实际上可能是不同的对象。

Integer x = new Integer(5);
Integer y = new Integer(5);

x.equals(y)永远是真的。 x == y并非总是如此(但有时也可以)。规则会针对不同的价值范围而变化。除非您完全确定自己知道自己在做什么,否则永远不要依赖==任何对象引用。

另请注意,您传递的int参数(基本类型)不是Integers(对象的引用),但您的集合的泛型类型为Integer。这意味着还有拳击投入等式!

答案 1 :(得分:2)

full context of the quote

  

如果Integer没有覆盖equals()和hashCode()会发生什么?   没有,如果我们从未使用过Integer作为HashMap或其他的键   基于散列的集合。但是,如果我们使用这样的整数   对象是HashMap中的键,我们无法可靠   检索关联的值,除非我们使用完全相同的Integer   get()调用中的实例,就像我们在put()调用中所做的那样。

Java中的默认相等性测试是严格的实例相等性测试(即var1var2当前且仅当var1var2指向同一对象时相等在记忆中)。但是,如果您使用Integer作为Map的密钥,您可能希望它所代表的实际数字成为密钥(而不是Integer实例本身),这与此严格的相等测试不兼容。因此,Integer必须覆盖hashCodeequals才能完成这项工作(它会这样做)。

答案 2 :(得分:0)

您的问题缺少一些信息。

您所谈论的是具体的.hashcode().equals()合同。他们需要遵循某些属性才能使它们正确,因此可供其他依赖它们的类使用(Java Collections广泛使用.hashcode().equals())。

这里有很好的解释:http://www.technofundo.com/tech/java/equalhash.html

“Effective Java”这本书对这些方法也有很好的提示。