Java 我调用Integer.hashCode()有什么原因吗?
也许有一个原因我不知道,但我看到我的代码中使用它来计算复杂对象的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
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());