社区
Java SE
帖子详情
有关1.7Hashmap问题
AveiShriety
2020-11-18 07:35:17
问题1:
使用数组+单向链表,插入时头插,扩容时链表也是头插(并发死循环)。
如果扩容时换成尾插是不是就能解决1.7Hashmap的死循环问题了?
问题2:
另外,如果使用数组+数组,hash冲突时也存在数组中,数组就可以采用二分法,理想情况复杂度为O(logN),但没有采用这种,是不是应为数组的扩容复杂度更大?
...全文
4388
2
打赏
收藏
有关1.7Hashmap问题
问题1: 使用数组+单向链表,插入时头插,扩容时链表也是头插(并发死循环)。 如果扩容时换成尾插是不是就能解决1.7Hashmap的死循环问题了? 问题2: 另外,如果使用数组+数组,hash冲突时也存在数组中,数组就可以采用二分法,理想情况复杂度为O(logN),但没有采用这种,是不是应为数组的扩容复杂度更大?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
2 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
冰思雨
2020-11-19
打赏
举报
回复
问题2: 数组+数组的形式不是最优的选择, 1. 楼主是打算构建一个数组形式的链表吗?这种情况下,不能使用二分查找法(因为不是排好序的数组),增删元素时会牵扯到大量的指针拷贝。 2. 采用数组时扩容复杂度并不是首要考虑的因素,频繁的指针拷贝才是性能的瓶颈。 首先,二分查找法是针对有序数组来进行,要么在构建数组时要进行按序插入,要么在查找之前将无序数组进行排序,无论哪种都会进行大量的指针拷贝,降低性能。 其次,数组型的链表有个天生的缺陷就是,插入和删除元素时会引起指针的拷贝(指针在数组内移动位置),时间复杂度明显提升。 链表可以很好的解决这个问题,一般也不存在扩容的问题。 另外,楼主如果不懂指针是什么的话,可以把指针理解为引用,虽然不是同一个东西,但是,初学者是可以这样理解的。
KeepSayingNo
2020-11-18
打赏
举报
回复
问题1:你说得对,1.8就改成尾插了 问题2:不能用数组+数组,那样获取某个key的值就非常慢
HashMap
1.7
死循环
问题
文章详细阐述了在JDK
1.7
中
HashMap
由于其扩容机制和并发操作可能导致的死循环
问题
。
问题
的核心在于头插法和并发扩容,解决方案包括使用Concurrent
HashMap
、Hashtable或对
HashMap
加锁。
jdk
1.7
HashMap
的
问题
本文深入解析了JDK
1.7
中
HashMap
的工作原理,包括其头插法的实现方式,以及在并发环境下可能产生的环形链表
问题
。同时,文章对比了JDK1.8对
HashMap
的改进,如尾插法的引入和链表长度超过8时转换为红黑树的策略,以提升查询效率。
图解JDK
1.7
中
HashMap
头插法扩容造成的死循环
问题
文章详细分析了JDK
1.7
中
HashMap
在扩容时,由于头插法导致的死循环
问题
。在单线程环境中,扩容过程能正确完成,但在多线程环境下,可能导致链表形成环,造成CPU占用100%。解决方案是避免并发使用
HashMap
,推荐使用Concurrent
HashMap
。
HashMap
1.7
中的线程安全
问题
文章详细讨论了JDK
1.7
版本
HashMap
在扩容时出现死循环的
问题
。在扩容过程中,由于头插法和多线程并发,可能导致原有的链表结构产生循环引用,从而引发死循环。当线程在不同的扩容阶段交错操作时,元素的顺序会反转,但指针关系未正确更新,造成next指针形成了环形链表。解决这个
问题
的一个方法是使用JDK1.8及以后版本的
HashMap
,其采用了红黑树避免了类似
问题
。
JDK
1.7
中
HashMap
的多线程并发出现死循环
问题
本文围绕JDK
1.7
中
HashMap
多线程并发出现死循环
问题
展开。介绍了jdk
1.7
与jdk1.8中
HashMap
的数据结构和链表插入方式差异,指出
问题
出在transfer方法。分析了单线程和多线程并发下
HashMap
的扩容情况,总结出链表头插法是导致死循环的原因。
Java SE
62,621
社区成员
307,251
社区内容
发帖
与我相关
我的任务
Java SE
Java 2 Standard Edition
复制链接
扫一扫
分享
社区描述
Java 2 Standard Edition
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章