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