java 中如何比较对象?

How objects are compared in java?

所以很长一段时间我认为使用 equals() 比较对象使用 hashcode() ,这意味着如果 2 个对象具有相同的哈希码它 returns true.

源代码中的 equals() 方法:

@see java.lang.System #identityHashCode
public boolean equals(Object obj) {
        return (this == obj);
    }

所以我创建了这个:

public static void main(String[] args) {
        Dog rover = new Dog("Rover");
        Dog german = new Dog("Rover2");

        System.out.println("German: " + german + "\tRover: " + rover);
        System.out.println(german.equals(rover));


    }

我也将 hashCode() 重写为:

    @Override
    public final boolean equals(Object obj) {
        if (this == obj)
            return true;
    }

    @Override
    public int hashCode() {
        //The main point of 0 is to check how equals actually work
        return 0;
    }

现在打印语句打印错误,即使两个对象都是@Dog0。 想知道为什么 控制台:

German: Animal.Dog@0    Rover: Animal.Dog@0
false

它们不是 "equal" 的原因与哈希码无关。

不相等的原因是这个条件:

this == obj

returns true 仅当 objthis.
相同的 对象 您有 2 个对象,所以这不可能。

还有,从源码可以看出,调用equals()并没有调用hashCode()。据我所知,没有实现(无论如何在JDK中),其中equals()调用hashCode()

您将 equals 用作 "alias" 进行 this == obj 比较 这是错误的,这就是它不起作用的原因。

对象具有 equals 方法,因为 this == obj 只有 return 如果它实际上是完全相同的对象(内存中的相同引用)才为真。

您需要做的是手动比较 equals 方法中的属性,只有 return 匹配才为真。