常見的map類有: HashMap, ConcurrentHashMap (Jdk1.8) , LinkedHashMap, TreeMap, Hashtable。java
- 2.HashTable存儲方式都是鏈表+數組,數組裏面放的是當前hash的第一個數據,鏈表裏面放的是hash衝突的數據 ,ConcurrentHashMap是數組+鏈表+紅黑樹.
LinkedHashMap 是基於元素進入集合的順序或者被訪問的前後順序排序,TreeMap 則是基於元素的固有順序 (由 Comparator 或者 Comparable 肯定)。 6. HashMap和Hashtable算法
public class HashMap<K,V> extends AbstractMap<K,V> implements Map<K,V>, Cloneable, Serializable { ... } public class Hashtable<K,V> extends Dictionary<K,V> implements Map<K,V>, Cloneable, java.io.Serializable { }
- HashMap是繼承自AbstractMap類,而HashTable是繼承自Dictionary類。不過它們都實現了同時實現了map、Cloneable(可複製)、Serializable(可序列化)這三個接口. 而Dictionary類是一個廢棄的類。可想而知,父類被廢棄,子類天然也沒人用啦~~
- Hashtable比HashMap多提供了elments() 和contains() 兩個方法。 elments() 方法繼承自Hashtable的父類Dictionnary。elements() 方法用於返回此Hashtable中的value的枚舉。 contains()方法判斷該Hashtable是否包含傳入的value。它的做用與containsValue()一致。事實上,containsValue() 就只是調用了一下contains() 方法。
- Hashtable既不支持Null key也不支持Null value。HashMap只支持一個null key ,能夠有一個或多個鍵的值爲null.
- Hashtable是線程安全的,它的每一個方法中都加入了Synchronize方法。在多線程併發的環境下,能夠直接使用Hashtable,不須要本身爲它的方法實現同步
- Hashtable默認的初始大小爲11,以後每次擴充,容量變爲原來的2n+1。HashMap默認的初始化大小爲16。以後每次擴充,容量變爲原來的2倍。建立時,若是給定了容量初始值,那麼Hashtable會直接使用你給定的大小,而HashMap會將其擴充爲2的冪次方大小。也就是說Hashtable會盡可能使用素數、奇數。而HashMap則老是使用2的冪做爲哈希表的大小.
- 計算hash值的方法不一樣 : Hashtable直接使用對象的hashCode. Hashtable在計算元素的位置時須要進行一次除法運算,而除法運算是比較耗時的。HashMap爲了提升計算效率,將哈希表的大小固定爲了2的冪,這樣在取模預算時,不須要作除法,只須要作位運算。位運算比除法的效率要高不少。HashMap的效率雖然提升了,可是hash衝突卻也增長了。由於它得出的hash值的低位相同的機率比較高.爲了解決這個問題,HashMap從新根據hashcode計算hash值後,又對hash值作了一些運算來打散數據。使得取得的位置更加分散,從而減小了hash衝突。固然了,爲了高效,HashMap只作了一些簡單的位處理。從而不至於把使用2的冪次方帶來的效率提高給抵消掉。