在Java中将Integer用作HashMap的键

最近,我一直在寻找Java API中hashCode()方法的良好实现,并通过Integer源代码进行查找.没想到,但是hashCode()只返回支持的int值.

public final class Integer ... {
private final int value;
...
    public int hashCode() {
        return Integer.hashCode(value);
    }
    public static int hashCode(int value) {
        return value;
    }

真的很奇怪,因为有很多论文和专页以及有关此问题的软件包-如何设计良好的哈希函数来分配值.

最后,我得出以下结论:

当与HashMap一起使用时,整数是最不适合使用该键的数据类型,因为所有连续键都将放在一个bin / bucked中.就像上面的示例中一样.

Map<Integer, String> map = HashMap<>();

for (int i = 1; i < 10; i++) {
    map.put(Integer.valueOf(i), "string" + i);
}

有两个问题,我在谷歌搜索时找不到答案:

>我对整数数据类型的结论正确吗?
>如果是真的,为什么在使用幂运算,质数和二进制移位时,Integer的hashCode()方法没有以某种棘手的方式实现?

最佳答案

Integer is the worst data type candidate for a key when used with HashMap, as all consecutive keys will be places in one bin

不,那句话是错误的.

实际上,Integer的hashCode()的实现是最好的实现.它将每个Integer值映射到唯一的hashCode值,从而减少了将不同的键映射到同一存储桶的机会.

有时候,简单的实现是最好的.

从Object类中的hashCode()的Javadoc中:

It is not required that if two objects are unequal according to the java.lang.Object.equals(java.lang.Object) method, then calling the hashCode method on each of the two objects must produce distinct integer results. However, the programmer should be aware that producing distinct integer results for unequal objects may improve the performance of hash tables.

Integer是实际上保证不相等的对象具有不同的hashCode()的少数类之一.

转载注明原文:在Java中将Integer用作HashMap的键 - 代码日志