【问题标题】:How objects are compared in java?java中如何比较对象?
【发布时间】:2017-10-14 17:40:30
【问题描述】:

所以很长一段时间以来,我一直认为对象是使用 equals() 进行比较的,后者使用 hashcode() ,这意味着如果 2 个对象具有相同的哈希码,则返回 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

【问题讨论】:

    标签: java equals hashcode


    【解决方案1】:

    您使用equals 作为this == obj 比较的“别名”这是错误的,这就是它不起作用的原因。

    对象具有equals 方法,因为this == obj 只有在它实际上是相同的对象(内存中的相同引用)时才返回true。

    您需要做的是手动比较equals方法中的属性,只有匹配时才返回true。

    【讨论】:

    • 那么在处理对象时,它会查看内存地址而不是哈希码以返回 true?
    • 是的,完全正确。它看起来你是否“指向”同一个对象并且与哈希码无关。
    【解决方案2】:

    它们不“相等”的原因与哈希码无关。

    它们不相等的原因是这种情况:

    this == obj
    

    仅当objthis相同 对象时才返回true
    你有 2 个对象,所以这不是真的。

    另外,从源代码中可以看出,调用equals() 不会调用hashCode()。 AFAIK,有 no 实现(无论如何在 JDK 中)equals() 调用 hashCode()

    【讨论】:

    • 可能是因为ObjecttoString()是如何实现的,所以出现了混淆。它打印:getClass().getName() + '@' + Integer.toHexString(hashCode())Òbject 的默认 hashCode() 实现将对象的 内部地址 转换为整数。这个内部地址也是== 操作符使用的地址,因此会造成混淆。
    • 也许值得将此添加到您的答案中:equals() 和 hashCode() 通过合同绑定在一起:如果 o1.equals(o2) 返回 true,则 o1.hashCode() == o2。 hashCode 也必须为真。相反的情况并非总是如此:两个对象可以具有相同的哈希码,但 equals 可能仍然返回 false(即具有非常大的字符串)。
    猜你喜欢
    • 1970-01-01
    • 2016-10-02
    • 2010-11-09
    • 2016-09-12
    • 1970-01-01
    • 1970-01-01
    • 2013-04-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多