我有一个POJO
有〜450个字段,我正在尝试使用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;
}
答案 0 :(得分:1)
整数溢出是hashCode()
计算的正常部分。这不是问题。
例如,hashCode()
的{{1}}通常是否定的。
String
如果System.out.println("The hashCode() of this String is negative".hashCode());
计算可能会溢出,显然这可能意味着不等hashCode()
s可能具有相同的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
s。
hashCode
和hashCode()
也应该很快。您可以通过比较最有可能不同的字段并提前返回来提高equals()
的性能。您无法使用equals()
执行此操作,因为计算必须涉及所有相关字段。如果您的班级有450个字段,您可能需要考虑缓存hashCode()
的结果,或者更好地将您的班级重构为较小的单元。
要考虑的另一件事是你是否需要覆盖这些方法。只有当对象将用作基于散列的容器中的键时才是绝对必要的,例如hashCode()
。
答案 1 :(得分:0)
解决方法是使用不同的方法来计算哈希码。例如,您可以xor
450个字段的哈希码(顺便说一句:哇!),但是如果不了解您的对象,很难说这对您的特定情况是否是一个好方法。
理想情况下,由于哈希码用于散列,因此不相等的对象也应该以高概率生成不同的哈希码。