Java 我调用Integer.hashCode()有什么原因吗?

Java 我调用Integer.hashCode()有什么原因吗?,java,hashcode,Java,Hashcode,也许有一个原因我不知道,但我看到我的代码中使用它来计算复杂对象的hashcode。 与整数本身相比,它提供了什么?我希望不是,或者只是为了更清楚 class SomeClass() { private Integer myIntegerField1; private Integer myIntegerField2; ... public int hashCode() { final int prime = 31; int result =1; result = prime * result

也许有一个原因我不知道,但我看到我的代码中使用它来计算复杂对象的hashcode。 与整数本身相比,它提供了什么?我希望不是,或者只是为了更清楚

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;
}
}
的javadoc说:

返回:此对象的哈希代码值,等于 由以下表达式表示的基元int值 整数对象


因此,使用Integer.hashCode或Integer.intValue,或使用自动取消装箱将导致完全相同的值。

没有理由显式使用整数的hashCode。源代码仅返回整数的值:

public int hashCode(){
    return value;
}
因此,请使用整数的值,而不是哈希代码


源代码中包含此方法的原因是什么?如果有一个指向整数的对象,会发生什么?在源代码中明确包含该方法可确保正确的结果。

您发布的代码是由IDE自动生成的。代码生成器没有处理整型或其他基本类型包装器的特殊情况,也没有一个很好的理由让它有这样的包装器:它现在的实现方式是100%按书来实现的,从总体上考虑是正确的


如果将myIntegerField1.hashCode替换为myIntegerField1,实际效果将是从hashCode调用更改为intValue调用,如果查看源代码,您会发现这两种方法完全相同。

复合对象可以使用其内部状态的组合哈希来计算自己的哈希代码。例如:

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;
    }
}
不要使散列过于复杂,并且只基于一些不会改变的值或可能稳定的值进行散列。散列码本质上不要求是唯一的或无冲突的


散列码只是一个快速而肮脏的指纹,允许快速确定两个实例是否不相等如果它们相等,它们必须具有相同的散列码,因此必须仅对散列再次相等的实例执行实际相等检查,相同的哈希并不意味着它们相等。

这里您试图找到SomeClass类型对象的哈希代码

public int hashCode() {
 final int prime = 31;
 int result =1;
 result = prime * result + ((myIntegerField1 == null) ? 0 : myIntegerField1.hashCode());
 result = prime * result + ....
  ...
 return result;
}

您正在尝试检查myIntegerField1==null,将hashCode返回为0,否则返回整数myIntegerField1的hashCode


请记住:myIntegerField1.hashCode和myIntegerField1.intValue将返回与myIntegerField1相同的值。

您必须发布相关代码。是的,这就是我问这个问题的原因,我真的很困惑为什么在那里使用hashCode。我唯一的答案是为了清楚。代码可能是由IDE自动生成的,它使用字段的哈希代码,不管字段的类型是什么。哦,是的,这可能是Eclipse的工作。但是感谢您的澄清和一致性,如果不需要调用每个对象的hashCode,那么了解每个对象的hashCode的内部实现将不会有什么好处。
result = prime * result + ((myIntegerField1 == null) ? 0 : myIntegerField1.hashCode());