这个声明对重写hashcode和equals有什么意义?
我有关于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;
}
}
您误会了!阅读整个款:
会发生如果整数没有覆盖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
。这意味着也有拳击投入到等式中!
如果整数没有重写equals()和hashCode()会发生什么? 没有,如果我们从来没有使用Integer作为HashMap或其他基于散列的集合中的键。但是,如果我们要在HashMap中使用一个整数对象作为关键字,我们将无法可靠地 检索相关值,除非我们在get()调用中使用了完全相同的Integer 实例在put()调用中。
Java中的默认相等性测试是严格的实例相等性测试(即,当且仅当var1
和var2
指向内存中的相同对象时,var1
和var2
相等。但是,如果您使用Integer
作为Map
的关键字,那么您可能需要将代表的实际号码作为关键字(而不是Integer
实例本身),这与此严格相等性测试不兼容。因此,Integer
必须覆盖hashCode
和equals
才能完成此工作(它的工作)。
注意:Integer会覆盖hashCode并且等于正确。 – jjmontes 2012-01-13 15:22:17
您的问题缺少一些信息。
你在说什么是具体的.hashcode()
和.equals()
合同。他们需要遵循某些特性才能使它们正确,从而可以被依赖它们的其他类使用(Java Collections广泛使用了.hashcode()
和.equals()
)。
这里很好地解释了:http://www.technofundo.com/tech/java/equalhash.html。
“Effective Java”一书对这些方法也有非常好的提示。
您需要引用更多 – hvgotcodes 2012-01-13 15:17:33
这样一个Integer对象吗?哪一个??? – edutesoy 2012-01-13 15:18:24
这个陈述来自哪里?什么是完整的上下文? – weekens 2012-01-13 15:18:41