
普歌-允异团队-HashMap面试题(续)
发布日期:2021-05-08 03:42:12
浏览次数:26
分类:精选文章
本文共 853 字,大约阅读时间需要 2 分钟。
1.HashMap扩容流程?
- HashMap的扩容指的就是数组的扩容, 因为数组占用的是连续内存空间,所以数组的扩容只能新开一个新的数组,然后把老数组上的元素转移到新数组上来
- 在HashMap中也是一样,先新建一个2倍数组大小的数组
- 然后遍历老数组上的每一个位置,如果这个位置上是一个链表,就把这个链表上的元素转移到新数组上去
- 在这个过程中就需要遍历链表,jdk7和jdk8在这个实现时是有不一样的
- jdk7就是简单的遍历链表上的每一个元素,然后按每个元素的hashcode结合新数组的长度重新计算得出一个下标,而重新得到的这个数组下标很可能和之前的数组下标是不一样的,这样子就达到了一种效果,就是扩容之后,某个链表会变短,这也就达到了扩容的目的,缩短链表长度,提高了查询效率
- jdk8中,因为涉及到红黑树,比较复杂,jdk8中会用到一个双向链表来维护红黑树中的元素,所以jdk8中在转移某个位置上的元素时,会去判断如果这个位置是一个红黑树,那么会遍历该位置的双向链表,遍历双向链表统计哪些元素在扩容完之后还是原位置,哪些元素在扩容之后在新位置,这样遍历完双向链表后,会得到两个子链表,一个放在原下标位置,一个放在新下标位置,如果原下标位置或新下标位置没有元素,则红黑树不用拆分,否则判断这两个子链表的长度,如果超过八,则转成红黑树放到对应的位置,否则把单向链表放到对应的位置。
- 元素转移完了之后,在把新数组对象赋值给HashMap的table属性,老数组会被回收到。
2.HashMap的数组的大小是2的幂次方
key-value对需要存储到数组中时,需要生成一个数组下标(不能越界)。在HashMap中,先得到key的hashcode(数字)
通过hashcode & (table.length - 1) 运算得到一个数组下标
- 与运算计算出来一个数组下标的,而不是通过取余,与运算相比于取余运算速度更快
- 前提条件,数组的长度是2的幂次方数。
-
作者:麦克猫Cat
-
本文版权归作者和CSDN共有,欢迎交流
发表评论
最新留言
路过按个爪印,很不错,赞一个!
[***.219.124.196]2025年05月03日 12时16分13秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
git远程仓库切换
2019-03-14
国芯网国产芯片精选月刊V20190801 国产芯片 芯片选型 芯片厂家
2019-03-14
华大芯片调试问题
2019-03-14
DCMTK:存储服务类用户(C-STORE操作)
2019-03-14
带照片捕捉功能的ESP32-CAM PIR运动检测器
2019-03-15
如何使用SSH远程管理Linux服务器
2019-03-15
降级到旧版本macOS的3种方法
2019-03-15
学习Vue.js2.0(国外视频教程)
2019-03-15
在FPGA板上实现数字时钟的VHDL代码
2019-03-15
wxPython和PyOpenGL视频
2019-03-15
在30分钟内学习PHP
2019-03-15
Python http.server 服务器
2019-03-15
Python svm 支持向量机
2019-03-15
OpenStack 最小化安装配置(一):物理机网桥配置
2019-03-15
PS快速美白照片
2019-03-15
ubuntu 16.04 镜像下载
2019-03-15
CUDA9.1、cuDNN7在Ubuntu16.04上的安装
2019-03-15
微信小程序云开发:怎么删除云函数?已解决
2019-03-15