gpt4 book ai didi

java - 为什么 Object.equals() 的实现没有使用 hashCode()?

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:34:34 27 4
gpt4 key购买 nike

“为什么 Sun/Oracle 的人每次都强制我们覆盖 equals() 和 hashCode()?”

Everyone knows也就是说,如果您重写一个对象的 equals() 或 hashCode(),您也必须重写另一个对象,因为这两者之间存在契约:

Note that it is generally necessary to override the hashCode method whenever this method [i.e. equals()] is overridden, so as to maintain the general contract for the hashCode method, which states that equal objects must have equal hash codes. -- API doc of Object.equals()

为什么在 Object 类中不这样实现:

public boolean equals(Object obj) {
return this.hashCode() == obj.hashCode()
}

如果他们这样做,世界其他地方就不必同时实现这两种方法了。仅覆盖 hashCode() 就足够了。

我想这些人有充分的理由不这样做。我只是看不到它 - 请帮我解决这个问题。

最佳答案

如果 a.equals(b) 返回 true 那么 a.hashCode() == b.hashCode() 必须评估为 true .

相反的是不正确!有两个对象是完全有效的,其中 a.hashCode() == b.hashCode() 为真,但 a.equals(b) 为假。

事实上,这是必要的hashCode() 有 232 个可能的返回值。在任何给定时刻,JVM 都可以容纳多于 232 个对象(假设有足够的内存,这在当今很有可能)。假设没有一个对象彼此相等(很容易做到,只要让它们是 "s1", "s2", ...),那么你重新 绑定(bind) 以产生校验和冲突(参见 Pidgeonhole principle )。

事实上,这是最简单的 hashCode 实现,它对每个类都是正确的(但在其他方面非常糟糕) em>*:

public int hashCode() {
return 0;
}

它神奇地满足了 the general hashCode() contract 的所有要求.

* 除了那些必须实现已定义和记录的 hashCode 算法的类,主要示例是 String.hashCode() .

关于java - 为什么 Object.equals() 的实现没有使用 hashCode()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18446078/

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