爪哇缪斯
面试题5:在jdk1.8中,HashMap的put方法,如何实现的?Map什么情况会扩容?什么情况会转成红黑树?
关注作者
前往小程序,Get
更优
阅读体验!
立即前往
腾讯云
开发者社区
文档
建议反馈
控制台
首页
学习
活动
专区
工具
TVP
最新优惠活动
文章/答案/技术大牛
搜索
搜索
关闭
发布
登录/注册
首页
学习
活动
专区
工具
TVP
最新优惠活动
返回腾讯云官网
爪哇缪斯
首页
学习
活动
专区
工具
TVP
最新优惠活动
返回腾讯云官网
社区首页
>
专栏
>
面试题5:在jdk1.8中,HashMap的put方法,如何实现的?Map什么情况会扩容?什么情况会转成红黑树?
面试题5:在jdk1.8中,HashMap的put方法,如何实现的?Map什么情况会扩容?什么情况会转成红黑树?
爪哇缪斯
关注
发布于 2023-05-09 21:33:06
240
0
发布于 2023-05-09 21:33:06
举报
文章被收录于专栏:
爪哇缪斯
数组默认大小为
16
,负载因子是
0.75
,阈值为
12
;如果超过阈值,则扩展为原来的
两倍
。
首先:根据key通过哈希算法和按位与运算计算出
数组下标
。
其次:如果数组下标位置没有元素,则将key和value封装为Entry对象(JDK 1.7中是
Entry对象
,JDK 1.8中是
Node对象
),并放入该位置。
最后:如果数组下标位置元素不为空,则要分情况讨论:
如果是JDK 1.7,则先判断是
否需要扩容
;如果要扩容,则进行扩容操作;否则就生成
Entry对象
,并将对象插入到链表的
头部
。
如果是JDK 1.8,则会先判断当前位置上的
Node类型
,是红黑树Node还是链表Node。
如果是
红黑树Node
,则将key和value封装为一个红黑树节点并添加到红黑树中去,在这个过程中会判断红黑树中是否存在当前key,如果存在则更新value值。
如果是
链表Node
,则将key和value封装为一个链表Node并插入到链表的
尾部
。这个插入尾部的过程中,需要遍历链表,如果发现存在相同的key,则更新value,否则执行插入操作,
当链表节点个数超过了8个,且数组大于等于64
,则会将该
链表转化为红黑树
。
将key和value封装为Node插入到链表或红黑树中后,再判断是否需要进行扩容——如果需要就扩容,不需要就结束put操作。
jdk1.8HashMap扩容源码解析
本文参与
腾讯云自媒体同步曝光计划
,分享自微信公众号。
原始发表:2021-10-12,如有侵权请联系
cloudcommunity@tencent.com
删除
hashmap
map
对象
链表
数组
本文分享自
爪哇缪斯
微信公众号,
前往查看
如有侵权,请联系
cloudcommunity@tencent.com
删除。
本文参与
腾讯云自媒体同步曝光计划
,欢迎热爱写作的你一起参与!
hashmap
map
对象
链表
数组
评论
登录
后参与评论
0 条评论
热度
最新
推荐阅读
LV.
文章
0
获赞
0
领券
问题归档
专栏文章
快讯文章归档
关键词归档
开发者手册归档
开发者手册 Section 归档
0
0
0
推荐