java - 哈希码跨越整数边界时的解决方法

标签 java integer hashcode

我有一个大约有 450 个字段的 POJO,我正在尝试使用 hascode 来比较此 POJO 的实例。我已经用 eclipse 生成了重写的 hashCode() 方法。在相当多的情况下,生成的哈希码会跨越整数边界。结果,进行比较变得困难。解决方法是什么?

hashCode()方法如下:

public int hashCode()
{
    final int prime = 31;
    int result = 1;
    result = prime * result + ((stringOne == null) ? 0 : stringOne.hashCode());
    result = prime * result + intOne;
    result = prime * result + Arrays.hashCode(someArray);
    result = prime * result + ((stringTwo == null) ? 0 : stringTwo.hashCode());
    result = prime * result + intTwo;
    result = prime * result + intThree;
    result = prime * result + ((stringThree == null) ? 0 : stringThree.hashCode());
    result = prime * result + ((stringFour == null) ? 0 : stringFour.hashCode());
    result = prime * result + ((stringFive == null) ? 0 : stringFive.hashCode());
    result = prime * result + ((objectOne == null) ? 0 : objectOne.hashCode());
    result = prime * result + ((objectTwo == null) ? 0 : objectTwo.hashCode());
    return result;
}

最佳答案

整数溢出是 hashCode() 计算的正常部分。这不是问题。

例如,StringhashCode() 通常为负数。

System.out.println("The hashCode() of this String is negative".hashCode());

如果 hashCode() 计算可能会溢出,显然这可能意味着不相等的 Object 可以具有相同的 hashCode,但这可以发生没有溢出。例如,这两个都打印 true

System.out.println("Aa".hashCode() == "BB".hashCode());
System.out.println(new HashSet<>(Arrays.asList(1, 2)).hashCode() == Collections.singleton(3).hashCode());

唯一的要求是相同的对象应该具有相同的hashCode。不要求不同的对象应具有不同的 hashCode

hashCode()equals() 也应该很快。您可以通过首先比较最有可能不同的字段并尽早返回来提高 equals() 的性能。您无法使用 hashCode() 执行此操作,因为计算必须涉及所有相关字段。如果您的类有 450 个字段,您可能需要考虑缓存 hashCode() 的结果,或者更好的方法是将您的类重构为更小的单元。

要考虑的另一件事是您是否需要重写这些方法。仅当对象要用作基于哈希的容器(例如 HashMap)中的键时,这是绝对必要的。

关于java - 哈希码跨越整数边界时的解决方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32584128/

相关文章:

java - 具有相同标识符值的不同对象已与 session :. 关联,合并和 saveOrUpdate 均不起作用

assembly - 对一对有符号和无符号数字进行算术运算是否合法?

java - 如何通过引用增加一个整数?

java - Java中删除重复的对象

java - 实现 hashCode() 的首选方法是什么?

java - 使用继承时存储 'employee code' 的公共(public)值

java - 从代码创建 JAR 文件并调用函数

java - 从 Java Integer 到 Scala Int : toInt vs unbox? 的正确方法

java - 向 hashCode() 添加数字有什么用?

java - 依赖于 bootRun 的 Gradle 任务