Java中的通用对象的HashCode

时间:2016-07-26 17:15:48

标签: java hashcode

我理解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()做什么? 这种方法如何运作?

3 个答案:

答案 0 :(得分:2)

KVNode对象的参数化类型。

因此,将在实际类型上调用hashCode

例如,Node<String, Integer>将分别调用String#hashCodeInteger#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()`实现,或者更具体的实现。