HashMap
文章平均质量分 54
一天是程序人
这个作者很懒,什么都没留下…
展开
-
HashMap和concurrentHashMap的区别
1、HashMap 非线程安全数据结构:数组 + 链表(不懂没关系,下边画图解释)entity0 entity1 .... entity(n-2) entity(n-1)原创 2022-04-16 13:19:31 · 10996 阅读 · 0 评论 -
hashmap1.7头插法造成死循环的原因分析
关于这个问题,网上的说法真是五花八门,怎么说的都有,我也不知道他们是不是真的理解。我是对照源码一步步分析的,目前为止,我只看到一个视频和我的观点是一样的,大家不同意的可以自己去扒源码自己分析一遍,至少我的答案按照源码分析是没有出入的。首先说结论:hashmap1.7中的死循环问题并不是发生在并发写入过程,而是发生在get请求中,并发写入只可能形成环状链表;其次,环状链表是几个节点相互指向,不是某个节点自己指向自己。分析:首先上源码:void transfer(Entry[] newTabl原创 2022-04-26 00:43:47 · 6215 阅读 · 11 评论 -
hashmap为什么采用两倍扩容
我们先来看看源码中官方是怎么解释的红线标注意思大概就是:以二次幂展开,容器的元素要么保持原来的索引,要么以二次幂的偏移量出现在新表中。也就是说hashmap采用2倍扩容,可以尽可能的减少元素位置的移动。看下图(不考虑链表的情况)可以看出,数组初始长度为2的幂次方,随后以2倍扩容的方式扩容,元素在新表中的位置要么不动,要么有规律的出现在新表中(二的幂次方偏移量),这样会使扩容的效率大大提高。另外,hashmap采用二倍扩容还有另外一个好处:可以使元素均匀的散布hashmap中,减少原创 2022-04-30 21:53:39 · 8249 阅读 · 0 评论 -
hashmap为什么在链表长度大于8,且数组长度大于64时将链表转换为红黑树
这个问题分两步分析:1、为什么是链表长度大于8时看一下源码解释就是官方做过很多测试,发现链表长度在大于8以后再出现hash碰撞的可能性几乎为0,虽然转化为红黑树后,查找的效率会比链表高,但是转化红黑树这个过程是耗时的,而且在扩容时还要对红黑树重新的左旋右旋保持平衡,相对耗时,所以,阈值设置为8就是为了尽量减少hashmap中出现红黑树(hashmap中链表才是常态)2、为什么数组长度大于64时同样,先看一下源码怎么解释的其实这个源码中解释的不清不楚,里边说最小应该为4*.原创 2022-04-30 22:46:16 · 7511 阅读 · 2 评论