# HashMap 添加源码分析

> 来源：梦飞idc云平台 | 原文：https://www.mfisp.com/13042.html | 发布：2022-11-23 | 更新：2022-11-23 | 分类：建站教程、投稿分享

### HashMap

  

碼源解析

  

添加源碼解析

  

resize()

  

這個方法在putval中執行，因為要確保你數組不是null

  

resize就是重新计算容量；向HashMap对象里不停的添加元素，而HashMap对象内部的数组无法装载更多的元素时，对象就需要扩大数组的长度，以便能装入更多的元素；当然java里的数组是无法自动扩容的，方法是使用一个新的数组代替已有的容量小的数组；就像我们用一个小桶装

 

##### putVal()

 

###### 首次添加

 

final V putVal(int hash, K key, V value, boolean onlyIfAbsent,  
 boolean evict) {  
 Node<K,V>[] tab; Node<K,V> p; int n, i;  
 if ((tab = table) == null || (n = tab.length) == 0)  
 n = (tab = resize()).length;  
 if ((p = tab[i = (n - 1) & hash]) == null)  
 tab[i] = newNode(hash, key, value, null);  
   
   
 ~~~~~  
   
 ++modCount;  
 if (++size > threshold)  
 resize();  
 afterNodeInsertion(evict);  
 return null;  
 }

 

if ((p = tab[i = (n - 1) & hash) == null)

 

初始化完成后，他会去根据数组长度-1与计算的hash码进行与运算的出来放的数组位置，他会去看这个位置有没有元素

 

有呢就创建一个Node放到这个位置就可以了

 

如果不是null那就只能链表操作了，那个操作等会说

 

if (++size > threshold)  
 resize();  
afterNodeInsertion(evict);  
return null;

 

之后呢，我们要变更size的大小，因为size是记录有多少个真正的元素在这个数组中，threshold就是临界值，我们初始化好了，这个值就是12，这个if呢就是为了判断，你添加到数组的元素，你不能大于这个临界值，那你要是大于了，那我就去扩容去了，否则了那就没事了

 

afterNodeInsertion(evict);

 

afterNodeInsertion(evict);

 

这玩意是为了LinkedHashMap服务的，是为了保证顺序而存在的，在hashmap中没意义。

---
本页由 梦飞idc云平台（https://www.mfisp.com）提供。站点导航见 https://www.mfisp.com/llms.txt
