【问题标题】:if two objects hashcode is a same, why doesnot mean that o1.equals(o2)? [duplicate]如果两个对象的哈希码相同,为什么它意味着 o1.equals(o2)? [复制]
【发布时间】:2019-12-11 14:42:21
【问题描述】:

equals()hashCode()的实现应该遵循这些规则。

  1. 如果o1.equals(o2),则o1.hashCode() == o2.hashCode() 应始终为真。
  2. 如果o1.hashCode() == o2.hashCode() 为真,并不意味着o1.equals(o2) 为真。

如果o1.hashCode() == o2.hashCode() 为真。我知道,如果两个对象相等,那么这两个对象应该返回相同的哈希码。如果两个对象的哈希码相同,为什么不代表o1.equals(o2)

【问题讨论】:

  • 出于同样的原因,所有叫“Rezo”的人都不是你。
  • 正确的说法是“不是所有叫 Rezo 的人都是你”。我们有经验证据表明至少它们是。 ;-)

标签: java equals hashcode


【解决方案1】:

考虑Long。这种类型有 2^64 个可能的值。 hashCode 返回一个 int,它只有 2^32 个可能的值。

对于身份哈希码(可从 System.identityHashCode 获得),对象在许多现代 JVM 实现中在内存中移动。没有合理的方法来跟踪哪些哈希码仍在使用中。即使有一个(线程安全的)计数器,在 2^32 分配之后也需要某种重用。

【讨论】:

  • 哈希码不是唯一的?如果 o1 和 o2 对象的 hashcode 相等,这是什么意思?
  • 两个对象可以有相同的哈希码吗?
  • 实际上所有对象都可以有相同的哈希码,这将是一个合法的哈希函数。不过不是很实用。
  • @Andres 有/曾经有一个选项来构建 HotSpot,这样每个身份哈希码都是 1 - 用于调试目的。
【解决方案2】:

有点像:

如果约翰和詹姆斯是双胞胎,那么他们一定属于同一个母亲

哪个(我相信你同意)不是意味着

如果约翰和詹姆斯属于同一个母亲,那么他们一定是双胞胎

“有同一个母亲”是具有相同的哈希码,而“是双胞胎”是相等的。

剩下的,我建议你通读这个问题的第一个答案What is the use of hashCode in Java?

【讨论】:

    【解决方案3】:

    hash 函数的目的(线索就在名称中)是为不同对象返回均匀分布在一个范围内的值。不要为每个对象返回不同的值。

    这意味着哈希函数通常会发生冲突。虽然理想情况下它们的数量应该尽可能小。

    【讨论】:

      【解决方案4】:

      想象一个哈希算法(不一定是好的算法)如下所示。

      1. 取我们分配的 ID 的最后 4 位数字。

      2. 想象一下两个 ID 12341234 和 67281234。

      hashCodes 是相同的,但 id 和它们标识的可能不同。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-11-17
        • 2015-08-12
        • 2012-06-27
        • 2019-11-29
        • 2021-03-02
        相关资源
        最近更新 更多