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,如果
下一篇: 漂亮的人话