jdk8从新认识hashmap

从新认识hashmap算法

Hashmap🌩类中有个很重要的字段(Node[]table)这个就是咱们常说的hash桶,本质上这是一个数组,Node是hashmap的内部类,实现了entry接口。。hashmap底层是数组+链表的组合形式。数组

Hashmap的put方法。并发

首先根据key值计算hash值,获得要插入的数组索引i,此时判断table[i]是否为空或者null,若是是空或null,就直接插入。插入之后再判断当前的键值对数量是否超过了最大容量,hashmap的最大容量是16,加载因子是0.75,正常状况下12就会扩容。高并发

而后,如果发现tale[i]不为null,那么此时会先比较当前的tale[i]的首个key值和即将插入的key是否相同(此处的相同是指其中的hashcode和equals是否相同)如果相同,则直接覆盖。code

如果不相同,则开始遍历table[i],此时在jdk8中引入了红黑树的特性,就是说会判断当前链表是否超过8,如果超过了8,则会将链表转化为红黑树,遍历过程当中,如果发现有相同key值时,则覆盖,不然在红黑树或链表中执行插入操做。索引

 

Hashmap的时间复杂度理想状态下是O(1),可是考虑到存在hash碰撞,会致使某个数组table[i]下的链表出现过长的状况,那么此时颇有可能会是O(N)。。为了不这种状况出现,尽可能是采用比较好的算法来减小hash碰撞,目前用的最多见的应该是高位运算和取模运算。接口

 

 

Hashmap的链表插入变化hash

Hashmap在1.7之前采用的是头插入法,这样会出现一个问题是会在扩容时改变链表元素原先的排列顺序,若是此时出现了高并发状况会致使链表成环(链表成环会致使陷入死循环),因此在1.8中改成采用尾插入法,这样就不会改变原有的链表元素位置。table

 

 

红黑树的时间复杂度是hashmap

跟二叉查找树的时间复杂度是同样的,执行查找、插入、删除等操做的时间复杂度为O(logn)

相关文章
相关标签/搜索