Java 中通用对象的哈希码
HashCode for Generic objects in Java
我理解 hashCode 的概念以及为什么需要它。但是,我对如何为通用对象计算 hashCode 感到困惑。所以这是我的问题。如果我有一个字符串,我可能会使用以下函数来计算哈希码,
int hash = 7;
for (int i = 0; i < strlen; i++) {
hash = hash*31 + charAt(i);
}
但是假设我有以下对象,
class Node<K, V> {
private K key;
private V value;
private Node<K, V> next;
}
我的 IDE 为此生成一个自动 hashCode 函数,
@Override
public int hashCode() {
int result = key != null ? key.hashCode() : 0;
result = 31 * result + (value != null ? value.hashCode() : 0);
result = 31 * result + (next != null ? next.hashCode() : 0);
return result;
}
我的问题是因为 Key 和 Value 是通用的,key.hashCode()
有什么作用?
这种方法是如何工作的?
Java 有一个默认的 Object.hashCode()
实现。
As much as is reasonably practical, the hashCode
method defined by class Object
does return distinct integers for distinct objects. (This is typically implemented by converting the internal address of the object into an integer, but this implementation technique is not required by the Java programming language.)
如果在 K 和 V 的具体 类 中覆盖 hashCode()
,则将调用确切的覆盖方法。
K
和 V
是 Node
对象的参数化类型。
因此,hashCode
将在实际类型上调用。
例如 Node<String, Integer>
将分别调用 String#hashCode
和 Integer#hashCode
。
如果您使用自定义对象对其进行参数化,将调用它们自己的 hashCode
实现或其父级 hashCode
的实现,直到 Object#hashCode
,这是一个本机(即依赖于平台)实现。
Java 的 Object
class 有一个 .hashCode()
方法(尽管是基于参考的方法,所以您不希望经常使用。)key.hashCode()
因此保证存在,并且无论这个泛型的具体类型是什么都可以正确分派。它将使用 Object
's '.hashCode()` 实现,或者更具体的实现(如果可用)。
我理解 hashCode 的概念以及为什么需要它。但是,我对如何为通用对象计算 hashCode 感到困惑。所以这是我的问题。如果我有一个字符串,我可能会使用以下函数来计算哈希码,
int hash = 7;
for (int i = 0; i < strlen; i++) {
hash = hash*31 + charAt(i);
}
但是假设我有以下对象,
class Node<K, V> {
private K key;
private V value;
private Node<K, V> next;
}
我的 IDE 为此生成一个自动 hashCode 函数,
@Override
public int hashCode() {
int result = key != null ? key.hashCode() : 0;
result = 31 * result + (value != null ? value.hashCode() : 0);
result = 31 * result + (next != null ? next.hashCode() : 0);
return result;
}
我的问题是因为 Key 和 Value 是通用的,key.hashCode()
有什么作用?
这种方法是如何工作的?
Java 有一个默认的 Object.hashCode()
实现。
As much as is reasonably practical, the
hashCode
method defined by classObject
does return distinct integers for distinct objects. (This is typically implemented by converting the internal address of the object into an integer, but this implementation technique is not required by the Java programming language.)
如果在 K 和 V 的具体 类 中覆盖 hashCode()
,则将调用确切的覆盖方法。
K
和 V
是 Node
对象的参数化类型。
因此,hashCode
将在实际类型上调用。
例如 Node<String, Integer>
将分别调用 String#hashCode
和 Integer#hashCode
。
如果您使用自定义对象对其进行参数化,将调用它们自己的 hashCode
实现或其父级 hashCode
的实现,直到 Object#hashCode
,这是一个本机(即依赖于平台)实现。
Java 的 Object
class 有一个 .hashCode()
方法(尽管是基于参考的方法,所以您不希望经常使用。)key.hashCode()
因此保证存在,并且无论这个泛型的具体类型是什么都可以正确分派。它将使用 Object
's '.hashCode()` 实现,或者更具体的实现(如果可用)。