【问题标题】:Not clear hashCode contract violation不清楚 hashCode 合约违规
【发布时间】:2015-11-04 09:41:58
【问题描述】:

以下两种情况有什么区别:

1) 覆盖 hashCode 以返回 1,不要覆盖 equals

2) 覆盖hashCode返回1,覆盖等于

编辑:

第二种情况是众所周知的——这种映射的性能下降到 LinkedList 的性能,它是 O(n) 而不是 log(n)。第一种情况更有趣。 Eran 确认没有明显违反合同,但此地图无法使用。

【问题讨论】:

  • 如果所有内容都有哈希码 1,那么这是一个有效但糟糕的哈希码,因为该类型的所有内容将始终落入同一个哈希桶中。
  • 你确定吗? equals 的实现方式没有区别吗?
  • hashCode 是一种确定两个对象是否相等的快速方法:如果它们的hashCodes 不匹配,则表示没有办法他们可以平等;然而,这并没有说明它们是否相等。

标签: java equals hashcode


【解决方案1】:

假设您正在询问是否将您的班级用作HashMap 中的键。

在第一种情况下,由于equals 未被覆盖,a.equals(b) 当且仅当a==b。因此,此实现允许“逻辑”重复,因为两个不同的实例的所有属性可能具有完全相同的值,但它们仍然不被视为彼此相等。

在第二种情况下,当equals 被覆盖时,您的实现将确定同一类的两个对象何时彼此相等。

这两种情况都没有违反hashCode 的约定,但是由于hashCode 总是返回1,当作为HashMap 中的键或HashSet 中的元素时,两者的性能都会很差,因为所有键将映射到同一个 bin,HashMap\HashSet 将变为 LinkedList

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-03-28
    • 2011-04-19
    • 1970-01-01
    • 2022-01-23
    • 1970-01-01
    • 2017-07-24
    • 2014-12-09
    • 1970-01-01
    相关资源
    最近更新 更多