gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 10:06:53 25 4
gpt4 key购买 nike

按照下面的链接

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com