Java 通用对象的HashCode实现
我有一个具有以下参数的节点类:Java 通用对象的HashCode实现,java,generics,methods,hash,Java,Generics,Methods,Hash,我有一个具有以下参数的节点类: public class Node < T > { private T value; private int priority; } 公共类节点{ 私人T值; 私人优先权; } 我知道我需要重写hashcode方法,但我不知道如何做,因为value是一个通用对象。我了解到可以通过使用对象的地址来完成,但不建议这样做,因为JVM可以在程序执行期间更改对象的地址。您应该将value.hashCode()与优先级值
public class Node < T > {
private T value;
private int priority;
}
公共类节点{
私人T值;
私人优先权;
}
我知道我需要重写hashcode方法,但我不知道如何做,因为
value
是一个通用对象。我了解到可以通过使用对象的地址来完成,但不建议这样做,因为JVM可以在程序执行期间更改对象的地址。您应该将value.hashCode()
与优先级
值结合起来,以便计算节点的hashCode()
例如:
@Override
public int hashCode()
{
return 31 * value.hashCode() + priority;
}
这取决于节点
类的用户在相关类(用作节点
值类型的类)中重写hashCode()
注意,这是JDK集合类实现hashCode的方式。例如,Set
s的hashCode()
的默认实现是Set
元素的hashCode()
s之和 即使变量的地址在执行过程中可能会更改,使用value.hashCode()是否正确?@JimBelushi2执行过程中value.hashCode()
是否会更改与地址无关。它与value
的运行时类型及其类的hashCode()
实现有关。或者换句话说,对象的默认hashCode
(也称为itsidentityHashCode
)的值永远不会更改,即使对象的地址更改也是如此。