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
版本。 不過,即使所有作業都是安全線程,擷取作業仍不需要 <<>> 鎖定,而且 < em > 不會 < /em > 任何鎖定整個資料表的支援,以防止所有存取。 這個類別與 Hashtable
依賴其執行緒安全,但不在其同步處理詳細資料的程式中完全互通。
擷取作業 (包括 get
) 通常不會封鎖,因此可能會與更新作業重迭, (包括 put
和 remove
) 。 擷取會反映最近在擷取時保留的 em 已完成/em > 更新作業的結果 < 。 <> (更正式地,給定金鑰的更新作業會與報告更新值的任何 (非 null) 擷取關聯性,而該索引鍵的更新作業會與 < em > 發生之前 < /em > 關聯。) 針對 和 clear
等 putAll
匯總作業,並行擷取可能會反映只插入或移除某些專案。 同樣地,Iterators、Spliterators 和 Enumerations 會傳回元素,反映某個時間點或建立反覆運算器/列舉之後雜湊表的狀態。 它們不會 << / > em > 擲回 java.util.ConcurrentModificationException ConcurrentModificationException
。 不過,反覆運算器是設計成一次只能由一個執行緒使用。 請記住,匯總狀態方法的結果,包括 size
、 isEmpty
和 containsValue
通常只有在對應未在其他執行緒中進行並行更新時才有用。 否則,這些方法的結果會反映可能足以監視或估計目的的暫時性狀態,但不適用於程式控制。
當發生太多衝突 (時,資料表會動態展開,亦即具有相異雜湊碼但落在資料表大小) 相同的位置模數,且每個對應 (大約維護兩個間隔的預期平均效果, (對應至 0.75 的負載因數臨界值來調整) 。 當新增和移除對應時,此平均值可能會有許多差異,但整體而言,這會維護雜湊表的常見接受時間/空間取捨。 不過,調整這個或任何其他雜湊表類型的大小可能是相對緩慢的作業。 可能的話,最好提供大小估計為選擇性 initialCapacity
建構函式引數。 額外的選擇性 loadFactor
建構函式引數提供進一步的自訂初始資料表容量的方法,方法是指定要用來計算要配置給指定專案數目的空間量。 此外,為了與舊版的這個類別相容,建構函式可以選擇性地指定預期 concurrencyLevel
做為內部調整大小的額外提示。 請注意,使用許多索引鍵與完全相同 hashCode()
,是讓任何雜湊表效能變慢的一個確定方式。 為了改善影響,當索引鍵為 Comparable
時,這個類別可能會使用索引鍵之間的比較順序來協助中斷系結。
Set
當只有索引鍵感興趣時,可以使用 或 #newKeySet(int)
) 建立 ConcurrentHashMap 的投影 (#newKeySet()
,或使用 檢視 #keySet(Object)
(,而對應的 (值可能是暫時性地) 未使用或全部採用相同的對應值。
ConcurrentHashMap 可用來做為可調整的頻率對應, (一種形式的長條圖或多集) ,方法是使用 java.util.concurrent.atomic.LongAdder
值並透過 #computeIfAbsent computeIfAbsent
初始化。 例如,若要將計數新增至 ConcurrentHashMap<String,LongAdder> freqs
,您可以使用 freqs.computeIfAbsent(key, k -> new LongAdder()).increment();
這個類別及其檢視和反覆運算器會實作 和 Iterator
介面的所有 < em > 選擇性 < /em > 方法 Map
。
和 不同 Hashtable
HashMap
,這個類別不會 < em > not < /em > 允許 null
當做索引鍵或值使用。
ConcurrentHashMaps 支援一組循序和平行大量作業,與大部分 Stream
方法不同的是設計為安全且通常很合理地套用,即使其他執行緒同時更新的對應也一樣;例如,在計算共用登錄中值的快照集摘要時。 有三種作業類型,各有四種形式,接受具有索引鍵、值、專案和 (索引鍵、值) 組作為引數和/或傳回值的函式。 由於 ConcurrentHashMap 的元素並未以任何特定方式排序,而且可能會以不同的平行執行連續處理,所以所提供的函式正確性不應取決於任何排序,或可能暫時變更計算時可能暫時變更的任何其他物件或值;除了 forEach 動作之外,最好是無副作用。 物件上的 Map.Entry
大量作業不支援 方法 setValue
。
<ul >< li > forEach:在每個元素上執行指定的動作。 變數表單會在執行動作之前,在每個元素上套用指定的轉換。
<li > search:傳回在每個元素上套用指定函式的第一個可用非 Null 結果;在找到結果時略過進一步的搜尋。
<li > reduce:累積每個元素。 提供的縮減函式無法依賴更正式的排序 (,它應該是關聯和交換) 。 有五個變體:
<ul>
<li > Plain reductions. (沒有這個方法的形式適用于 (索引鍵、值) 函數引數,因為沒有對應的傳回類型。)
<li > 對應縮減會累積套用至每個元素之指定函式的結果。
<li > 使用指定的基礎值縮減為純量雙精度浮點數、長數和 int。
</ul >< /ul>
這些大量作業接受自 parallelismThreshold
變數。 如果目前的地圖大小估計小於指定的臨界值,則方法會循序繼續進行。 使用 的值 Long.MAX_VALUE
會隱藏所有平行處理原則。 使用最大平行處理原則的值 1
,方法是將資料分割成足夠的子工作,以充分利用 ForkJoinPool#commonPool()
用於所有平行計算的 。 一般而言,您一開始會選擇其中一個極端值,然後測量使用之間值來取捨額外負荷與輸送量的效能。
大量作業的並行屬性會遵循 ConcurrentHashMap 的並行屬性:從 get(key)
和相關存取方法傳回的任何非 Null 結果都會與相關聯的插入或更新發生之前發生關聯性。 任何大量作業的結果都會反映這些個別元素關聯 (的組成,但不一定是與整個對應相關的不可部分完成的,除非已知是靜止) 。 相反地,因為對應中的索引鍵和值永遠不會是 Null,所以 null 可作為目前缺少任何結果的可靠不可部分完成指標。 為了維護這個屬性,null 可作為所有非純量縮減作業的隱含基礎。 針對 double、long 和 int 版本,基礎應該是結合任何其他值時,傳回其他值 (更正式,它應該是縮減) 的識別元素。 最常見的縮減具有這些屬性;例如,以基礎 0 計算總和,或以基礎MAX_VALUE計算最小值。
以引數的形式提供的搜尋和轉換函式應該會傳回 null,以指出沒有任何結果 (在此情況下不會使用) 。 在對應縮減的情況下,這也可讓轉換做為篩選,傳回 null (,或者,在基本特製化的情況下,如果不應該結合元素,則識別基礎會) 。 您可以在搜尋或縮減作業中使用它們之前,先自行撰寫「null 表示現在沒有」規則來建立複合轉換和篩選。
接受和/或傳回 Entry 引數的方法會維持索引鍵/值關聯。 例如,尋找最大值的索引鍵時,它們可能很有用。 請注意,可以使用 new AbstractMap.SimpleEntry(k,v)
提供 「plain」 Entry 引數。
大量作業可能會突然完成,擲回在所提供函式應用程式中遇到的例外狀況。 當處理其他並存執行函式可能也擲回例外狀況的這類例外狀況時,或如果未發生第一個例外狀況,則請記住。
相較于循序形式,平行的加速是常見的,但不保證。 在小型對應上涉及簡短函式的平行作業,如果基礎工作平行化計算的成本高於計算本身,則執行速度可能會比循序形式慢。 同樣地,如果所有處理器都忙於執行不相關的工作,平行處理可能不會造成實際的平行處理原則。
所有工作方法的所有引數都必須為非 Null。
這個類別是 JAVA Collections Framework的成員。
在 1.5 中新增。
的 java.util.concurrent.ConcurrentHashMap
JAVA 檔。
此頁面的部分是根據 原始碼專案所建立和共用的工作進行修改,並根據中所述的詞彙使用。
建構函式
ConcurrentHashMap() |
使用預設的初始資料表大小建立新的空白對應, (16) 。 |
ConcurrentHashMap(IDictionary) |
使用與指定地圖相同的對應,建立新的對應。 |
ConcurrentHashMap(Int32) |
建立新的空白對應,其初始資料表大小會容納指定的元素數目,而不需要動態調整大小。 |
ConcurrentHashMap(Int32, Single) |
根據指定的元素 |
ConcurrentHashMap(Int32, Single, Int32) |
根據指定的元素數目,建立新的空白對應 () |
ConcurrentHashMap(IntPtr, JniHandleOwnership) |
建立 JNI 物件的 Managed 標記法時所使用的建構函式;由執行時間呼叫。 |
屬性
Class |
傳回這個 |
Handle |
基礎 Android 實例的控制碼。 (繼承來源 Object) |
IsEmpty |
要新增 (繼承來源 AbstractMap) |
JniIdentityHashCode |
雜湊表,支援完整擷取並行,以及更新預期的高平行存取。 (繼承來源 Object) |
JniPeerMembers |
雜湊表,支援完整擷取並行,以及更新預期的高平行存取。 |
PeerReference |
雜湊表,支援完整擷取並行,以及更新預期的高平行存取。 (繼承來源 Object) |
ThresholdClass |
此 API 支援 Mono for Android 基礎結構,並不適合直接從您的程式碼使用。 |
ThresholdType |
此 API 支援 Mono for Android 基礎結構,並不適合直接從您的程式碼使用。 |
方法
明確介面實作
IJavaPeerable.Disposed() |
雜湊表,支援完整擷取並行,以及更新預期的高平行存取。 (繼承來源 Object) |
IJavaPeerable.DisposeUnlessReferenced() |
雜湊表,支援完整擷取並行,以及更新預期的高平行存取。 (繼承來源 Object) |
IJavaPeerable.Finalized() |
雜湊表,支援完整擷取並行,以及更新預期的高平行存取。 (繼承來源 Object) |
IJavaPeerable.JniManagedPeerState |
雜湊表,支援完整擷取並行,以及更新預期的高平行存取。 (繼承來源 Object) |
IJavaPeerable.SetJniIdentityHashCode(Int32) |
雜湊表,支援完整擷取並行,以及更新預期的高平行存取。 (繼承來源 Object) |
IJavaPeerable.SetJniManagedPeerState(JniManagedPeerStates) |
雜湊表,支援完整擷取並行,以及更新預期的高平行存取。 (繼承來源 Object) |
IJavaPeerable.SetPeerReference(JniObjectReference) |
雜湊表,支援完整擷取並行,以及更新預期的高平行存取。 (繼承來源 Object) |
擴充方法
JavaCast<TResult>(IJavaObject) |
執行 Android 執行時間檢查的類型轉換。 |
JavaCast<TResult>(IJavaObject) |
雜湊表,支援完整擷取並行,以及更新預期的高平行存取。 |
GetJniTypeName(IJavaPeerable) |
雜湊表,支援完整擷取並行,以及更新預期的高平行存取。 |