hashmap 和concurrenthashmap原理

从整体来看,hashmap由 数组+链表+红黑树(二叉树,JDK1.8)组成

最多只能有一个key为null的数据,key不能重复,value可以

hash在put元素时,会先调用Object中的hashcode方法,计算key的hash值,将hashmap看作为桶。将元素放进桶里的时候,若没有碰撞,直接放入,若有碰撞(即出现了hash值一样的key),用链表的方式

将数据叠在一起,通过next方法进行查找。hashmap中的元素是一个个entry实体,包含 key value hashcode等属性。

对于链表来讲,在jdk8之后,若链表中的元素超过8个则自动生成二叉树,小于6个则自动变为链表。这也是为了防止在8左右增删数据时,一直出现链表于二叉树的转变,消耗资源。

对于put方法来讲,该方法会首先计算出对应的hashcode,根据该值去hashmap中寻找对应的对象,若不存在该key,直接插入,若存在则进行替换。若对应数据存在于链表中,会依次查找,时间复杂度为n。

 

concurrenthashmap是线程安全版,JDK1.6采用segment分段锁,不会整表锁定,只会锁住对应段的数据。

JDK1.8采用乐观锁加CAS算法的形式。

posted @ 2020-11-30 19:48  NewToJava  阅读(131)  评论(6)    收藏  举报