JAVA—HashMap

一些关于hashmap的学习笔记

1.HashMap底层实现原理

  在JDK1.7中HashMap是以数组加链表的形式组成的,在JDK1.8之后新增了红黑树的组成结构,当链表大于8并且容量大于64时,链表结构会转变成红黑树结构。

  数组中的元素称为哈希桶,每个哈希桶有四个字段,hash、key、value以及表示下一个节点的next。

2.JDK1.8对HashMap的优化

  (1)添加了红黑树,因为链表过长会影响HashMap的性能,降低效率,而红黑树具有快速增删改查的特点,可以有效提高效率问题。

  (2)死循环优化,链表插入方式改为尾部正序插入

  (3)优化扩容,JDK1.8在扩容的时候选择通过高位运算e.hash&olcCap来确定元素是否需要移动,而不是重新计算哈希值。

比如:

key1.hash=10 0000 1010

oldCap=16 0001 0000

高一位结果为0,0表示元素在扩容时位置不会发生变化

key2.hash=10 0001 0001

oldCap=16 0001 0000

这时候高一位为1,1表示元素在扩容时发生了位置变化,新的下标位置等于原下标位置+原数组长度

3.HashMap死循环

  JDK1.7之前死循环造成的主要原因是HashMap并不是线程安全的并且在JDK1.8之前的插入方式为首部倒序插入。假设一个HashMap的默认大小为2,原本里面有个key(5),现创建两个线程,t1向HashMap中添加元素key(3),t2添加元素key(7),t1在对next赋值后,t2得到cpu使用权,此时t1中e指向key(3),next指向key(7),之后t2重新rehash,链表顺序被反转,这时key(7)的next为key(3),之后查询时久形成了循环调用,导致死循环。

猜你喜欢

转载自www.cnblogs.com/zucc-31701019/p/12705804.html