-
hashmap的底层实现
jdk7:数组、链表;
哈希算法(幂等的):哈希冲突–>链表
jdk8级以上:数组、链表、红黑树
增加红黑树是为了解决链表过长查询效率过低的问题(阈值8)
红黑树特点:左中右,小中大(保持这个结构特点则插入比较慢) -
数组:一段连续的存储单元
特点:查询o(1),查询插入o(n)(查快增删慢也是ArrayList的特点,arrayList是基于动态数组的数据结构)
下标(索引);新增删除节点处后面所有下标依次变更
链表:不连续,无序
特点:查询o(n),查询插入o(1)(LinkedList) -
哈希算法(散列):把任意长度值(key)通过散列算法变换成固定长度的key(地址)通过这个地址访问的数据结构。
哈希冲突问题
ascii码值相加在取模算出哈希表下标
4.hashmap存储
key、value、hash(哈希code用于equals方法)、next
put(key,value):当通过转化得出的存储位置相同时(即哈希冲突),当前的位置存放新元素,新元素的next指向原来存储的元素
get(key,value):当查询某个元素,先根据下标到对应存储位置,判断当前是否为空,不为空比较key和hash,不相等则查看当前元素是否有next,再次比较
5.hashMap并发下导致cpu100%问题
并发情况下扩容导致元素指向移位(原因一)
jdk8已解决这个问题,将头插法改为尾插法
链表的头插法与尾插法详解
两个线程同时向hashMap增加数据,需要进行扩容,thread1此时存储为A–>B,在扩容同时thread2拿到执行权限,并进行扩容,因为头插法导致此时为B–>A,2执行完毕将空间让出给1,1拿到的存储为A–>B(线程创建的副本),当前为B–>A,则导致AB元素互为指向,则导致死循环,即CPU100%
HashMap底层实现原理详解