91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

java中HashMap解析put的過程是什么

發布時間:2023-05-06 11:42:22 來源:億速云 閱讀:117 作者:iii 欄目:開發技術

這篇文章主要介紹“java中HashMap解析put的過程是什么”的相關知識,小編通過實際案例向大家展示操作過程,操作方法簡單快捷,實用性強,希望這篇“java中HashMap解析put的過程是什么”文章能幫助大家解決問題。

HashMap解析put的過程

首先,用代碼運行下,來體會下:

代碼實現:

@Test
	public void test1() {
		//創建了一個HashMap
		Map<String,Object>map = new HashMap<>();

		//使用put方法保存數據
		map.put("age", 12);
		map.put("name", "gaga");
		
		System.out.println(map);
		}

運行結果:

java中HashMap解析put的過程是什么

首先經過了hash之后的key,是一個整型的hashcode,其次是我們傳入的key和value。

首先一進入putVal就會聲明存放數據的table,如果這個HashMap是首次設置值,就會被初始化一個默認size的table,且所有元素的初始值都是NULL。

默認值為啥是16

通過源碼解析,在注釋中會得到“The default initial capacity - MUST be a power of two.”意思是:默認初始容量-必須是2的冪。

java中HashMap解析put的過程是什么

自動擴容

除了size,初始化的時候還會設定一個閾值,值為12,newThr = 12,這里需要提到一個概念負載因子,HashMap的實現里默認給的是0.75。

負載因子是用來干嘛的呢?當我們不停的往map里存數據的時候,總會存滿,當元素快存滿的時候,我們就需要擴大map的容量,來容納更多的元素,這就需要一個自動擴容的機制了。

在當數據量大于超過設定的閾值的時候(容量*負載因子),自動對map進行擴容,以存放更多的數據。

自動擴容做了什么事情呢?

  • 1、創建新的數組,大小是原來數組的一倍。

  • 2、將元素rehash到新的數組

為什么要rehash呢?上面我們提到過了,當元素被放進map時,確認下標的方法是table的長度-1和hash值做與運算,現在table的長度發生了變化,那么自然而然,元素獲取下標的運算結果也就跟之前的不一樣了, 所以需要將老的map中的元素再按照新的table長度rehash到擴容后的table中。

put的過程

了解了底層數據結構和自動擴容機制,接下來我們來看一下put過程中究竟發生了什么。

我們上面說過了,會通過數組的長度-1和hash值與運算得到一個數組下標。

如果該位置沒有元素,那么就很簡單,直接新建一個節點即可然后放置在數據的具體位置即可。

tab[i] = this.newNode(hash, key, value, (HashMap.Node)null);

但是如果該下標已經有元素了,這種情況HashMap是怎么處理的呢?這也要看情況。

如果是跟當前槽位相同的key,就直接覆蓋。這就是我們修改某個key的值會發生的情況。

那HashMap怎么來判斷是不是同一個key呢?

就像下面這樣。p就是當前槽位上已經有的元素,如果新、老元素的key的hashCode和值都相同且key不為空,那么就能證明這兩個key是相同的,那么此時只需要覆蓋即可。

p.hash == hash && ((k = p.key) == key || (key != null && key.equals(k)))

而如果p是TreeNode的實例,那么就代表當前槽位已經是一個紅黑樹了,此時只需要往這個樹里putTreeVal即可。

至于為什么是紅黑樹,哪兒來的紅黑樹,下面馬上就要講到了。

最后一種情況就是,既不是已經存在的元素也不是TreeNode的實例,也不是紅黑樹。這種情況下,它就是一個普通的Node。

你可以理解為鏈表,如果hash沖突了,就把這個Node放到該位置的鏈表末尾。

當該位置的鏈表中的元素超過了TREEIFY_THRESHOLD所設置的數量時,就會觸發樹化,將其轉化為紅黑樹。Java8里給的默認值是8。

java中HashMap解析put的過程是什么

java中HashMap解析put的過程是什么

為啥要轉化成紅黑樹?

首先我們要知道為什么要樹化。

當大量的數據放入Map中,Hash沖突會越來越多,某些位置就會出現一個很長的鏈表的情況。

這種情況下,查詢時間復雜度是O(n) ,刪除的時間復雜度也是O(n),查詢、刪除的效率會大大降低。

而同樣的數據情況下,平衡二叉樹的時間復雜度都是O(logn)。

關于“java中HashMap解析put的過程是什么”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識,可以關注億速云行業資訊頻道,小編每天都會為大家更新不同的知識點。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

淅川县| 乳山市| 金山区| 长岛县| 织金县| 靖边县| 黔江区| 辽阳县| 八宿县| 大安市| 民和| 梅河口市| 丰宁| 张家口市| 城口县| 曲靖市| 深州市| 合川市| 万山特区| 佛学| SHOW| 屏东市| 栾城县| 策勒县| 嘉义县| 台湾省| 城步| 元朗区| 贵定县| 贺州市| 青岛市| 杭锦旗| 疏勒县| 从江县| 浦东新区| 南涧| 德州市| 西乌珠穆沁旗| 贵南县| 安陆市| 托克逊县|