Java集合框架_HashMap的底层实现
Hash Map底层是数组和链表结合在一起使用,也就是链表散列。
Hash Map采用Entry数组来存储key-value对,每个键值对组成了一个Entry类实际上是一个单向的链表结构,它具有Next指针,可以连接下一个Entry实体,可以解决Hash冲突的问题。
Hash Map通过key的hashCode经过扰动函数处理过后得到hash值,然后通过(n-1)&hash判断当前元素存放的位置(这里的n指的是数组的长度),如果当前位置存在元素,就判断该元素与要存入的元素的hash值以及key是否相同,如果相同的话直接覆盖,不同的话就通过拉链法解决冲突。
所谓的扰动函数指的就是HashMap的hash方法。使用hash方法也就是扰动函数是为了防止一些实现比较差的hashCode方法,换句话说使用扰动函数之后可以减少碰撞。
1 static final int hash(Object key) { 2 int h; 3 // key.hashCode():返回散列值也就是hashcode 4 // ^ :按位异或 5 // >>>:无符号右移,忽略符号位,空位都以0补齐 6 return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16); 7 }
所谓拉链法就是:将链表和数组结合。也就是说创建一个链表数组,数组中每一格就是一个链表。若遇到哈希冲突,则冲突的值加到链表中即可。

JDK1.8之后在解决哈希冲突时有了较大的变化,当链表长度大于阈值(默认为8)时,将链表转化为红黑树,以减少搜索时间。

浙公网安备 33010602011771号