Java面试题之HashMap 底层源码
原标题:Java面试题之HashMap 底层源码
HashMap 的底层结构在 jdk1.7 中由数组+链表实现, 在 jdk1.8 中由数组+链表+红黑 树实现, 以数组+链表的结构为例 。
JDK1.8 之前 Put 方法:
JDK1.8 之后 Put 方法:
HashMap 基于哈希表的 Map 接口实现, 是以 key-value 存储形式存在, 即主要用来 存放键值对 。HashMap 的实现不是同步的, 这意味着它不是线程安全的 。它的 key 、 value 都可以为 null 。此外, HashMap 中的映射不是有序的 。
JDK1.8 之前 HashMap 由 数组+链表 组成的, 数组是 HashMap 的主体, 链表则是主要为 了解决哈希冲突(两个对象调用的 hashCode 方法计算的哈希码值一致导致计算的数组索引 值相同)而存在的 (“拉链法”解决冲突) .JDK1.8 以后在解决哈希冲突时有了较大的变化 , 当链表长度大于阈值 (或者红黑树的边界值, 默认为 8) 并且当前数组的长度大于 64 时, 此时此索引位置上的所有数据改为使用红黑树存储 。
补充: 将链表转换成红黑树前会判断, 即使阈值大于 8, 但是数组长度小于 64, 此时 并不会将链表变为红黑树 。而是选择进行数组扩容 。
这样做的目的是因为数组比较小, 尽量避开红黑树结构, 这种情况下变为红黑树结构, 反 而会降低效率, 因为红黑树需要进行左旋, 右旋, 变色这些操作来保持平衡 。同时数组长 度小于 64 时, 搜索时间相对要快些 。所以综上所述为了提高性能和减少搜索时间, 底层 在阈值大于 8 并且数组长度大于 64 时, 链表才转换为红黑树 。具体可以参考 treeifyBin 方法 。
当然虽然增了红黑树作为底层数据结构, 结构变得复杂了, 但是阈值大于 8 并且数组 长度大于 64 时, 链表转换为红黑树时, 效率也变的更高效。返回搜狐,查看更多
责任编辑:
相关文章
- 2月23日克来机电涨停分析:自动刹车,人形机器人,机器人概念热股
- 机器人公司Figure融资6.75亿美元:贝索斯微软英伟达OpenAI联合投资
- 优必选人形机器人“入职”车企
- 格力电器公布国际专利申请:“机器人脱困方法及装置、处理器和机器人”
- 光大证券:英伟达将发布的机器人领域成果 有望带来人形机器人板块催化终于有老板接得住00后的离职信了,霸气回应尽显格局,网友:牛!
- 黄强主持召开研究人工智能和机器人产业发展专题会议 加快抢占人工智能和机器人产业发展新赛道她是孙红雷亲妹妹,孙俪都恭敬她3分,演技高却永远捧不红!
- 国泰君安:国内外人形机器人厂商纷纷推出各自产品 推动产业化进程周润发赵雅芝时隔40年再同框!许文强已白发苍苍,冯程程依旧甜
- 贝佐斯和英伟达将加入OpenAI投资人形机器人初创公司Figure明星最想删除的艺考照片:娜扎发际线高,杨幂土气,看到周冬雨笑了
- 硅谷大佬们都向这家初创投了钱!类人型机器人是下一个风口?她因长得太漂亮2岁出道,演“小芈月”红遍全国,如今长成厌世脸
- 人形机器人,上班了!
发表评论
评论列表
- 这篇文章还没有收到评论,赶紧来抢沙发吧~