【问题标题】:hashCode for classes implementing the same interface实现相同接口的类的 hashCode
【发布时间】:2019-04-08 22:24:22
【问题描述】:

我(至少)有两个类实现了相同的接口并具有相同的字段。如果这两个类的字段相同或应该不同,那么这两个类是否具有相同的哈希码?这段代码可以吗?

interface Base { }

class A implements Base {
  private Integer value;

  public A(Integer value) { this.value = value; }

  public int hashCode() { return value.hashCode(); }
}

class B implements Base {
  private Integer value;

  public B(Integer value) { this.value = value; }

  public int hashCode() { return value.hashCode(); }
}

【问题讨论】:

  • 为什么会有两个类呢?
  • 如果对他们俩都有意义的话,他们可以拥有类似的hashCode 实现。虽然从你的问题来看,这两个类的目的有点不清楚。
  • hashCode 的唯一要求是 A.equals(B) ==> A.hashCode() == B.hashCode()。另外:您应该始终同时修改hashCodeequals 以保持该要求......显然这样做会产生影响。例如 Python 对数字类执行此操作,以便整数 1 等于浮点 1.0,但这意味着如果您有类似 {1: "a"} 的映射,那么您可以使用 1.0 代替 1 来获取该值并且您不能同时将 11.0 作为键,因为它们对于哈希映射实际上是相同的
  • 我会说,这当然不是问题。可能发生的最糟糕的事情:在包含两个类的实例的MapSet 中出现更多哈希冲突。但是您也可以将类本身的哈希码添加到实例的哈希码中。

标签: java


【解决方案1】:

不同的对象给出相同的hashCode() 肯定是“好的”。散列的性质有时会发生冲突。哈希码将潜在的无限范围映射到受限范围。碰撞是不可避免的。尤其是在考虑不同类型的对象时,someAsomeB 是否具有相同或不同的哈希码真的没有太大关系!

但除此之外,另一个答案是:您的问题暗示了设计问题。您不应该问“两个接口使用确切的哈希码是否可以”。你应该问:“为什么我最终会得到两个有这么多共同点的类?!”

这里的真正问题是代码质量:您重复了字段,并且可能是处理这些字段的代码。最有可能的是,“更好”的方法是重构两个类,并将 common 方面推送到一个不同的类中,然后让你的两个类使用那个公共类!

【讨论】:

    【解决方案2】:

    是的,可以为不同的对象使用相同的哈希码。
    如您所知,哈希码范围受int java 中的类型限制。但对象的范围不受限制。不同对象具有相同哈希码的情况称为冲突
    为避免与之相关的错误,您应该记住 hashcode 和 equals 之间的约定:
    1) 如果两个对象相等,那么它们必须具有相同的哈希码
    2) 如果两个对象具有相同的哈希码,它们可能相等也可能不相等
    你可以找到更多关于它here

    【讨论】:

      【解决方案3】:

      我也遇到过类似的情况。基本上,实现(我有两个)看起来完全一样。

      如果我只使用了一个类,那么当在另一个地方使用时,类名会造成混淆。因此,我继续使用两个类来提高可读性。

      示例:使用 prepost 的钩子初始化某些东西会导致创建两个类 PreInitPostInit。但是,当时的要求是在初始化前和初始化后做相同的事情。但是,在不久的将来,这种情况会发生变化,每个人都会有不同的逻辑。

      两个不同的对象可以有相同的哈希码,这没有什么问题(只要你注意equals

      见: two unequal objects with same hashcode

      【讨论】:

      • 我不知道为什么所有这些反对票都会出现在所有答案中。不管怎样,你现在把我的起来了;-)
      猜你喜欢
      • 1970-01-01
      • 2014-10-25
      • 2016-10-07
      • 2021-10-18
      • 2014-03-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-09
      相关资源
      最近更新 更多