1. 程式人生 > >HashMap、Hashtable、LinkedHashMap、TreeMap、ConcurrentHashMap之間的區別-yellowcong

HashMap、Hashtable、LinkedHashMap、TreeMap、ConcurrentHashMap之間的區別-yellowcong

這些Map集合在面試中,經常會被問道和考到,所以總結一下,HashMap和Hashtable的區別在於1、多執行緒;2、主鍵是否為空;3、繼承的父類

通過Collections.synchronizedMap()的方法,將Map集合變成執行緒安全的。

1 HashMap和Hashtable的區別

這個問題,可能和String與StringBuffer,StringBuilder一樣經常被人問道,這個問題的標準答案,基本上是三點,

No HashMap HashTable
1 繼承的是AbstractMap類 繼承的的是Dicionary類
2 非執行緒安全 執行緒安全
3 允許存在null的key 不允許存在空key

1.1 繼承的父類

HashMap繼承的是AbstractMap類
這裡寫圖片描述

Hashtable繼承的的是Dicionary類
這裡寫圖片描述

1.2 執行緒安全

HashMap是非執行緒安全的(效率比較的高)
Hashtable是執行緒安全的(效率相對比較低)

1.3 Key值是否可以存在null

HashMap可以允許為空
這裡寫圖片描述

大家可以發現如果是空的key ,先判斷一下HashMap的第一個Bucket,也就是第一個Entry<K,V>(HashMap和Hashtable中,都維護的是一個Entry<K,V>[]

連結串列陣列)中是否存在,如果存在就修改值,如果不存在,就新增這個值(新增的位置是第一個 Bucket裡面)。
這裡寫圖片描述

Hashtable是不允許存在空的key
這裡寫圖片描述

2、LinkedHashMap

基於連結串列的資料結構
LinkedHashMap繼承了HashMap,實現了Map介面

這裡寫圖片描述

3、TreeMap

基於Tree 資料結構的集合

4、ConcurrentHashMap

這個是無鎖多執行緒程式設計所提供的一個集合組合,是基於cpu層面的CAS原子操作,用到這個操作,只需要在取佇列元素和新增佇列元素的時候利用CAS原子操作,就可以保證多個執行緒對佇列元素的有序存取