File tree Expand file tree Collapse file tree 1 file changed +6
-4
lines changed
Expand file tree Collapse file tree 1 file changed +6
-4
lines changed Original file line number Diff line number Diff line change @@ -563,8 +563,6 @@ Node<E> node(int index) {
563563
564564## HashMap
565565
566- 为了便于理解,以下源码分析以 JDK 1.8 为主。更详细的源码分析,转向:[ 搞懂 Java HashMap 源码] ( https://juejin.im/post/5ac83fa35188255c5668afd0 )
567-
568566我们这篇文章就来试着分析下 HashMap 的源码,由于 HashMap 底层涉及到太多方面,一篇文章总是不能面面俱到,所以我们可以带着面试官常问的几个问题去看源码:
569567
5705681 . 了解底层如何存储数据的
@@ -642,7 +640,11 @@ map.put("美团","小美");
642640
643641系统将调用"美团"这个key的hashCode()方法得到其hashCode 值(该方法适用于每个Java对象),然后再通过Hash算法的后两步运算(高位运算和取模运算,下文有介绍)来定位该键值对的存储位置,有时两个key会定位到相同的位置,表示发生了Hash碰撞。当然Hash算法计算结果越分散均匀,Hash碰撞的概率就越小,map的存取效率就会越高。
644642
645- 如果哈希桶数组很大,即使较差的Hash算法也会比较分散,如果哈希桶数组数组很小,即使好的Hash算法也会出现较多碰撞,所以就需要在空间成本和时间成本之间权衡,其实就是在根据实际情况确定哈希桶数组的大小,并在此基础上设计好的hash算法减少Hash碰撞。那么通过什么方式来控制map使得Hash碰撞的概率又小,哈希桶数组(Node[ ] table)占用空间又少呢?答案就是好的Hash算法和扩容机制。
643+ 如果哈希桶数组很大,即使较差的Hash算法也会比较分散,如果哈希桶数组数组很小,即使好的Hash算法也会出现较多碰撞,所以就需要在空间成本和时间成本之间权衡,其实就是在根据实际情况确定哈希桶数组的大小,并在此基础上设计好的hash算法减少Hash碰撞。
644+
645+ ** 那么通过什么方式来控制map使得Hash碰撞的概率又小,哈希桶数组(Node[ ] table)占用空间又少呢?**
646+
647+ 答案就是好的Hash算法和扩容机制。
646648
647649在理解Hash和扩容流程之前,我们得先了解下HashMap的几个字段。从HashMap的默认构造函数源码可知,构造函数就是对下面几个字段进行初始化,源码如下:
648650
@@ -653,7 +655,7 @@ int modCount;
653655int size;
654656```
655657
656- 首先,Node[ ] table的初始化长度length(默认值是16), Load factor为负载因子(默认值是0.75),threshold是HashMap所能容纳的最大数据量的Node(键值对)个数。threshold = length * Load factor。也就是说,在数组定义好长度之后,负载因子越大,所能容纳的键值对个数越多。
658+ 首先,** Node[ ] table的初始化长度length(默认值是16)** , ** Load factor为负载因子(默认值是0.75)** ,threshold是HashMap所能容纳的最大数据量的Node(键值对)个数。** threshold = length * Load factor** 。也就是说,在数组定义好长度之后,负载因子越大,所能容纳的键值对个数越多。
657659
658660结合负载因子的定义公式可知,threshold就是在此Load factor和length(数组长度)对应下允许的最大元素数目,超过这个数目就重新resize(扩容),扩容后的HashMap容量是之前容量的两倍。默认的负载因子0.75是对空间和时间效率的一个平衡选择,建议大家不要修改,除非在时间和空间比较特殊的情况下,如果内存空间很多而又对时间效率要求很高,可以降低负载因子Load factor的值;相反,如果内存空间紧张而对时间效率要求不高,可以增加负载因子loadFactor的值,这个值可以大于1。
659661
You can’t perform that action at this time.
0 commit comments