
普歌-允异团队-HashMap面试题(续)
发布日期:2021-05-08 03:42:12
浏览次数:21
分类:原创文章
本文共 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共有,欢迎交流
发表评论
最新留言
哈哈,博客排版真的漂亮呢~
[***.90.31.176]2025年04月16日 04时42分18秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
【Numpy学习】np.count_nonzero()用法解析
2019-03-05
Scala集合-数组、元组
2019-03-05
Flink Standalone集群安装和部署
2019-03-05
JAVA网络爬虫01-http client爬取网络内容
2019-03-05
04 程序流程控制
2019-03-05
java并发编程(1)
2019-03-05
C++&&STL
2019-03-05
双指针算法思想
2019-03-05
分组背包问题
2019-03-05
子集(LeetCode 78)
2019-03-05
旋转数组的最小值
2019-03-05
1004 Counting Leaves (30分)
2019-03-05
1093 Count PAT‘s (25分) 含DP做法
2019-03-05
一篇解决JMM与volatile详解(二)
2019-03-05
数据结构之数组与经典面试题(二)
2019-03-05
无锁并发框架-Disruptor的使用(二)
2019-03-05
Android wm命令
2019-03-05
boot.img 解包与打包
2019-03-05
Android4.4 平板背光设置
2019-03-05
递归复习--二叉搜索树
2019-03-05