java - 相等性测试(equals 和 hashcode 方法)

标签 java

按照下面的链接

Hashcode and equals

因此假设如果2个对象相等(即equals()返回true),那么它们的hashCodes()必须返回相同的值。

但是考虑下面的例子

public class Test {

    public static void main(String args[]) {
        Demo d1 = new Demo(123);
        Demo d2 = new Demo(123);

        System.out.println("d1.hashCode()-->" + d1.hashCode());
        System.out.println("d2.hashCode()-->" + d2.hashCode());
        System.out.println(d1.equals(d2));
    }
}

class Demo {

    private int name;

    Demo(int name) {
        this.name = name;
    }
    @Override
    public int hashCode() {
        Double d = Math.random() * 1000;
        return d.intValue();
    }
    @Override
    public boolean equals(Object o) {
        if ((o instanceof Demo) && (((Demo) o).getName() == this.getName())) {
            return true;
        } else {
            return false;
        }
    }
    public int getName() {
        return name;
    }
}

上面程序的输出是

d1.hashCode()-->85

d2.hashCode()-->692

true

这里的问题是即使哈希码不同 equals 方法返回 true。 那么这是否意味着对于对象的相等性我们不需要相同的哈希码

最佳答案

一些实现(例如 HashMap)依赖于这样一个事实,即当两个实例相等时,它们的哈希码应该相同。但是,纯粹使用 equals 不会检查这些实例的哈希码。

在 HashMap 的情况下,首先根据对象的哈希码将元素划分到不同的哈希桶中(出于性能原因)。在桶内,equals 用于检查对象是否相等。如果两个相同的实例没有相同的 hashCode,它们将最终进入不同的桶,并且这可能会由于违反契约而导致意外行为。

关于java - 相等性测试(equals 和 hashcode 方法),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5482066/

相关文章:

java - AlarmClock.EXTRA_DAYS 如何工作 - Android Studio

java - 如何让 slider 自动移动

java - 附加到进程 : sun. jvm.hotspot.debugger.DebuggerException 时出错:无法打开二进制文件

java - 基本 Java 解码器程序未传递正确的值?

javascript - Android Studio InputFilterMinMax 部分工作

java - 对类型参数做出假设?

java - 如何通过 URL 对象访问嵌入在 JAR 文件中的 JPG?地址是什么?

java - 字符串全名分割java

java - 在 Java 中写入串行

java - 当捕获异常而不是继续时,是否可以在循环中再次迭代?