Hashtable、HashMap、TreeMap心得
三者均實現了Map介面,儲存的內容是基於key-value的鍵值對對映,一個對映不能有重複的鍵,一個鍵最多隻能對映一個值。
(1) 元素特性 HashTable中的key、value都不能為null;HashMap中的key、value可以為null,很顯然只能有一個key為null的鍵值對,但是允許有多個值為null的鍵值對;TreeMap中當未實現 Comparator 介面時,key 不可以為null;當實現 Comparator 介面時,若未對null情況進行判斷,則key不可以為null,反之亦然。
(2)順序特性 HashTable、HashMap具有無序特性。TreeMap是利用紅黑樹來實現的(樹中的每個節點的值,都會大於或等於它的左子樹種的所有節點的值,並且小於或等於它的右子樹中的所有節點的 值),實現了SortMap介面,能夠對儲存的記錄根據鍵進行排序。所以一般需要排序的情況下是選擇TreeMap來進行,預設為升序排序方式(深度優先搜尋),可自定義實現Comparator介面 實現排序方式。
(3)初始化與增長方式 初始化時:HashTable在不指定容量的情況下的預設容量為11,且不要求底層陣列的容量一定要為2的整數次冪;HashMap預設容量為16,且要求容量一定為2的整數次冪。 擴容時:Hashtable將容量變為原來的2倍加1;HashMap擴容將容量變為原來的2倍。
(4)執行緒安全性 HashTable其方法函式都是同步的(採用synchronized修飾),不會出現兩個執行緒同時對資料進行操作的情況,因此保證了執行緒安全性。也正因為如此,在多執行緒執行環境下效率表現非常低 下。因為當一個執行緒訪問HashTable的同步方法時,其他執行緒也訪問同步方法就會進入阻塞狀態。比如當一個執行緒在新增資料時候,另外一個執行緒即使執行獲取其他資料的操作也必須被阻塞, 大大降低了程式的執行效率,在新版本中已被廢棄,不推薦使用。 HashMap不支援執行緒的同步,即任一時刻可以有多個執行緒同時寫HashMap;可能會導致資料的不一致。如果需要同步(1)可以用 Collections的synchronizedMap方法;(2)使 用ConcurrentHashMap類,相較於HashTable鎖住的是物件整體, ConcurrentHashMap基於lock實現鎖分段技術。首先將Map存放的資料分成一段一段的儲存方式,然後給每一段資料分配 一把鎖,當一個執行緒佔用鎖訪問其中一個段的資料時,其他段的資料也能被其他執行緒訪問。ConcurrentHashMap不僅保證了多執行緒執行環境下的資料訪問安全性,而且效能上有長足的提升。
(5)一段話HashMap HashMap基於雜湊思想,實現對資料的讀寫。當我們將鍵值對傳遞給put()方法時,它呼叫鍵物件的hashCode()方法來計算hashcode,讓後找到bucket位置來儲存值物件。當獲取物件時, 通過鍵物件的equals()方法找到正確的鍵值對,然後返回值物件。HashMap使用連結串列來解決碰撞問題,當發生碰撞了,物件將會儲存在連結串列的下一個節點中。 HashMap在每個連結串列節點中儲存 鍵值對物件。當兩個不同的鍵物件的hashcode相同時,它們會儲存在同一個bucket位置的連結串列中,可通過鍵物件的equals()方法用來找到鍵值對。如果連結串列大小超過閾值 (TREEIFY_THRESHOLD, 8),連結串列就會被改造為樹形結構。