java - == 运算符和 equals() 有什么区别? (使用哈希码()???)

标签 java operators equals hashcode

我正在更深入地学习哈希码并认为:

<强>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/

相关文章:

java - Arrays.deepEquals 在 2 个相同的数组上返回 false

java - 如何在 Selenium 网络驱动程序中将鼠标悬停在图像上以获取菜单列表

c++ - 比较运算符重载

performance - Matlab 性能 : comparison slower than arithmetic

scala - 如何在 Scala 中定义赋值运算符?

java - 为自定义类实现 hashcode 和 equals

java - 使用 .equals() 和 == 运算符比较两个对象

java - 我应该在公共(public)类中使用静态类,还是只是一个单独的类

java - 骡子 ESB : xml to maps transformer produces empty hashmaps

java - 在java服务器/客户端编程中提升到一个新的水平