Java面試基礎篇——第六篇:常見Map類的區別

常見的map類有: HashMap, ConcurrentHashMap (Jdk1.8) , LinkedHashMap, TreeMap, Hashtable。java

  1. 其中咱們最經常使用的莫過於HashMap, 和併發狀況下使用的ConcurrentHashMap了,它們的主要區別就在於HashMap是非線程安全的,而ConcurrentHashMap是線程安全的。
  2. 併發狀況下可使用HashTable和ConcurrentHashMap ,它們的區別在於:  >* ConcurrentHashMap的hash計算公式:(key.hascode()^ (key.hascode()>>> 16)) & 0x7FFFFFFF, 而 HashTable的hash計算公式:key.hascode() & 0x7FFFFFFF
  • 2.HashTable存儲方式都是鏈表+數組,數組裏面放的是當前hash的第一個數據,鏈表裏面放的是hash衝突的數據 ,ConcurrentHashMap是數組+鏈表+紅黑樹.
  1. 線程安全的保證: HashTable是在每個操做方法上都加上synchronized關鍵字來達到線程安全的目的,而ConcurrentHashMap則是經過CAS算法(CompareAndSwap)來保證線程安全。
  2. ConcurrentHashMap 放棄了分段鎖,而使用了Nodo鎖,減低了鎖的粒度,提升了性能,並使用CAS操做來保證Node操做的原子性。可是ConcurrentHashMap的一些操做使用了synchronized鎖,而不是ReentrantLock,雖說jdk8的synchronized的性能進行了優化,可是我以爲仍是使用ReentrantLock鎖能更多的提升性能。
  3. 順序的 Map 實現類:LinkedHashMap,TreeMap

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的冪次方帶來的效率提高給抵消掉。
相關文章
相關標籤/搜索