首页 > 解决方案 > Java有Hashable、Hasher之类的东西吗?

问题描述

对于Hash数据结构,比如HashSet、HashMap等,我们需要实现hashcode。但是,这不是很方便。我们可以改用 Hashable 或 Hasher 之类的东西吗?

这是 Swift 中的一个示例: https ://developer.apple.com/documentation/swift/hashable

标签: javahashmaphashcodehashable

解决方案


在Java中,基本上有多种方式:

  • 您只需“保留”hashCode()从 Object 继承的方法(这不是一个很好的选择,因为它会忽略您的字段)
  • 您使用Objects.hashCode()计算字段的哈希值,然后hashCode()在自定义类中执行 @Override 时使用它。正如用户 Andreas 所指出的,此解决方案的一个缺点是在将这种方法用于原始类型值时会自动装箱。
  • 您还可以使用 Apache Commons HashCodeBuilder。最大的优势:该类自动使用反射来检索所有字段值以进行散列。缺点:反射容易出错,并且会对性能产生重大影响。但这仍然是一个有趣的选择,例如在处理“数据持有者”又名“bean 类”时,它们基本上只是带有 getter 和 setter 的字段的容器。

除此之外:您当然可以hashCode()为您需要的每个类覆盖自己,并从您的字段中“手动”计算哈希值。或者告诉您的 IDE 为您执行此操作。

最后,更进一步,JVM 平台允许像Lombok这样的库在编译阶段自动插入此类方法覆盖。甚至可以为 JVM 使用其他语言,例如 kotlin 及其数据类


推荐阅读