JDK原始碼之Map

2021-06-29 01:20:28 字數 1456 閱讀 7052

1. hashmap

hashmap初始化的方式有四種。

建立乙個entry陣列,預設初始長度為16,當大於0.75的時候,擴充套件為當前的2倍。有4中初始化map的方式。

mapmap =

new

hashmap();

mapmap2 = 

new

hashmap(17);

mapmap3 =

new

hashmap(15, 2f);

mapmap4 = 

new

hashmap(map);

map3中的入參,當不傳入時,預設是

initialcapacity=

16, loadfactor=

0.75.當

loadfactor大於1時,會出現當size大於陣列長度後依然不擴充套件陣列,這樣會導致陣列中已存在的entry物件的next值不是null,呼叫get方法時,需要遍歷,導致效能變慢。當

initialcapacity傳入時,陣列的長度也不是

initialcapacity,而是大於

initialcapacity的最小的2的n次方。

put方法中,當

e.hash

== hash && ((k = e.

key) == key || key.equals(k))時,會覆蓋之前的value。所以,如果key的類重寫了equals方法,而沒有重新hashcode方法,可能會導致不覆蓋之前的value。get/put等方法不是同步方法,是非執行緒安全的

2. linkedhashmap

linkedhashmap繼承自hashmap。比hashmap多了乙個entry header。entry類也比hashmap多了before和after,用來記錄存入的順序,所以linkedhashmap中的table其實是乙個存在陣列中的鍊錶。所以linkedhashmap是有序的。在陣列中的順序與hashmap是一致的,get和put方法也於hashmap一致。

3. hashtable

hashtable與hashmap初始化方式一致,只是預設的

initialcapacity=11.hashtable中的get/put等方法是同步方法。是執行緒安

的。

總結:相比linkedhashmap,hashmap無序,但是節省記憶體,相比hashtable,hashmap是非執行緒安全的,所以效率比較高。

hash方法寫的很簡單,還有indexfor方法,應該算是hash演算法吧,但是完全看不明白。

JDK之Map原始碼解讀 一

目錄 size isempty containskey object key containsvalue object value get object key put k key,v value remove object key putall map m clear keyset values ...

原始碼解析 JDK原始碼之LinkedHashMap

linkedhashmap原始碼,基於 jdk1.6.43 他繼承了hashmap,並且實現了插入和訪問的有序功能 public class linkedhashmapextends hashmapimplements map 其也有乙個entry內部類,繼承了 hashmap 的entry 內部類...

JDK原始碼之PriorityQueue原始碼剖析

優先佇列在程式開發中屢見不鮮,比如作業系統在進行程序排程時一種可行的演算法是使用優先佇列,當乙個新的程序被fork 出來後,首先將它放到佇列的最後,而作業系統內部的scheduler負責不斷地從這個優先佇列中取出優先順序較高的程序執行 爬蟲系統在執行時往往也需要從乙個優先順序佇列中迴圈取出高優先順序...