以jdk7為例說明
hashmap map = new hashmap():
* 在例項化以後,底層建立了長度是16的一維陣列entry table。
* ...可能已經執行過多次put...
* map.put(key1,value1):
* 首先,呼叫key1所在類的hashcode()計算key1雜湊值,此雜湊值經過某種演算法計算以後,得到在entry陣列中的存放位置。
* 如果此位置上的資料為空,此時的key1-value1新增成功。 ----情況1
* 如果此位置上的資料不為空,(意味著此位置上存在乙個或多個資料(以鍊錶形式存在)),比較key1和已經存在的乙個或多個資料
* 的雜湊值:
* 如果key1的雜湊值與已經存在的資料的雜湊值都不相同,此時key1-value1新增成功。----情況2
* 如果key1的雜湊值和已經存在的某乙個資料(key2-value2)的雜湊值相同,繼續比較:呼叫key1所在類的equals(key2)方法,比較:
* 如果equals()返回false:此時key1-value1新增成功。----情況3
* 如果equals()返回true:使用value1替換value2。
** 補充:關於情況2和情況3:此時key1-value1和原來的資料以鍊錶的方式儲存。
** 在不斷的新增過程中,會涉及到擴容問題,當超出臨界值(且要存放的位置非空)時,擴容。預設的擴容方式:擴容為原來容量的2倍,並將原有的資料複製過來。
* jdk8 相較於jdk7在底層實現方面的不同:
* 1. new hashmap():底層沒有建立乙個長度為16的陣列
* 2. jdk 8底層的陣列是:node,而非entry
* 3. 首次呼叫put()方法時,底層建立長度為16的陣列
* 4. jdk7底層結構只有:陣列+鍊錶。jdk8中底層結構:陣列+鍊錶+紅黑樹。
* 4.1 形成鍊錶時,七上八下(jdk7:新的元素指向舊的元素。jdk8:舊的元素指向新的元素)
4.2 當陣列的某乙個索引位置上的元素以鍊錶形式存在的資料個數 > 8 且當前陣列的長度 > 64時,此時此索引位置上的所資料改為使用紅黑樹儲存。
** default_initial_capacity : hashmap的預設容量,16
* default_load_factor:hashmap的預設載入因子:0.75
* threshold:擴容的臨界值,=容量*填充因子:16 * 0.75 => 12
* treeify_threshold:bucket中煉表長度大於該預設值,轉化為紅黑樹:8
* min_treeify_capacity:桶中的node被樹化時最小的hash表容量:64
**二、linkedhashmap的底層實現原理(了解)
* 原始碼中:
* static class entryextends hashmap.node
}* 補充注意 :一map結構的理解:
* map中的key:無序的、不可重複的,使用set儲存所有的key ---> key所在的類要重寫equals()和hashcode() (以hashmap為例)
* map中的value:無序的、可重複的,使用collection儲存所有的value --->value所在的類要重寫equals()
* 乙個鍵值對:key-value構成了乙個entry物件。 * map中的entry:無序的、不可重複的,使用set儲存所有的entry
*二,map的實現類的結構:
* |----map:雙列資料,儲存key-value對的資料 ---類似於高中的函式:y = f(x)
* |----hashmap:作為map的主要實現類;執行緒不安全的,效率高;儲存null的key和value
* |----linkedhashmap:保證在遍歷map元素時,可以按照新增的順序實現遍歷。
* 原因:在原有的hashmap底層結構基礎上,新增了一對指標,指向前乙個和後乙個元素。
* 對於頻繁的遍歷操作,此類執行效率高於hashmap。
* |----treemap:保證按照新增的key-value對進行排序,實現排序遍歷。此時考慮key的自然排序或定製排序
* 底層使用紅黑樹
* |----hashtable:作為古老的實現類;執行緒安全的,效率低;不能儲存null的key和value
* |----properties:常用來處理配置檔案。key和value都是string型別**
* hashmap的底層:陣列+鍊錶 (jdk7及之前)
* 陣列+鍊錶+紅黑樹 (jdk 8)
hashmap底層實現原理
每次初始化hashmap都會構造乙個table陣列,而table陣列的元素為entry節點。static class entryimplements map.entryhashmap也可以說是乙個陣列鍊錶,hashmap裡面有乙個非常重要的內部靜態類 entry,這個entry非常重要,它裡面包含了...
HashMap底層實現原理
hashmap map new hashmap 在例項化以後,底層建立了長度為16的一維陣列entry table 已經執行過put操作.map.put key1 value1 呼叫key1所在類的hashcode 計算key1雜湊值,此雜湊值經過某種演算法計算後,得到在entry陣列中的存放位置 ...
HashMap底層實現原理
一 jdk1.7中hashmap的底層實現原理 首先,當我們通過hashmap的構造方法建立乙個hashmap物件時,底層就會建立乙個entry型別的一維陣列 預設初始化長度為16 當我們執行put操作的時候,會呼叫key所屬類的hashcode方法計算出key的hash值,然後將hash值通過雜湊...