HashMap主要用來存放鍵值對,它基於哈希表的Map接口實現,是常用的Java集合之一,數據是無序的
jdk1.8在解決哈希衝突時有了較大的變化,當鏈表長度大於閾值(默認爲8)時,將鏈表轉化爲紅黑樹,以減少搜索時間。
HashMap
JDK1.8 之前 HashMap 由 數組+鏈表 組成的,數組是 HashMap 的主體,鏈表則是主要爲了解決哈希衝突而存在的.
HashMap的時間複雜度O(1),但是如果衝突較多,鏈表的時間複雜度是O(n),所以在JDK1.8 以後,當鏈表長度大於閾值(默認爲 8)時,將鏈表轉化爲紅黑樹,以減少搜索時間,紅黑樹的時間複雜度是O(log n)。 所以查詢一個HashMap數據的時間爲 O(1) + O(n)或O(1) + O(log n) 平均爲O(1)
總結:HashMap根據鍵的HashCode值存儲數據,根據鍵可以直接獲取它的值,具有很快的訪問速度,插入、刪除和定位元素,HashMap是最好的選擇。
TreeMap
TreeMap是基於紅黑樹實現的一個保證有序性的Map 基於紅黑樹,所以TreeMap的時間複雜度是O(log n),如果需要有排序的數據,直接存放進TreeMap中就行,TreeMap自己會給排序,不需要再寫排序代碼。
總結:TreeMap取出來的是排序後的鍵值對。插入、刪除需要維護平衡會犧牲一些效率。但如果要按自然順序或自定義順序遍歷,那麼TreeMap會更好。
HashMap通過hashcode對其內容進行快速查找,而 TreeMap中所有的元素都保持着某種固定的順序,如果你需要得到一個有序的結果你就應該使用TreeMap。HashMap通常比TreeMap效率要高一些,一個是哈希表,一個是二叉樹,建議多使用HashMap,在需要排序的Map時候才用TreeMap。HashMap的查詢速度比TreeMap要快