欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

HashMap原理

程序员文章站 2022-06-04 18:50:25
...

put操作如下

public V put(K key, V value) {
        return putVal(hash(key), key, value, false, true);
    }

其中求key的hash方法,如果为null,则放置在0下标,这也是key为null元素只有一个的原因

static final int hash(Object key) {
        int h;
        return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
    }

主要看:(h = key.hashCode()) ^ (h >>> 16)

h >>> 16取key的hashcode高16位,与key的hashcode异或运算,目的是让结果更加离散随机。异或运算是:对应位相同,输出0,不同输出1。

由于和(length-1)运算,length 绝大多数情况小于2的16次方。所以始终是hashcode 的低16位(甚至更低)参与运算。要是高16位也参与运算,会让得到的下标更加散列。

所以这样高16位是用不到的,如何让高16也参与运算呢。所以才有hash(Object key)方法。让他的hashCode()和自己的高16位^运算。所以(h >>> 16)得到他的高16位与hashCode()进行^运算。

为什么用^而不用&和|
因为&和|都会使得结果偏向0或者1 ,并不是均匀的概念,所以用^。

这就是为什么有hash(Object key)的原因。

get(Object key)

public V get(Object key) {
        Node<K,V> e;
        return (e = getNode(hash(key), key)) == null ? null : e.value;
    }

先计算key的hashcode,从Node(K,V)中取相同的hash,如果

相关标签: JDK java hashmap