HashMap和TreeMap區別
- HashMap是通過hash值存儲,無序的,增刪查找速度快,遍歷時,取得數據的順序是完全隨機的;
TreeMap中所有的元素都是通過key值進行排序,速度慢 - HashMap和TreeMap都不是線程安全的;
- HashMap繼承AbstractMap類;覆蓋了hashcode() 和equals() 方法
TreeMap繼承SortedMap類 - HashMap:基於hash表實現的;hash值重複的通過鏈表實現;使用HashMap要求添加的鍵類明確定義或重寫了hashcode() 和equals()方法;爲了優化HashMap的空間使用,可以調優初始容量和負載因子;
TreeMap:基於紅黑樹實現的;TreeMap就沒有調優選項,因爲紅黑樹總是處於平衡的狀態; - HashMap:適用於Map插入,刪除,定位元素
TreeMap:適用於按自然順序或自定義順序遍歷鍵(key);
HashMap和HashTable區別
- Hashtable繼承自Dictionary類,而HashMap繼承自AbstractMap類。但二者都實現了Map接口。
- HashTable是線程安全的,HashMap不是,但是可以使用ConcurrentHashMap或者Collections.synchronizedMap
- HashMap中的key和value可以爲null,HashTable不可以
- 遍歷方式Hashtable、HashMap都使用了 Iterator。而由於歷史原因,Hashtable還使用了Enumeration的方式 。
- 哈希值的使用不同,HashTable直接使用對象的hashCode。而HashMap重新計算hash值。
- 擴容方式不同。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的遍歷速度和他的容量有關。