1、HashMap引入了链式寻址法来解决hash冲突,冲突的key,HashMap把这些key组成一个单向链表,然后采用尾插法把key保存到链表的尾部。
使用二次扰动函数(hash函数)来降低哈希冲突的概率,使数据平均分布。
public V put(K key, V value) {
return putVal(hash(key), key, value, false, true);
}
static final int hash(Object key) {
int h;
return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
}
为了避免链表过长问题,当链表长度大于8并且数组长度等于64的时候,HashMap会把链表转化为红黑树,从而减少数据查询的时间复杂度,提升查询性能。
2、开放寻址法,直接从冲突的数组位置往下寻找一个空的数组存储,在ThreadLocal中使用到。
3、再hash法,如果某个hash函数产生了冲突,在用另外一个hash计算,布隆过滤器。
4、建立公共溢出区,把存在冲突的key统一放在一个公共溢出区里。