X Tutup
Skip to content

Commit 83c40ba

Browse files
committed
update format
1 parent f670267 commit 83c40ba

File tree

1 file changed

+6
-4
lines changed

1 file changed

+6
-4
lines changed

notes/JavaArchitecture/02 Java 集合框架.md

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff 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

570568
1. 了解底层如何存储数据的
@@ -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;
653655
int 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

0 commit comments

Comments
 (0)
X Tutup