也许有一个我不知道的原因,但我发现它在我的代码中用于计算复杂对象的哈希码。 与将Integer本身放在那里相比,它能提供什么吗? (我希望不是),或者只是为了更清晰?
class SomeClass() {
private Integer myIntegerField1;
private Integer myIntegerField2;
...
public int hashCode() {
final int prime = 31;
int result =1;
result = prime * result + ((myIntegerField1 == null) ? 0 : myIntegerField1.hashCode());
result = prime * result + ....
...
return result;
}
}
答案 0 :(得分:7)
Integer.hashCode()的javadoc说:
返回:此对象的哈希码值,等于 由此表示的原始int值 整数对象。
因此,使用Integer.hashCode()
或Integer.intValue()
或使用自动取消装箱会导致完全相同的值。
答案 1 :(得分:4)
您发布的代码是由IDE自动生成的。代码生成器没有处理Integer
或其他原始类型包装器的特殊情况,并且没有一个非常好的理由让它有一个:它现在实现的方式是书的100%和一般的考虑水平是正确的。
如果您仅使用myIntegerField1.hashCode()
替换了myIntegerField1
,那么实际效果将是从hashCode()
通话更改为intValue()
通话,如果您查看来源代码,你会发现这两种方法完全相同。
答案 2 :(得分:1)
复合对象可以使用其内部状态的组合哈希来计算自己的哈希码。例如:
public class Person
{
private Integer id;
private String name;
@Override
public int hashCode()
{
int hash = getClass().getName().hashCode();
if (id != null)
{
hash ^= id.hashCode();
}
if (name != null)
{
hash ^= name.hashCode();
}
return hash;
}
}
不要使哈希过于复杂,并且只对某些不会改变或者可能稳定的值进行哈希哈希。哈希代码本质上是不必须是唯一的或无冲突的。
哈希码只是一个快速而脏的指纹,可以快速判断两个实例是否不等于(如果它们相等,则必须具有相同的哈希码),因此实际的equals()
检查必须仅对哈希等于的实例执行(同样,相同的哈希并不意味着它们是相等的)。
答案 3 :(得分:0)
没有理由明确使用Integer
的哈希码。源代码只返回Integer的值:
public int hashCode(){
return value;
}
因此,请使用Integer
的值而不是哈希码。
该方法包含在源中的原因是什么?如果您的Object
指向Integer
,会发生什么?在源代码中明确包含该方法可确保正确的结果。
答案 4 :(得分:0)
在这里,您尝试查找SomeClass
类型对象的哈希码。
public int hashCode() {
final int prime = 31;
int result =1;
result = prime * result + ((myIntegerField1 == null) ? 0 : myIntegerField1.hashCode());
result = prime * result + ....
...
return result;
}
在
result = prime * result + ((myIntegerField1 == null) ? 0 : myIntegerField1.hashCode());
您正在尝试检查是否myIntegerField1==null
,将hashCode
作为0
其他hashCode of Integer myIntegerField1
返回。
请注意:myIntegerField1.hashCode()
和myIntegerField1.intValue()
将返回与myIntegerField1
相同的值。