![]() |
Java架构-HashMap 底层实现原理,看完面试不再懵逼 |
珠江路在线
2019年9月9日
【
转载
】Java架构笔记 编辑:
|
|
想必大家都晓得HashSet和HashMap中间的关系,HashSet是依赖于HashMap的,HashSet 集中便是HashMap的key所构成的 集中,我们都晓得HashMap的value是 能够 反复的,然而key是不能 反复的,同样我们也清晰Map 集中是无序的,所以HashSet 集中的特色便是 无序且 保障元素不 反复 。
然而其实作为一个有 教训的开发人员来说,至少我们应该是大约扫过源码的,所以面试时答上面那些是不够的,其实大家在最开始学的都是懵懵的,总是一种 “我是谁,我在哪,我要干什么的 觉得”,反正我学东西最开始都是这种觉得,好了不扯了 。回到咱们探究的问题上来,HashSet 创立时都做了哪些步骤,底层到底是怎么实现的,请 接续往下看
首先,我们 创立HashSet 集中都是调用它的 构造 步骤,HashSet提供了好几个 构造 步骤, 能够传递 初始容量和 加载因子,其实无论你 创立HashSet时调用的是哪个 构造 步骤,底层调用的都是HashMap的这个 构造 步骤, 诠释写的 比较 详尽, 了解了这张图,再往下 接续看
下面我们再来聊一下put 步骤是如何 保障map的key唯一?
hashmap中key为null的元素 确定是 保留在table[0],当hash 摩擦 产生时,采纳链地址法来解决 摩擦,使数据 能够 畸形 保留,不过map长度为偶数已经尽量在幸免hash 摩擦, 保障存入map的数据尽量 匀称 分布,当map中元素大于等于临界值threshold(map容量乘以加载因子)时,resize() 步骤会对map进行扩容,是之前容量的2倍,在扩容之后会对将原table中的数据 通过再一次计算索引后放入新的table中,traner() 步骤便是最 消费 工夫的再一次赋值的操作 。赋值 实现后,会将新增加的元素放入扩容之后的map中 。