Java 是否有 Hashable、Hasher 之类的东西?
Does Java have something like Hashable, Hasher?
对于Hash数据结构,如HashSet、HashMap等,我们需要实现hashcode。但是,这不是很方便。我们可以改用 Hashable 或 Hasher 之类的东西吗?
这是 Swift 中的示例:
https://developer.apple.com/documentation/swift/hashable
在Java中,基本上有多种方式:
- 你只是 "keep" 从 Object 继承的
hashCode()
方法(不是一个很好的选择,因为它会忽略你的字段)
- 您使用 Objects.hashCode() 来计算字段的哈希值,然后在自定义 class 中为
hashCode()
执行 @Override 时使用它。正如用户 Andreas 所指出的,此解决方案的一个缺点是在将此方法用于原始类型值时会自动装箱绕行。
- 您还可以使用 Apache Commons HashCodeBuilder。最大的优势:class 自动使用反射来检索所有字段值以进行散列。缺点:反射容易出错,并且会对性能产生重大影响。但它仍然是一个有趣的选择,例如在处理 "data holder" 又名 "bean classes" 时,它基本上只是带有 getter 和 setter 的字段的容器。
除此之外:您当然可以为每个 class 自己覆盖 hashCode()
,并 "manually" 从您的字段中计算哈希值。或者告诉您的 IDE 为您做这件事。
最后,更进一步,JVM 平台允许像 Lombok that automatically insert such method overrides during the compile phase. Or even to use other languages for the JVM like kotlin with its data classes 这样的库。
对于Hash数据结构,如HashSet、HashMap等,我们需要实现hashcode。但是,这不是很方便。我们可以改用 Hashable 或 Hasher 之类的东西吗?
这是 Swift 中的示例: https://developer.apple.com/documentation/swift/hashable
在Java中,基本上有多种方式:
- 你只是 "keep" 从 Object 继承的
hashCode()
方法(不是一个很好的选择,因为它会忽略你的字段) - 您使用 Objects.hashCode() 来计算字段的哈希值,然后在自定义 class 中为
hashCode()
执行 @Override 时使用它。正如用户 Andreas 所指出的,此解决方案的一个缺点是在将此方法用于原始类型值时会自动装箱绕行。 - 您还可以使用 Apache Commons HashCodeBuilder。最大的优势:class 自动使用反射来检索所有字段值以进行散列。缺点:反射容易出错,并且会对性能产生重大影响。但它仍然是一个有趣的选择,例如在处理 "data holder" 又名 "bean classes" 时,它基本上只是带有 getter 和 setter 的字段的容器。
除此之外:您当然可以为每个 class 自己覆盖 hashCode()
,并 "manually" 从您的字段中计算哈希值。或者告诉您的 IDE 为您做这件事。
最后,更进一步,JVM 平台允许像 Lombok that automatically insert such method overrides during the compile phase. Or even to use other languages for the JVM like kotlin with its data classes 这样的库。