我正在更深入地学习哈希码并认为:
<强>1。如果您覆盖 equals(),您也必须覆盖 hashcode()。
<强>2。要查找 2 个对象是否为同一对象,请使用 == 运算符
考虑到这两个因素,在 Java 中我假设当 == 运算符
用于比较两个实例是否相同时,
if(object1 == object2)
实际上是在做
if(object1.hashcode() == object2.hashcode())
但是运行下面的测试看来我错了。
public class Main {
public static void main(String[] args){
Obj1 one = new Obj1();
Obj1 two = new Obj1();
//is this calling hashCode() in backend???
if(one == two) {
System.out.println("same");
}
else {
System.out.println("nope");
}
//this is of course return true
if(one == one) {
System.out.println("one and one is same");
}
}
}
class Obj1 {
@Override
public int hashCode() {
System.out.println("hashCode() is called");
return 111;
}
@Override
public boolean equals(Object another) {
System.out.println("equals() is called");
return false;
}
}
根据使用 == operator
的测试,看看是否调用了 equals()
,但没有调用。
所以我的问题是,如果 == operator
可以用来比较对象是否相同,重写 equals()
和 有什么意义>hashCode()
方法进行比较? == operator
不是已经完成这项工作了吗?
引用:
Overriding hashCode() - is this good enough?
http://mindprod.com/jgloss/hashcode.html
http://download.oracle.com/javase/1.4.2/docs/api/java/lang/Object.html#equals(java.lang.Object)
最佳答案
== 运算符确定 2 个引用是否指向同一个对象。
所以
Object o1 = new Object();
Object o2 = o1;
o1 == o2; //true
o2 = new Object();
o1 == o2 // false
Object.equals() 方法是“我如何确定对对象的 2 个引用(不是同一对象)是否相等?”
如果两个引用指向同一个对象,两者都是
o1 == o2
o1.equals(o2)
应该是真的。
但是如果 o1 和 o2 不是同一个对象,它们在逻辑上可能仍然是相等的。对于任何给定的类,equals 取决于对象背后的语义。例如,考虑一个类,其中 field1 和 field2 由用户设置,但 field3 是计算的并且其计算具有随机元素。在这种情况下,将 equals 定义为仅依赖于 field1 和 field2 而不是 field3 可能是有意义的。这就是为什么 equals 是必要的。
关于java - == 运算符和 equals() 有什么区别? (使用哈希码()???),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4505357/