java 集合之HashMap、Hashtable、LinkedHashMap、TreeMap


HashMap

實現了Map接口,線程不安全。

實現原理:

HashMap由數組+鏈表組成,數組是HashMap的主體,鏈表則是主要為了解決哈希沖突而存在的。

如果通過hash定位到數組位置沒有鏈表,則查找、添加速度很快。否則,就要解決hash沖突,操作鏈表。遍歷鏈表時,通過key對象的equals方法逐一比對。

構造hashmap的時候有兩個參數,initialCapacity初始容量(默認16)、loadFactor裝載因子(默認0.75)。

向容器中添加元素的時候,如果元素個數達到閾值(元素個數=數組長度*loadFactor),就要自動擴容。

使用一個新的數組代替已有的數組,每次擴容為先前的兩倍。

經過 rehash 之后,元素的位置要么在原位置,要么在原位置再移動2次冪的位置。

hash函數

調用對象key自帶的hashCode(),hashCode()返回intl類型值。

右位移16位,正好是32bit的一半,自己的高半區和低半區做異或,就是為了混合原始哈希碼的高位和低位,以此來加大低位的隨機性。而且混合后的低位摻雜了高位的部分特征,這樣高位的信息也被變相保留下來。

散列值不能直接使用,還要對數組長度取模(異或實現散列值映射到數組,^代替%,效果一樣),得到余數才能訪問數組下標。如下:

 https://www.hollischuang.com/archives/2091

Hashtable

Hashtable對外提供的public函數幾乎都是同步的(synchronized關鍵字修飾),線程安全。

key和value都不能為null。

HashTable的數據結構和HashMap一樣,采用Entry數組 + 鏈表的方法實現。

HashTabale初始的容量為11,負載因子為0.75,這點和HashMap不同,HashMap初始化時容量大小總是2的冪次方,即使給定一個不是2的冪次方容量的值,也會自動初始化為最接近其2的冪次方的容量。

哈希值計算方式是:int hash = key.hashCode()

數組索引計算方式是:int index = (hash & 0x7FFFFFFF) % tab.length; // 0x7FFFFFFF 即 Integer.MAX_VALUE(01111111 11111111 11111111 11111111)確保index為正數。

讓HashMap同步:Map m =Collections.synchronizedMap(hashMao);

HashMap的迭代器(Iterator)是fail-fast迭代器,Hashtable的iterator遍歷方式支持fast-fail,用Enumeration不支持fast-fail。

TreeMap

https://edu.csdn.net/course/play/5386/98487

TreeMap的數據結構是紅黑樹。

HashMap和Hashtable不保證數據有序,LinkedHashMap保證數據可以保持插入順序,而TreeMap可以按key的大小順序排序。

LinkedHashMap

LinkedHashMap保證數據可以保持插入順序

 

 

 LinkedHashMap在HashMap的基礎上多了一個雙向鏈表來維持順序。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM