前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >面试题5:在jdk1.8中,HashMap的put方法,如何实现的?Map什么情况会扩容?什么情况会转成红黑树?

面试题5:在jdk1.8中,HashMap的put方法,如何实现的?Map什么情况会扩容?什么情况会转成红黑树?

作者头像
爪哇缪斯
发布2023-05-09 21:33:06
2110
发布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 删除

本文分享自 爪哇缪斯 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档