【问题标题】:Why does Intelij Idea let us make incorrect pair equals()-hashcode() by generator?为什么 Intellij Idea 让我们通过生成器生成不正确的 equals()-hashcode() 对?
【发布时间】:2020-04-06 16:49:32
【问题描述】:

IntelliJ IDEA 中有一个生成器。您按Alt+Ins,选择“等于和hashCode”,然后打开一个构造函数。您可以为 equals 选择字段,然后您可以为 hashCode() 选择字段。为什么我们可以选择不同的字段集?不是和equals-hashCode合约相矛盾吗?

【问题讨论】:

  • 不一定。相等对象必须具有相同的哈希码,这并不意味着相等和哈希码必须基于相同的字段。

标签: java intellij-idea equals hashcode


【解决方案1】:

嗯,它实际上并不允许您选择不同的字段集,它允许您为equals 选择字段的子集,以用于hashCode。 虽然这可能会导致更差的哈希码,因为这会导致更多的哈希冲突,但它在技术上仍然是正确的。请注意,要求只是相等的对象具有相等的哈希码,而不是相等的哈希码必须来自相等的对象。对于具有比ints 更多不同实例的类(例如java.lang.Long),后者是不可能实现的。

如果与仅处理冲突相比,计算冲突的最佳哈希过于昂贵,则可能有很好的动机使用次优哈希进行冲突。

【讨论】:

    【解决方案2】:

    根据 Java Doc of Object Class -

    请注意,通常需要覆盖 {@code hashCode} 方法每当此方法被覆盖,以便维护 {@code hashCode} 方法的通用合同,其中规定 相等的对象必须具有相等的哈希码。

    默认情况下,equals 方法返回 true 用于输入引用 相同的对象实例。对于完全不同的对象(甚至是具有不同字段值的对象),覆盖的 equals 可能会返回 true,这完全取决于您的实现。 p>

    如果您的 equals 逻辑确定两个 不同的对象相同,你的 hashcode 方法应该返回相同 这两个对象的值。

    这并不意味着您也应该为 hashcode 使用相同的字段。这就是您在覆盖这些函数时应该注意的全部内容。

    【讨论】:

      猜你喜欢
      • 2015-04-25
      • 2011-05-30
      • 1970-01-01
      • 1970-01-01
      • 2011-05-08
      • 1970-01-01
      • 1970-01-01
      • 2012-10-06
      • 2015-05-31
      相关资源
      最近更新 更多