2012-01-13 39 views
-3

我有关于java equals和hashcode的声明。这个声明对重写hashcode和equals有什么意义?

如果我们用这样一个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; 
    } 
} 
+6

您需要引用更多 – hvgotcodes 2012-01-13 15:17:33

+0

这样一个Integer对象吗?哪一个??? – edutesoy 2012-01-13 15:18:24

+1

这个陈述来自哪里?什么是完整的上下文? – weekens 2012-01-13 15:18:41

回答

12

您误会了!阅读整个款:

会发生如果整数没有覆盖equals()和hashCode()? 没有,如果我们从来没有使用Integer作为HashMap或其他基于散列的集合中的键。但是,如果我们要在HashMap中使用一个整数对象作为关键字,我们将无法可靠地 检索相关值,除非我们在get()调用中使用了完全相同的Integer 实例在put()调用中。

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。这意味着也有拳击投入到等式中!

+0

+1为研究! – fge 2012-01-13 15:20:02

+1

+1:叹气。阅读:开发人员最重要的技能。 – 2012-01-13 15:22:38

+0

这是一个天真的问题。 – Joe 2012-01-13 15:24:07

2

full context of the quote

如果整数没有重写equals()和hashCode()会发生什么? 没有,如果我们从来没有使用Integer作为HashMap或其他基于散列的集合中的键。但是,如果我们要在HashMap中使用一个整数对象作为关键字,我们将无法可靠地 检索相关值,除非我们在get()调用中使用了完全相同的Integer 实例在put()调用中。

Java中的默认相等性测试是严格的实例相等性测试(即,当且仅当var1var2指向内存中的相同对象时,var1var2相等。但是,如果您使用Integer作为Map的关键字,那么您可能需要将代表的实际号码作为关键字(而不是Integer实例本身),这与此严格相等性测试不兼容。因此,Integer必须覆盖hashCodeequals才能完成此工作(它的工作)。

+0

注意:Integer会覆盖hashCode并且等于正确。 – jjmontes 2012-01-13 15:22:17

0

您的问题缺少一些信息。

你在说什么是具体的.hashcode().equals()合同。他们需要遵循某些特性才能使它们正确,从而可以被依赖它们的其他类使用(Java Collections广泛使用了.hashcode().equals())。

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

“Effective Java”一书对这些方法也有非常好的提示。

相关问题