一文徹底弄懂Java中HashMap的原理

說說Java中HashMap的原理?
HashMap 是 Java 中一個常用的集合類,它基于哈希表實現(xiàn)。HashMap 允許存儲鍵值對(key-value pairs),并且通過提供的鍵快速查找其對應的值。下面將詳細介紹 HashMap 的工作原理,包括其內(nèi)部結(jié)構(gòu)、如何處理哈希沖突以及一些重要的特性。
1. 內(nèi)部結(jié)構(gòu)
HashMap 的內(nèi)部結(jié)構(gòu)主要由以下幾個部分組成:
- 數(shù)組 + 鏈表(或紅黑樹):
HashMap使用一個數(shù)組(table)來存儲鍵值對的引用。每個數(shù)組元素稱為桶(bucket)。- 每當向
HashMap中添加一個鍵值對時,Java會通過哈希函數(shù)計算出鍵的哈希值,然后根據(jù)該哈希值確定存儲在數(shù)組中的位置。 - 如果多個鍵的哈希值經(jīng)過處理后映射到同一個位置(即發(fā)生哈希沖突),則會將這些鍵值對以鏈表的形式存儲 (在 Java 8 及以后版本中,當鏈表長度超過閾值時,會轉(zhuǎn)化為紅黑樹以提高效率)。
2. 哈希函數(shù)
哈希函數(shù)用于將鍵轉(zhuǎn)換為一個整數(shù)索引,這個索引即是數(shù)組中存儲該鍵值對的位置。Java 中 HashMap 的 hash 方法采用了 hashCode 方法生成的哈希值,并通過進一步處理得到數(shù)組索引:
int index = (hash & (n - 1)); // n 是數(shù)組的長度,通常是 2 的冪
這種處理方式能夠確保索引的均勻分布,并利用位運算來降低計算成本。
3. 哈希沖突處理
當不同的鍵經(jīng)過哈希函數(shù)計算后產(chǎn)生相同的索引時,就會出現(xiàn)哈希沖突。在 HashMap 中,主要有兩種沖突解決策略:
- 鏈表法:在同一桶中存放一個鏈表,所有哈希沖突的鍵值對都被存放在這個鏈表內(nèi)。
- 紅黑樹法:在
Java 8及以后版本中,如果某個桶中的鏈表節(jié)點數(shù)超過一定閾值(默認是 8),那么鏈表就會轉(zhuǎn)化為紅黑樹,以提高查找效率。
4. 常見操作
插入:插入一個鍵值對時,首先通過鍵的哈希值計算得到數(shù)組索引,然后將其插入到對應的桶中。如果存在哈希沖突,則將新的鍵值對加入到鏈表或紅黑樹中。
查找:查找一個值時,同樣通過鍵的哈希值計算索引,并在對應的桶中遍歷鏈表或紅黑樹查找對應的值。
刪除:刪除操作的流程與查找類似,找到對應的桶后,遍歷鏈表或紅黑樹并將指定的鍵值對刪除。
5. 重要特性
非線程安全:
HashMap類不是線程安全的;在多線程環(huán)境下并發(fā)訪問可能會導致數(shù)據(jù)不一致??梢允褂?Collections.synchronizedMap或ConcurrentHashMap來替代。允許空值:
HashMap并不限制鍵或值為 null,可以存儲一個 null 鍵和多個 null 值。無順序保證:
HashMap中的元素沒有固定的順序。如果需要保持插入順序,可以使用LinkedHashMap。
6. 擴容機制
默認情況下,HashMap 的初始容量是 16,負載因子是 0.75。負載因子是決定何時需要擴容的閾值。當 HashMap 中的元素數(shù)量達到容量的 75% 時,HashMap 會觸發(fā)擴容機制,創(chuàng)建一個新的數(shù)組并將原有的鍵值對重新映射到新數(shù)組中,這個新數(shù)組的大小通常是原數(shù)組的兩倍。
總結(jié)
HashMap 是基于哈希表的數(shù)據(jù)結(jié)構(gòu),提供高效的鍵值對存儲和檢索。在使用時理解其內(nèi)部實現(xiàn)和性能特性,可以更好地發(fā)揮其優(yōu)勢,避免性能瓶頸和內(nèi)存浪費。
到此這篇關(guān)于Java中HashMap原理的文章就介紹到這了,更多相關(guān)Java中HashMap原理內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
由淺到深帶你詳談Java實現(xiàn)數(shù)組擴容的三種方式
這篇文章主要詳細介紹了Java實現(xiàn)數(shù)組擴容的三種方式,新建一個數(shù)組,把原來數(shù)組的內(nèi)容搬到新數(shù)組中,使用system.arraycopy(),使用java.util.Arrays.copyOf()這三種方式,具有一定的參考價值,需要的朋友可以借鑒一下2023-06-06
SpringBoot如何優(yōu)雅實現(xiàn)接口參數(shù)驗證
為了保證參數(shù)的正確性,我們需要使用參數(shù)驗證機制,來檢測并處理傳入的參數(shù)格式是否符合規(guī)范,所以本文就來和大家聊聊如何優(yōu)雅實現(xiàn)接口參數(shù)驗證吧2023-08-08
Java安全框架——Shiro的使用詳解(附springboot整合Shiro的demo)
這篇文章主要介紹了Java安全框架——Shiro的使用詳解,幫助大家更好的理解和學習使用Shiro,感興趣的朋友可以了解下2021-04-04

