ConcurrentHashMap 類別
定義
重要
部分資訊涉及發行前產品,在發行之前可能會有大幅修改。 Microsoft 對此處提供的資訊,不做任何明確或隱含的瑕疵擔保。
一個支援全檢索並行及高預期並行以更新的雜湊表。
[Android.Runtime.Register("java/util/concurrent/ConcurrentHashMap", DoNotGenerateAcw=true)]
[Java.Interop.JavaTypeParameters(new System.String[] { "K", "V" })]
public class ConcurrentHashMap : Java.Util.AbstractMap, IDisposable, Java.Interop.IJavaPeerable, Java.IO.ISerializable, Java.Util.Concurrent.IConcurrentMap
[<Android.Runtime.Register("java/util/concurrent/ConcurrentHashMap", DoNotGenerateAcw=true)>]
[<Java.Interop.JavaTypeParameters(new System.String[] { "K", "V" })>]
type ConcurrentHashMap = class
inherit AbstractMap
interface ISerializable
interface IJavaObject
interface IDisposable
interface IJavaPeerable
interface IConcurrentMap
interface IMap
- 繼承
- 屬性
- 實作
備註
一個支援全檢索並行及高預期並行以更新的雜湊表。 此類別遵循與 java.util.Hashtable相同的函數規範,並包含對應 的 Hashtable每個方法版本。 然而,即使所有操作都是執行緒安全的,檢索操作 do <em>not</em> 會包含鎖定,且 <em>not</em> 支援以阻止所有存取的方式鎖定整個資料表。 此類別與依賴執行緒安全但不依賴同步細節的程式完全互 Hashtable 通。
檢索操作(包括 get)通常不會阻塞,因此可能與更新操作(包含 put 和 remove)重疊。 檢索反映最近完成的 EM>< 或 EM> 更新操作在啟動時的結果<。 (更正式地說,對於某一金鑰的更新操作, <具有 em>happens-before</em> 關係,且該金鑰的任意(非空)檢索都會報告更新值。) 對於像 和 clear這樣的聚合操作putAll,並行檢索可能只反映部分條目的插入或移除。 同樣地,迭代器、分割器與枚舉器回傳反映雜湊表在迭代器/枚舉建立時或自建立以來的狀態的元素。 他們不做</>>他們丟java.util.ConcurrentModificationException ConcurrentModificationException。< 然而,迭代器設計時只能同時由一個執行緒使用。 請記住,包含 size、 isEmpty和 containsValue 的聚合狀態方法的結果通常只有在地圖未同時在其他執行緒中更新時才有用。 否則,這些方法的結果反映的暫時狀態可能足以用於監控或估算,但不適合程式控制。
當碰撞過多(即金鑰雖有不同雜湊碼但模於表格大小的槽位)時,表格會動態展開,預期平均效果是每次映射維持約兩個箱(對應 0.75 的負載因子調整閾值)。 隨著映射的加入與移除,這個平均值可能有很大差異,但整體而言,這維持了雜湊表普遍接受的時間/空間權衡。 然而,調整此或任何其他雜湊表大小的操作可能相對緩慢。 如果可能,提供一個大小估計作為可選 initialCapacity 的建構子參數是個好主意。 另一個可選 loadFactor 的建構子參數,提供了進一步自訂初始表格容量的方法,透過指定計算在指定元素數量下分配空間的表格密度。 此外,為了與先前版本相容,建構者可選擇性地指定 expect concurrencyLevel 作為內部大小的額外提示。 請注意,使用多個鍵與完全相同的 hashCode() 金鑰,肯定會拖慢雜湊表的效能。 為了減輕影響,當鍵數為 Comparable時,此類別可能會使用鍵之間的比較順序來幫助打破平手。
Set可建立 ConcurrentHashMap 投影(使用 #newKeySet() 或 #newKeySet(int)),或檢視(#keySet(Object)當只有鍵感興趣,且映射值(可能暫時)未被使用或皆取相同映射值時。
ConcurrentHashMap 可作為可擴展的頻率圖(直方圖或多重集合形式),透過使用java.util.concurrent.atomic.LongAdder值並初始化。#computeIfAbsent computeIfAbsent 例如,要對 加入計數 ConcurrentHashMap<String,LongAdder> freqs,你可以使用 freqs.computeIfAbsent(key, k -> new LongAdder()).increment();
此類別及其視圖與迭代器實作了所有 em 可選</em> 介面方法。MapIterator><
像 Hashtable 但不同的 HashMap是,這個類別是否 <em>not</em> 允許 null 被用作鍵或值。
ConcurrentHashMaps 支援一組序列且平行的批量操作,與大多數 Stream 方法不同,設計上即使在其他執行緒同時更新的映射上,也能安全且合理地應用;例如,在計算共享登錄檔中值的快照摘要時。 有三種操作,每種都有四種形式,接受帶有鍵、值、條目及(鍵、值)對的函數作為參數和/或回傳值。 由於 ConcurrentHashMap 的元素沒有特定排序,且可能以不同順序在不同平行執行中處理,所提供函數的正確性不應依賴於任何排序,或任何在計算過程中可能暫時改變的物件或值;除了 forEach 行動外,理想上應該沒有副作用。 物件上的 Map.Entry 批量操作不支援方法 setValue。
<ul><li>forEach:對每個元素執行特定動作。 變體形式會在執行動作前對每個元素施加特定的轉換。
<li>搜尋:回傳對每個元素應用給定函數的第一個非空結果;找到結果後跳過後續搜尋。
<李>還約:累積每個元素。 所提供的約化函數無法依賴排序(更正式地說,它應該同時具有結合與交換性)。 有五種變體:
<UL>
<李>:簡約。 (此方法對(key, value)函式參數沒有相應的回傳型別。)
<li>映射約簡,將給定函數對每個元素的結果累積。
<li>以給定基值為標量的倍數、長數和整數還原。
</ul></ul>
這些批量操作接受一個 parallelismThreshold 參數。 若估計當前映射大小小於給定閾值,方法將依序進行。 使用值 Long.MAX_VALUE 會抑制所有平行性。 使用值 時 1 ,透過將 分割成足夠多的子任務,以充分利用 ForkJoinPool#commonPool() 所有平行運算所用的 ,從而達到最大平行性。 通常,你會先選擇這些極端值之一,然後用中間值來衡量效能,這些值在開銷與吞吐量之間做權衡。
大量運算的並行性質源自 ConcurrentHashMap:任何來自 get(key) 相關存取方法的非空結果,皆與相關的插入或更新存在先發生關係。 任何體積運算的結果反映這些逐元素關係的組成(但不一定是相對於整個映射的原子性質,除非已知它是靜止的)。 反之,因為映射中的鍵和值從不為空,空值作為當前缺乏結果的可靠原子指標。 為了維持此特性,null 作為所有非純量約化操作的隱含基礎。 對於雙重、長和整數版本,基底應是與任意其他值組合時會回傳該值的基底(更正式地說,應是約簡的單位元素)。 大多數常見的約化具有以下特性;例如,計算基底為0的求和或基底為MAX_VALUE的最小值。
作為參數提供的搜尋與轉換函數同樣應回傳 null 以表示沒有結果(此時不使用)。 在映射約簡的情況下,這也使變換能作為濾波器,若元素不需組合,則回傳空(或在原始專門化情況下返回恆等基底)。 你可以在搜尋或簡化操作中使用之前,先自己組合複合轉換和篩選,並依照「null 表示現在什麼都沒有」規則來建立。
接受和/或回傳 Entry 參數的方法會維持鍵值關聯。 例如,它們在尋找最大值的鍵時可能非常有用。 請注意,「純」Entry 參數可用 new AbstractMap.SimpleEntry(k,v)提供。
大量運算可能突然完成,導致在執行所提供函式時遇到的例外。 處理此類例外時,請記得其他同時執行的函式也可能拋出異常,或若未發生第一個例外,也會拋出異常。
平行模式相較於順序形式會有加速功能,但並非保證。 若平行運算的成本高於計算本身,則涉及簡短函數的平行運算執行速度可能比序列形式慢。 同樣地,如果所有處理器都忙於執行無關任務,平行化可能不會帶來太多實際的平行性。
所有任務方法的所有參數必須是非空。
此類別是 Java 集合框架的成員。
已在1.5中新增。
的 java.util.concurrent.ConcurrentHashMapJava 檔。
此頁面的部分是根據 Android 開放原始碼專案所建立和共用的工作進行修改,並根據 Creative Commons 2.5 屬性授權中所述的詞彙使用。
建構函式
| 名稱 | Description |
|---|---|
| ConcurrentHashMap() |
建立一個新的空白映射,預設初始資料表大小為 16。 |
| ConcurrentHashMap(IDictionary) |
建立一張與所給地圖相同映射的新地圖。 |
| ConcurrentHashMap(Int32, Single, Int32) |
建立一個新的空映射,初始資料表大小基於給定的元素數( |
| ConcurrentHashMap(Int32, Single) |
建立一個新的、空白的映射,初始資料表大小依據給定的元素數( |
| ConcurrentHashMap(Int32) |
建立一個新的空映射,初始資料表大小可容納指定元素數量,無需動態調整大小。 |
| ConcurrentHashMap(IntPtr, JniHandleOwnership) |
用於建立 JNI 物件受管理表示的建構器;由執行時呼叫。 |
屬性
| 名稱 | Description |
|---|---|
| Class |
傳回這個 |
| Handle |
基礎Android實例的句柄。 (繼承來源 Object) |
| IsEmpty |
待補充 (繼承來源 AbstractMap) |
| JniIdentityHashCode |
一個支援全檢索並行及高預期並行以更新的雜湊表。 (繼承來源 Object) |
| JniPeerMembers |
一個支援全檢索並行及高預期並行以更新的雜湊表。 |
| PeerReference |
一個支援全檢索並行及高預期並行以更新的雜湊表。 (繼承來源 Object) |
| ThresholdClass |
此 API 支援適用於 Android 的 Mono 基礎結構,並不適合直接從您的程式代碼使用。 |
| ThresholdType |
此 API 支援適用於 Android 的 Mono 基礎結構,並不適合直接從您的程式代碼使用。 |
方法
明確介面實作
| 名稱 | Description |
|---|---|
| IJavaPeerable.Disposed() |
一個支援全檢索並行及高預期並行以更新的雜湊表。 (繼承來源 Object) |
| IJavaPeerable.DisposeUnlessReferenced() |
一個支援全檢索並行及高預期並行以更新的雜湊表。 (繼承來源 Object) |
| IJavaPeerable.Finalized() |
一個支援全檢索並行及高預期並行以更新的雜湊表。 (繼承來源 Object) |
| IJavaPeerable.JniManagedPeerState |
一個支援全檢索並行及高預期並行以更新的雜湊表。 (繼承來源 Object) |
| IJavaPeerable.SetJniIdentityHashCode(Int32) |
一個支援全檢索並行及高預期並行以更新的雜湊表。 (繼承來源 Object) |
| IJavaPeerable.SetJniManagedPeerState(JniManagedPeerStates) |
一個支援全檢索並行及高預期並行以更新的雜湊表。 (繼承來源 Object) |
| IJavaPeerable.SetPeerReference(JniObjectReference) |
一個支援全檢索並行及高預期並行以更新的雜湊表。 (繼承來源 Object) |
擴充方法
| 名稱 | Description |
|---|---|
| GetJniTypeName(IJavaPeerable) |
取得實例 |
| JavaAs<TResult>(IJavaPeerable) |
試著強制 |
| JavaCast<TResult>(IJavaObject) |
執行 Android 執行時間檢查的類型轉換。 |
| JavaCast<TResult>(IJavaObject) |
一個支援全檢索並行及高預期並行以更新的雜湊表。 |
| TryJavaCast<TResult>(IJavaPeerable, TResult) |
試著強制 |