亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

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

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

HashMap的底層原理是什么

發布時間:2021-07-04 13:07:51 來源:億速云 閱讀:220 作者:Leah 欄目:移動開發

這篇文章將為大家詳細講解有關HashMap的底層原理是什么,文章內容質量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關知識有一定的了解。

一:HashMap的節點:HashMap是一個集合,鍵值對的集合,源碼中每個節點用Node<K,V>表示

static class Node<K,V> implements Map.Entry<K,V> {   final int hash;   final K key;
   V value;
   Node<K,V> next;

Node是一個內部類,這里的key為鍵,value為值,next指向下一個元素,可以看出HashMap中的元素不是一個單純的鍵值對,還包含下一個元素的引用。

二:HashMap的數據結構:HashMap的數據結構為 數組+(鏈表或紅黑樹),上圖:

HashMap的底層原理是什么

image.png

為什么采用這種結構來存儲元素呢?

數組的特點:查詢效率高,插入,刪除效率低。

鏈表的特點:查詢效率低,插入刪除效率高。

在HashMap底層使用數組加(鏈表或紅黑樹)的結構完美的解決了數組和鏈表的問題,使得查詢和插入,刪除的效率都很高。

三:HashMap存儲元素的過程:

有這樣一段代碼:

HashMap<String,String> map = new HashMap<String,String>();
map.put("劉德華","張惠妹");
map.put("張學友","大S");

現在我要把鍵值對 “劉德華”,”張惠妹”存入map:

第一步:計算出鍵“劉德華”的hashcode,該值用來定位要將這個元素存放到數組中的什么位置.

什么是hashcode?

在Object類中有一個方法:

public native int hashCode();

該方法用native修飾,所以是一個本地方法,所謂本地方法就是非java代碼,這個代碼通常用c或c++寫成,在java中可以去調用它。

調用這個方法會生成一個int型的整數,我們叫它哈希碼,哈希碼和調用它的對象地址和內容有關.

哈希碼的特點是:

對于同一個對象如果沒有被修改(使用equals比較返回true)那么無論何時它的hashcode值都是相同的

對于兩個對象如果他們的equals返回false,那么他們的hashcode值也有可能相等

明白了hashcode我們再來看元素如何通過hashcode定位到要存儲在數組的哪里,通過hashcode值和數組長度取模我們可以得到元素存儲的下標。

劉德華的hashcode為20977295 數組長度為 16則要存儲在數組索引為 20977295%16=1的地方

HashMap的底層原理是什么

1.jpg

可以分兩種情況:

1. 數組索引為1的地方是空的,這種情況很簡單,直接將元素放進去就好了。

2. 已經有元素占據了索引為1的位置,這種情況下我們需要判斷一下該位置的元素和當前元素是否相等,使用equals來比較。

如果使用默認的規則是比較兩個對象的地址。也就是兩者需要是同一個對象才相等,當然我們也可以重寫equals方法來實現我們自己的比較規則最常見的是通過比較屬性值來判斷是否相等。

如果兩者相等則直接覆蓋,如果不等則在原元素下面使用鏈表的結構存儲該元素

HashMap的底層原理是什么

2.jpg

每個元素節點都有一個next屬性指向下一個節點,這里由數組結構變成了數組+鏈表結構,紅黑樹又是怎么回事呢?

因為鏈表中元素太多的時候會影響查找效率,所以當鏈表的元素個數達到8的時候使用鏈表存儲就轉變成了使用紅黑樹存儲,原因就是紅黑樹是平衡二叉樹,在查找性能方面比鏈表要高.

四:HashMap中的兩個重要的參數:HashMap中有兩個重要的參數:初始容量大小和加載因子,初始容量大小是創建時給數組分配的容量大小,默認值為16,用數組容量大小乘以加載因子得到一個值,一旦數組中存儲的元素個數超過該值就會調用rehash方法將數組容量增加到原來的兩倍,專業術語叫做擴容.

在做擴容的時候會生成一個新的數組,原來的所有數據需要重新計算哈希碼值重新分配到新的數組,所以擴容的操作非常消耗性能.

HashMap的底層原理是什么

關于HashMap的底層原理是什么就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細節

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

AI

赤城县| 定南县| 廉江市| 烟台市| 共和县| 弋阳县| 开江县| 玛多县| 县级市| 南康市| 银川市| 肥乡县| 阿巴嘎旗| 霍林郭勒市| 阿坝| 保德县| 措美县| 灌阳县| 沂源县| 东辽县| 灵丘县| 和硕县| 新兴县| 台安县| 临潭县| 常德市| 建昌县| 南充市| 皮山县| 莱阳市| 岗巴县| 绥化市| 镇雄县| 新民市| 文安县| 中阳县| 滦南县| 开鲁县| 桂阳县| 禄丰县| 萨迦县|