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)时,将链表转化为红黑树,以减少搜索时间。

 

posted @ 2019-08-05 20:47  chyblogs  阅读(196)  评论(0)    收藏  举报