【问题标题】:Different fields for equals and hashcodeequals 和 hashcode 的不同字段
【发布时间】:2014-05-14 16:37:13
【问题描述】:

我同意这篇文章中的声明What issues should be considered when overriding equals and hashCode in Java?

使用与计算 equals() 相同的一组字段来计算 hashCode()。

但我有一些疑问:

  • 是否绝对有必要拥有相同的字段?
  • 如果是,如果我不使用相同的字段怎么办?
  • 是否会影响 HashMap 的性能或 HashMap 的准确性?

【问题讨论】:

  • 你应该看看这个http://stackoverflow.com/questions/2265503/why-do-i-need-to-override-the-equals-and-hashcode-methods-in-java
  • @Hrish 使用这种不必要的格式阻止了链接可点击。
  • 好吧,很抱歉。我想把它作为一个答案,但它实际上会回答这个问题,所以把它作为评论。让我修改它。 stackoverflow.com/questions/2265503/…‌​-and-hashcode-methods-in-jav

标签: java hashmap equals hashcode


【解决方案1】:

hashcode 中使用的字段可以是 equals 中使用的字段的子集。 它仍然会遵守这条规则“只要 a.equals(b),则 a.hashCode() 必须与 b.hashCode() 相同”

【讨论】:

    【解决方案2】:

    这绝对有必要拥有相同的字段吗?

    是的,如果您不想要任何惊喜。

    如果是,如果我不使用相同的字段怎么办?

    根据 equals() 方法,对于相等的对象,您可能会得到不同的 hashCode,这是 equals 和 hashCode 合约的要求。

    例如,假设您有 3 个字段 - abc。你使用ab 作为equals() 方法,所有3 个字段用于hashCode() 方法。因此,对于 2 个对象,如果 ab 相等,而 c 不同,则两者将相等,但哈希码不同。

    会影响 HashMap 的性能还是 HashMap 的准确性?

    这与性能无关,但是是的,您的地图不会按预期运行。

    【讨论】:

    • 实际上等于必须至少与哈希码一样具体,因此如果与您的示例相反,则问题不大。使哈希码更粗糙至少不会破坏合同和语义。因此,没有相同的字段不会导致语义上的意外。当然,我怀疑让它们不同通常是个好主意。
    • @Drunix 是的,在某些情况下它不会真正影响语义。想法是,不要在hashCode 中使用equals() 中不存在的字段。但正如您所说,为了安全起见,理想情况下我们应该使用相同的字段。
    【解决方案3】:

    字段不必相同。要求是两个相等的对象,它们必须具有相同的哈希码。如果它们具有相同的哈希码,则它们不必相等。来自 javadocs:

    • 每当在同一对象上多次调用它时 执行 Java 应用程序时,hashCode 方法必须一致 返回相同的整数,只要不使用 equals 中的信息 对象上的比较被修改。这个整数不需要保留 从应用程序的一次执行到另一次执行一致 相同的应用程序。
    • 如果两个对象根据 equals(Object) 方法,然后在每个对象上调用 hashCode 方法 两个对象必须产生相同的整数结果。
    • 不是必需的 如果两个对象根据 equals(java.lang.Object) 方法,然后调用 hashCode 方法 这两个对象中的每一个都必须产生不同的整数结果。 然而,程序员应该意识到产生不同的 不相等对象的整数结果可以提高 哈希表。

    例如,您可以始终返回 1 作为您的哈希码,并且无论您在 equals 方法中使用什么字段,您都将遵守哈希码协定。

    一直返回 1 会提高 hashCode 的计算时间,但 HashMap 的性能会下降,因为它不得不更频繁地求助于 equals()。

    【讨论】:

      猜你喜欢
      • 2023-01-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多