Java 集合框架之 Map

来源:http://www.cnblogs.com/LeslieXia/archive/2016/08/19/5788816.html
-Advertisement-
Play Games

Hashtable Hashtable 的實例有兩個參數影響其性能:初始容量 和載入因數。容量 是哈希表中桶 的數量,初始容量就是哈希表創建時的容量。註意,哈希表的狀態為 open:在發生“哈希衝突”的情況下,單個桶會存儲多個條目,這些條目必須按順序搜索。載入因數 是對哈希表在其容量自動增加之前可以 ...


 

  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
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • Python的誕生 Python的創始人吉多·範羅蘇姆(Guido van Rossum),在1989年12月的聖誕節期間,為了打發時間,決定開發一種新的腳本解釋程式,作為ABC語言的繼承。 現在,python以其優美,清晰,簡單的特性在全世界廣泛流行,成為最主流的編程語言之一。 截止至2016年7 ...
  • 先來看一段簡單的代碼: 輸出結果為: 由此可見,定義:在Eat(冒號函數)內部有一個參數self,在Sleep(點函數)內部沒有參數self;調用:用冒號(:)調用函數時,會預設傳一個值(調用者自身)作為第一個參數;用點(.)調用函數時,則沒有; -- 如果要使結果一致,則: 輸出結果: -- 我們 ...
  • DBCP連接池簡介 1、資料庫連接基礎 資料庫連接池基礎主要包括以下三個方面的內容:資料庫連接池的基本概念、資料庫連接池的工作原理、Java開源的連接池。下麵將從這三個方面一一介紹: (1)資料庫連接池的基本概念 資料庫連接是一種關鍵的、有限的、昂貴的資源,這一點在多用戶的Web應用程式中體現得尤為 ...
  • 這篇博客總結了半天,希望自己以後返回來看的時候理解更深刻,也希望可以起到幫助初學者的作用. 轉載請註明 出自 : "luogg的博客園" , 抽象 一種專門用來做父類,被繼承的. (模板) 格式: abstract class 抽象類名{ 屬性; 普通方法; 訪問許可權 abstract 返回值類型 ...
  • 在 Python 的Lib目錄里有一個:this.Py (或者在互動式解釋器中輸入import this) 它其實是隱藏的一首詩 ...
  • 題目是說給出一個數字,然後以1到這個數為序號當做二叉樹的結點,問總共有幾種組成二叉樹的方式。這個題就是用卡特蘭數算出個數,然後因為有編號,不同的編號對應不同的方式,所以結果是卡特蘭數乘這個數的階乘種方案。因為數字比較大,所以要用高精度的方法也就是用字元數組來做,我分別寫了三個函數,一個算加法,一個算 ...
  • 傳送門:hdu 5862 Counting Intersections 題意:對於平行於坐標軸的n條線段,求兩兩相交的線段對有多少個,包括十,T型 官方題解:由於數據限制,只有豎向與橫向的線段才會產生交點,所以先對橫向線段按x端點排序,每次加入一個線段,將其對應的y坐標位置+1,當出現一個豎向線段時 ...
  • django提供了一套用戶驗證系統,但是要使用這個系統,必須要使用django內置的用戶模型:django.contrib.auth.models.User,這個模型中預先定義了一些欄位,其中只有username和password是必須的。 username 用戶名,該欄位是必須的,長度限製版本之間 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...