一、开始分析
JDK版本基于JDK1.8以上,JDK1.8以上的HashMap使用红黑树+链表的组合方式//调用putVal方法,传入key,value
public V put(K key, V value) {
return putVal(hash(key), key, value, false, true);
}
二、分析过程
先看官方说明
/**
* Implements Map.put and related methods.
*
* @param hash hash for key 存储的key的hash值
* @param key the key 存储的键值
* @param value the value to put 存储的值
* @param onlyIfAbsent if true, don't change existing value
* //判断是否需要替换旧值,每次插入重复的key,替换为最新的value
* @param evict if false, the table is in creation mode.
* //如果为false代表还在被创建
* @return previous value, or null if none
*/
接下来看代码
final V putVal(int hash, K key, V value, boolean onlyIfAbsent,
boolean evict) {
//这里定义了四个参数
// tab 定义一个空的Node 哈希桶数组
// n : 桶的长度
// p:存储在当前位置的元素
Node<K,V>[] tab; Node<K,V> p; int n, i;
//table:hashmap中的重要的组成部分 transient Node<K,V>[] table;
//初始化HashMap
if ((tab = table) == null || (n = tab.length) == 0)
//一边初始化一边给n赋值
n =