猿问

实现相同接口的类的 hashCode

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


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

}


交互式爱情
浏览 238回答 3
3回答

MMTTMM

不同的对象给出相同hashCode()的肯定是“好的”。有时会发生冲突是哈希的本质。哈希码将潜在的无限范围映射到受限范围。碰撞是不可避免的。考虑不同类型的对象尤其是当它确实没有太大的关系是否someA与someB具有相同或不同的散列码!但除此之外,另一个答案是:您的问题暗示了设计问题。您不应该问“两个接口使用确切的哈希码是否可以”。你应该问:“为什么我最终得到了两个共享这么多共同点的类?!”这里真正的问题是代码质量:您重复了字段,并且可能是处理这些字段的代码。最有可能的是,“更好”的方法是重构两个类,并将公共方面推入一个不同的类,然后让您的两个类使用该公共类!

慕侠2389804

我也遇到过类似的情况。基本上,实现(我有两个)看起来完全一样。如果我只使用了一个类,那么类名在其他地方使用时会造成混淆。因此,我继续使用两个类来提高可读性。示例:使用的钩子pre和post某些东西的初始化导致创建两个类PreInit和PostInit. 但是,当时的要求是在 pre 和 post init 中做同样的事情。但是,在不久的将来,这种情况会发生变化,每个人都会有不同的逻辑。两个不同的对象可以具有相同的哈希码,这没有任何问题(只要您注意equals)

慕运维8079593

是的,可以为不同的对象使用相同的哈希码。如您所知,哈希码范围受intjava 中的类型限制。但对象的范围不受限制。不同对象具有相同哈希码的情况称为碰撞。为了避免与之相关的错误,您应该记住 hashcode 和 equals 之间的约定:1) 如果两个对象相等,则它们必须具有相同的哈希码。2) 如果两个对象具有相同的哈希码,它们可能相等,也可能不相等。你可以在这里找到更多关于它的信息
随时随地看视频慕课网APP

相关分类

Java
我要回答