hashCode用于实现相同接口的类

时间:2018-11-05 14:33:18

标签: java

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

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(); }
}

3 个答案:

答案 0 :(得分:1)

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

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

示例:使用prepost初始化的挂钩导致创建两个类PreInitPostInit。但是,那时的要求是在初始化之前和之后进行相同的操作。但是,在不久的将来,这种情况将会改变,并且每个都有不同的逻辑。

两个不同的对象可以具有相同的哈希码,并且这没什么不对的(只要您照顾好equals

请参阅: two unequal objects with same hashcode

答案 1 :(得分:1)

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

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

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

答案 2 :(得分:0)

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

的更多信息