我们如何决定集合的hashCode()方法的最佳实现(假设equals方法已被正确重写)?

推荐答案

最好的实现方式是什么?这是一个很难回答的问题,因为这取决于使用模式.

在第8项(第二版)的Josh Bloch's Effective Java中,几乎所有情况下都提出了合理的良好实施方案.最好的办法是在那里查阅,因为作者在那里解释了为什么这种方法是好的.

简短版本

  1. 创建一个int result并指定一个non-zero值.

  2. 对于在equals()方法中测试的every field f,通过以下方式计算散列码c:

    • 如果字段f是boolean: 计算(f ? 0 : 1)
    • 如果字段f是bytecharshortint:计算(int)f
    • 如果字段f是long:计算(int)(f ^ (f >>> 32))
    • 如果字段f是float:计算Float.floatToIntBits(f)
    • 如果字段f是double:计算Double.doubleToLongBits(f)并像处理每个长值一样处理返回值;
    • 如果字段f是object:使用hashCode()方法的结果,如果是f == null,则使用0;
    • 如果字段f是array:将每个字段视为单独的元素,计算recursive fashion中的散列值,并按照下面的描述组合这些值.
  3. 将哈希值cresult组合:

    result = 37 * result + c
    
  4. 返回result

对于大多数使用情况,这将导致哈希值的正确分布.

Java相关问答推荐

如何在Java中使用Rest模板通过查询参数发送GET请求

在现有Json文件中添加新记录

基于仅存在于父级中的字段查询子文档?

将不受支持的时区UT重写为UTC是否节省?

Mapstruct不能正确/完全映射属性

按属性值从流中筛选出重复项

如何在EXCEL单元格中添加形状和文本

使SLF4J在Android中登录到Logcat,在测试中登录到控制台(Gradle依赖问题)

Tinylog中的滚动文件会在每次应用启动时覆盖日志(log)文件

如何在一行中使用Dijkstra中的Java Stream

如何仅使用键/ID的一部分(组合)高效地返回映射值?

如何使用log4j2(Json)记录由";异常引起的所有";?

允许同时执行两个方法,但不能同时执行这两个方法

删除打印语句会影响功能...腐败在起作用?

Java组件项目中的JavaFX对话框国际化

项目react 堆中doOnComplete()和Subscribe()的第三个参数之间的差异

我无法在我的Spring Boot应用程序中导入CSV依赖项

基于距离的APACHE POI公式判断

如何在Selenium上继续使用最新的WebDriver版本

使用Java线程进行并行编程