为了账号安全,请及时绑定邮箱和手机立即绑定

实现相同接口的类的 hashCode

实现相同接口的类的 hashCode

交互式爱情 2021-12-30 20:22:18
我有(至少)两个实现相同接口并具有相同字段的类。如果这两个类的字段相同或者它们应该不同,那么这两个类是否具有相同的哈希码?这段代码好吗?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 回答

?
MMTTMM

TA贡献1869条经验 获得超4个赞

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

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

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


查看完整回答
反对 回复 2021-12-30
?
慕侠2389804

TA贡献1719条经验 获得超6个赞

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

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

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

两个不同的对象可以具有相同的哈希码,这没有任何问题(只要您注意equals


查看完整回答
反对 回复 2021-12-30
?
慕运维8079593

TA贡献1876条经验 获得超5个赞

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

查看完整回答
反对 回复 2021-12-30
  • 3 回答
  • 0 关注
  • 197 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信