开篇
本文基于 jdk1.8 讲述 HashMap 的 hash 算法,但是不会详细介绍其他相关内容(比如用法,底层数据结构)。所以必须事先知晓下面几点:
HashMap 的底层数据结构是数组,在数组的基础上再去考虑链表或者红黑树
put 一个 key-value 时,会先计算出在数组中的索引位置,再考虑剩下的步骤
位运算操作(异或,与)
java 运算符优先级
正文
HashMap 是基于 key-value 形式存放元素的,所使用的方法是 put(key, value)。
1. HashMap 的 put 方法源码
// 再次强调这是 jdk1.8 源码
public V put(K key, V value) {
// 这里调用 putVal() 方法
// 传入的第一个参数:是根据 key 计算出的 hash 值
return putVal(hash(key), key, value, false, true);
}
final V putVal(int hash, K key, V value, boolean onlyIfAbsent, boolean evict) {
Node[] tab; Node p; int n, i;
// 获取数组的长度
if ((tab = table) == null || (n = tab.length) == 0)
n = (tab = resize()).length;
// 计算元素在数组中的索引位置
if ((p = tab[i = (n