1. JDK 8 之前
- 底层使用的是
Entry
数组加链表的形式 - 通过
key
的hashCode
经过扰动函数处理之后得到hash
值,再通过(n - 1) & hash
来分配存放位置 - 通过拉链法解决哈希冲突
- 链表元素的插入方式是头插法
扰动函数
也就是 HashMap
的 hash
方法,使用 hash
方法是为了防止一些实现较差的 hashCode()
方法,为了减少碰撞
1.7 的 Hash 方法
static int hash(int h) {
h ^= (h >>> 20) ^ (h >>> 12);
return h ^ (h >>> 7) ^ (h >>> 4)
}
拉链法
将链表和数组相结合,也就是创建一个链表数组&#