==运算符和equals()之间有什么区别?(用hashcode()???)

mas*_*san 4 java equals operators hashcode

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

1.如果重写equals(),则必须覆盖hashcode().

2.要查找2个对象是否是同一个对象,请使用==运算符

考虑到这两个因素,在Java中我假设当== operator用于比较2个实例是否相同时,

if(object1 == object2)
Run Code Online (Sandbox Code Playgroud)

实际上是在做

if(object1.hashcode() == object2.hashcode())
Run Code Online (Sandbox Code Playgroud)

但是通过下面的测试看起来我错了.

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

根据使用的测试,== operator看看是否equals()被调用,它不是.

所以我的问题是,如果== operator可以用来比较对象是否相同,重写e quals()hashCode()比较方法的重点是什么?是不是== operator已经做好了工作?

参考:

覆盖hashCode() - 这还不错吗?

http://mindprod.com/jgloss/hashcode.html

http://download.oracle.com/javase/1.4.2/docs/api/java/lang/Object.html#equals(java.lang.Object)

hvg*_*des 5

==运算符确定2个引用是否指向同一个对象.

所以

 Object o1 = new Object();
 Object o2 = o1;

 o1 == o2; //true

 o2 = new Object();

 o1 == o2 // false
Run Code Online (Sandbox Code Playgroud)

Object.equals()方法是"我如何确定对同一对象的2个引用是否相等?"

如果两个引用指向同一个对象,则两者都有

o1 == o2 
o1.equals(o2) 
Run Code Online (Sandbox Code Playgroud)

应该是真的.

但是如果o1和o2不是同一个对象,它们在逻辑上仍然可能相等.对于任何给定的类,equals取决于对象背后的语义.例如,考虑一个类,其中field1和field2由用户设置,但是field3被计算并且具有计算的随机元素.在这种情况下将equals定义为仅依赖于field1和field2而不是field3可能是有意义的.这就是为什么平等是必要的.

  • hashcode由各种基于散列的集合使用,如HashSets.您决定是否在equals中使用hashcode,但请注意,如果2个对象返回相同的哈希码并不总是如此,则它们是相等的.我不会. (2认同)

Lau*_*ves 5

== 是身份。

.equals() 是平等。

.equals()默认为仅使用==(就像hashCode()默认为,System.identityHashCode()但如果有更有意义的方法来检查相等性,您可以覆盖它们。通常这是一种“结构”相等性。即:是所有部分this .equal()到所有部分that?