有没有理由我应该调用Integer.hashCode()?

时间:2013-12-20 08:56:45

标签: java hashcode

也许有一个我不知道的原因,但我发现它在我的代码中用于计算复杂对象的哈希码。 与将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;
}
}

5 个答案:

答案 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相同的值。