java - Java有Hashable、Hasher之类的东西吗?
问题描述
对于Hash数据结构,比如HashSet、HashMap等,我们需要实现hashcode。但是,这不是很方便。我们可以改用 Hashable 或 Hasher 之类的东西吗?
这是 Swift 中的一个示例: https ://developer.apple.com/documentation/swift/hashable
解决方案
在Java中,基本上有多种方式:
- 您只需“保留”
hashCode()
从 Object 继承的方法(这不是一个很好的选择,因为它会忽略您的字段) - 您使用Objects.hashCode()计算字段的哈希值,然后
hashCode()
在自定义类中执行 @Override 时使用它。正如用户 Andreas 所指出的,此解决方案的一个缺点是在将这种方法用于原始类型值时会自动装箱。 - 您还可以使用 Apache Commons HashCodeBuilder。最大的优势:该类自动使用反射来检索所有字段值以进行散列。缺点:反射容易出错,并且会对性能产生重大影响。但这仍然是一个有趣的选择,例如在处理“数据持有者”又名“bean 类”时,它们基本上只是带有 getter 和 setter 的字段的容器。
除此之外:您当然可以hashCode()
为您需要的每个类覆盖自己,并从您的字段中“手动”计算哈希值。或者告诉您的 IDE 为您执行此操作。
最后,更进一步,JVM 平台允许像Lombok这样的库在编译阶段自动插入此类方法覆盖。甚至可以为 JVM 使用其他语言,例如 kotlin 及其数据类。
推荐阅读
- python - 如何从 python 中执行 SQLite 脚本?
- java - Java 文本字段不显示 Unicode 字符
- android - ViewModelProviders 和 ViewModelProvider 类有什么区别?
- c# - 我应该如何修复 Tesseract .GetCharacters() 引发受保护的内存错误
- pdf - Ghostscript - 将“pdfsettings = / ebook”纳入单个参数?
- c# - 无法从 'string[]' 转换为 'System.Net.Mail.Attachment'
- r - 在绘制 glm 拟合时更改 ggplot2 中的轴标签
- java - 如何在 JFreeChart 中创建具有特定间隔、空白空间和重复行键的 StackedBarChart?
- sql - 如果过去 2 小时内没有报告运行,我想创建一个 zabbix 警报以向用户发送电子邮件
- nlp - 训练 word2vec 模型时缺少单词