前言
本文是基于Java 8
的HashMap
进行分析,主要是分析HashMap
中的put()
和get()
方法。如果对HashMap的内部结构感兴趣可以看看我的相关博客。
下面将会分析这部分的源码,如果觉得源码分析内容太啰嗦,可以跳过源码部分,直接看源码下面的总结。
put()方法源码分析
HashMap
的put()
方法是我们最常用的方法,但是put()
方法是怎么工作的呢?
put()方法
/**
* HashMap的put()方法支持key/value为null
*/
public V put(K key, V value) {
//实际上是先调用HashMap的hash()方法获取到key的hash值
//然后调用HashMap的putVal()方法
return putVal(hash(key), key, value, false, true);
}
put()
方法实际上是
- 调用
hash()
方法获取到key
的hash
值 - 调用
putVal()
方法存储key-value
核心方法是putVal()
方法,下面我会先分析一下hash()
方法,因为这个方法涉及到hash
值这个关键属性的计算。
hash()方法
static final int hash(Object key) {
int h;
// key为null时,hash值为0
// key不为null时,调用key对象的hashCode()方法并通过位运算异或和无符号右移将高位分散到低位
return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
}
hash()
方法指定了null
的hash
值为0
。这样就可以支持key
为null
。(h = key.hashCode()) ^ (h >>> 16)
这段代码通过位运算异或和无符号右移将高位分散到低位,这样做可以减少哈希碰撞的概率(这块不是很清楚原理,是从方法注释上了解到的)
putVal()方法
/**
* Map.put()方法的实际实现
*
* @param hash key的hash值
* @param key 键值对中的key
* @param value 键值对中的v