我有关于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;
}
}
答案 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)
如果Integer没有覆盖equals()和hashCode()会发生什么? 没有,如果我们从未使用过Integer作为HashMap或其他的键 基于散列的集合。但是,如果我们使用这样的整数 对象是HashMap中的键,我们无法可靠 检索关联的值,除非我们使用完全相同的Integer get()调用中的实例,就像我们在put()调用中所做的那样。
Java中的默认相等性测试是严格的实例相等性测试(即var1
和var2
当前且仅当var1
和var2
指向同一对象时相等在记忆中)。但是,如果您使用Integer
作为Map
的密钥,您可能希望它所代表的实际数字成为密钥(而不是Integer
实例本身),这与此严格的相等测试不兼容。因此,Integer
必须覆盖hashCode
和equals
才能完成这项工作(它会这样做)。
答案 2 :(得分:0)
您的问题缺少一些信息。
您所谈论的是具体的.hashcode()
和.equals()
合同。他们需要遵循某些属性才能使它们正确,因此可供其他依赖它们的类使用(Java Collections广泛使用.hashcode()
和.equals()
)。
这里有很好的解释:http://www.technofundo.com/tech/java/equalhash.html。
“Effective Java”这本书对这些方法也有很好的提示。