JDK源碼之Map

1. HashMap
HashMap初始化的方式有四種。
創建一個Entry數組,默認初始長度爲16,當大於0.75的時候,擴展爲當前的2倍。有4中初始化map的方式。
              Map<String,String> map = new HashMap<String, String>();
              Map<String,String> map2 = new HashMap<String, String>(17);
              Map<String,String> map3 = new HashMap<String, String>(15, 2f);
              Map<String,String> map4 = new HashMap<String, String>(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算法吧,但是完全看不明白。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章