HashMap、TreeMap和HashTable的區別

HashMap和TreeMap區別

  1. HashMap是通過hash值存儲,無序的,增刪查找速度快,遍歷時,取得數據的順序是完全隨機的;
    TreeMap中所有的元素都是通過key值進行排序,速度慢
  2. HashMap和TreeMap都不是線程安全的;
  3. HashMap繼承AbstractMap類;覆蓋了hashcode() 和equals() 方法
    TreeMap繼承SortedMap類
  4. HashMap:基於hash表實現的;hash值重複的通過鏈表實現;使用HashMap要求添加的鍵類明確定義或重寫了hashcode() 和equals()方法;爲了優化HashMap的空間使用,可以調優初始容量和負載因子;
    TreeMap:基於紅黑樹實現的;TreeMap就沒有調優選項,因爲紅黑樹總是處於平衡的狀態;
  5. HashMap:適用於Map插入,刪除,定位元素
    TreeMap:適用於按自然順序或自定義順序遍歷鍵(key);

HashMap和HashTable區別

  1. Hashtable繼承自Dictionary類,而HashMap繼承自AbstractMap類。但二者都實現了Map接口。
  2. HashTable是線程安全的,HashMap不是,但是可以使用ConcurrentHashMap或者Collections.synchronizedMap
  3. HashMap中的key和value可以爲null,HashTable不可以
  4. 遍歷方式Hashtable、HashMap都使用了 Iterator。而由於歷史原因,Hashtable還使用了Enumeration的方式 。
  5. 哈希值的使用不同,HashTable直接使用對象的hashCode。而HashMap重新計算hash值。
  6. 擴容方式不同。HashTable在不指定容量的情況下的默認容量爲11,而HashMap爲16,Hashtable不要求底層數組的容量一定要爲2的整數次冪,而HashMap則要求一定爲2的整數次冪。
    Hashtable擴容時,將容量變爲原來的2倍加1,而HashMap擴容時,將容量變爲原來的2倍。
    Hashtable和HashMap它們兩個內部實現方式的數組的初始大小和擴容的方式。HashTable中hash數組默認大小是11,增加的方式是 old*2+1。

HashTable

HashTable與HashMap類似,它不允許記錄的鍵或者值爲空;
支持線程的同步(線程安全),即任一時刻只有一個線程能寫HashTable,因此導致了Hashtable在寫入時會比較慢。

LinkedHashMap

LinkedHashMap是HashMap的一個子類;
LinkedHashMap保存了記錄的插入順序,在用Iterator遍歷LinkedHashMap時,先得到的記錄肯定是先插入的;
在遍歷的時候會比HashMap慢,不過有種情況例外,當HashMap容量很大,實際數據較少時,遍歷起來可能會比LinkedHashMap慢,因爲LinkedHashMap的遍歷速度只和實際數據有關,和容量無關,而HashMap的遍歷速度和他的容量有關。

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