Java 集合架構之 Map,java集合架構map

來源:互聯網
上載者:User

Java 集合架構之 Map,java集合架構map

 

  Hashtable  Hashtable 的執行個體有兩個參數影響其效能:初始容量 和載入因子。容量 是雜湊表中桶 的數量,初始容量就是雜湊表建立時的容量。注意,雜湊表的狀態為 open:在發生“雜湊衝突”的情況下,單個桶會儲存多個條目,這些條目必須按順序搜尋。載入因子 是對雜湊表在其容量自動增加之前可以達到多滿的一個尺度。初始容量和載入因子這兩個參數只是對該實現的提示。關於何時以及是否調用 rehash 方法的具體細節則依賴於該實現。  通常,預設載入因子(.75)在時間和空間成本上尋求一種折衷。載入因子過高雖然減少了空間開銷,但同時也增加了尋找某個條目的時間(在大多數 Hashtable 操作中,包括 get 和 put 操作,都反映了這一點)。  初始容量主要控制空間消耗與執行 rehash 操作所需要的時間損耗之間的平衡。如果初始容量大於 Hashtable 所包含的最大條目數除以載入因子,則永遠 不會發生 rehash 操作。但是,將初始容量設定太高可能會浪費空間。  Hashtable 是同步的,現在一般情況下,都使用 HashMap ,而不使用陳舊的 Hashtbale,即便需要同步的時候,也是採用加同步的HashMap或者ConcurrentHashMap等實現。   Properties  該類繼承自 Hashtable,主要用於讀取 Java 的索引值格式的設定檔,比如 XML 檔案,properties檔案。  在該類的注釋中,建議使用 setProperties 方法插入索引值,而不建議使用 put 和 putAll,因為這兩個方法允許調用者插入索引值不是 String的項。   HashMap  基於雜湊表的 Map 介面的實現。此實現提供所有可選的映射操作,並允許使用 null 值和 null 鍵。(除了非同步和允許使用 null 之外,HashMap 類與 Hashtable 大致相同。)此類不保證映射的順序,特別是它不保證該順序恒久不變。   HashMap 的執行個體有兩個參數影響其效能:初始容量 和載入因子。容量 是雜湊表中桶的數量,初始容量只是雜湊表在建立時的容量。載入因子 是雜湊表在其容量自動增加之前可以達到多滿的一種尺度。當雜湊表中的條目數超出了載入因子與當前容量的乘積時,則要對該雜湊表進行 rehash 操作(即重建內部資料結構),從而雜湊表將具有大約兩倍的桶數。   通常,預設載入因子 (.75) 在時間和空間成本上尋求一種折衷。載入因子過高雖然減少了空間開銷,但同時也增加了查詢成本(在大多數 HashMap 類的操作中,包括 get 和 put 操作,都反映了這一點)。在設定初始容量時應該考慮到映射中所需的條目數及其載入因子,以便最大限度地減少 rehash 操作次數。如果初始容量大於最大條目數除以載入因子,則不會發生 rehash 操作。   該類不是安全執行緒的。   TreeMap  由圖可知,TreeMap類不僅實現了Map介面,還實現了Map介面的子介面java.util.SortedMap。  基於紅/黑樹狀結構(Red-Black tree)的 NavigableMap 實現。該映射根據其鍵的自然順序進行排序,或者根據建立映射時提供的 Comparator 進行排序,具體取決於使用的構造方法。   在添加、刪除和定位映射關係上,TreeMap類要比HashMap類的效能差一些,但是其中的映射關係具有一定的順序,如果不需要一個有序的集合,則建議使用HashMap類;如果需要進行有序的遍曆輸出,則建議使用TreeMap類,在這種情況下,可以先使用由HashMap類實現的Map集合,在需要順序輸出時,再利用現有的HashMap類的執行個體,建立一個具有完全相同映射關係的TreeMap類型的執行個體。   LinkedHashMap  該類是 Map 介面的雜湊表和鏈表實現。該類維護著一個運行於所有條目的雙重連結清單。此連結清單定義了迭代順序,該迭代順序通常就是將鍵插入到映射中的順序(插入順序),亦即它保留插入的順序,輸出的順序即為輸入時的插入順序。此實現提供所有可選的映射操作,並允許使用 null 值和 null 鍵。此類不保證映射的順序,特別是它不保證該順序恒久不變。  根據鏈表中元素的順序可以分為:按插入順序的鏈表,和按訪問順序(調用 get 方法)的鏈表。    預設是按插入順序排序,如果指定按訪問順序排序,那麼調用 get 方法後,會將這次訪問的元素移至鏈表尾部,不斷訪問可以形成按訪問順序排序的鏈表。  可以重寫 removeEldestEntry 方法返回 true 值指定插入元素時移除最老的元素。   注意,此實現不是同步的。   WeakHashMap  以弱鍵實現的基於雜湊表的 Map。在 WeakHashMap 中,當某個鍵不再正常使用時,將自動移除其條目。更精確地說,對於一個給定的鍵,其映射的存在並不阻止記憶體回收行程對該鍵的丟棄,這就使該鍵成為可終止的,被終止,然後被回收。丟棄某個鍵時,其條目從映射中有效地移除,因此,該類的行為與其他的 Map 實現有所不同。    ConcurrentHashMap  該類是安全執行緒的 Map 實現。與 Hashtable 相似,但 Hashtable 的 synchronized 是針對整張Hash表的,即每次鎖住整張表讓線程獨佔,ConcurrentHashMap 允許多個修改操作並發進行,其關鍵在於使用了鎖分離技術。它使用了多個鎖來控制對 hash 表的不同部分進行的修改。ConcurrentHashMap 內部使用段(Segment)來表示這些不同的部分,每個段其實就是一個小的hash table,它們有自己的鎖。只要多個修改操作發生在不同的段上,它們就可以並發進行。   Hashtable 對 get,put,remove 都使用了同步操作,它的同步層級是正對 Hashtable 來進行同步的,也就是說如果有線程正在遍曆集合,其他的線程就暫時不能使用該集合了,這樣無疑就很容易對效能和輸送量造成影響,從而形成單點。而ConcurrentHashMap 則不同,它只對 put,remove 操作使用了同步操作,get 操作並不影響。  該類不允許將 null 用作鍵或值。    ConcurrentSkipListMap  該類是可縮放的並發 ConcurrentNavigableMap 實現。映射可以根據鍵的自然順序進行排序,也可以根據建立映射時所提供的 Comparator 進行排序,具體取決於使用的構造方法。   此類實現 SkipLists 的並發變體,為 containsKey、get、put、remove 操作及其變體提供預期平均 log(n) 時間開銷。多個線程可以安全地並發執行插入、移除、更新和訪問操作。迭代器是弱一致 的,返回的元素將反映迭代器建立時或建立後某一時刻的映射狀態。它們不拋出 ConcurrentModificationException,可以並發處理其他動作。升序鍵排序視圖及其迭代器比降序鍵排序視圖及其迭代器更快。   相對於 ConcurrentHashMap,不僅 key 是有序的,而且 ConcurrentSkipListMap 支援更高的並發。ConcurrentSkipListMap 的存取時間是 log(N),和線程數幾乎無關。也就是說在資料量一定的情況下,並發的線程越多,ConcurrentSkipListMap 越能體現出他的優勢。  注意,調用ConcurrentSkipListMap 的 size 時,由於多個線程可以同時對映射表進行操作,所以映射表需要遍曆整個鏈表才能返回元素個數,這個操作是個O(log(n))的操作。  此類不允許使用 null 鍵或值。    轉載請註明:http://www.cnblogs.com/LeslieXia/p/5788816.html

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.