我理解hashCode的想法以及为什么需要它。但是我对如何为Generic对象计算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()
做什么?
这种方法如何运作?
答案 0 :(得分:2)
K
和V
是Node
对象的参数化类型。
因此,将在实际类型上调用hashCode
。
例如,Node<String, Integer>
将分别调用String#hashCode
和Integer#hashCode
。
如果您使用自定义对象对其进行参数化,则会调用自己的hashCode
实现或其父级的hashCode
实现,最多为Object#hashCode
,这是本机的(即平台依赖的)实现。
答案 1 :(得分:0)
Java有一个默认的Object.hashCode()
实现。
尽可能合理,类
hashCode
定义的Object
方法确实为不同的对象返回不同的整数。 (这通常通过将对象的内部地址转换为整数来实现,但Java编程语言不需要此实现技术。)
如果在K和V的具体类中覆盖hashCode()
,则将调用精确的重写方法。
答案 2 :(得分:0)
Java的Object
类有一个.hashCode()
方法(虽然基于引用,因此通常不会使用。)key.hashCode()
因此保证存在,无论此通用的具体类型是什么,都可以正确发送。它将使用Object
&#39; .hashCode()`实现,或者更具体的实现。