Share via


ConcurrentHashMap 類別

定義

雜湊表,支援完整擷取並行,以及更新預期的高平行存取。

[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
繼承
ConcurrentHashMap
屬性
實作

備註

雜湊表,支援完整擷取並行,以及更新預期的高平行存取。 這個類別遵守 與 相同的功能規格 java.util.Hashtable ,並包含對應至 每個 方法的方法 Hashtable 版本。 不過,即使所有作業都是安全線程,擷取作業仍不需要 <<>> 鎖定,而且 < em > 不會 < /em > 任何鎖定整個資料表的支援,以防止所有存取。 這個類別與 Hashtable 依賴其執行緒安全,但不在其同步處理詳細資料的程式中完全互通。

擷取作業 (包括 get) 通常不會封鎖,因此可能會與更新作業重迭, (包括 putremove) 。 擷取會反映最近在擷取時保留的 em 已完成/em > 更新作業的結果 < 。 <> (更正式地,給定金鑰的更新作業會與報告更新值的任何 (非 null) 擷取關聯性,而該索引鍵的更新作業會與 < em > 發生之前 < /em > 關聯。) 針對 和 clearputAll 匯總作業,並行擷取可能會反映只插入或移除某些專案。 同樣地,Iterators、Spliterators 和 Enumerations 會傳回元素,反映某個時間點或建立反覆運算器/列舉之後雜湊表的狀態。 它們不會 << / > em > 擲回 java.util.ConcurrentModificationException ConcurrentModificationException 。 不過,反覆運算器是設計成一次只能由一個執行緒使用。 請記住,匯總狀態方法的結果,包括 sizeisEmptycontainsValue 通常只有在對應未在其他執行緒中進行並行更新時才有用。 否則,這些方法的結果會反映可能足以監視或估計目的的暫時性狀態,但不適用於程式控制。

當發生太多衝突 (時,資料表會動態展開,亦即具有相異雜湊碼但落在資料表大小) 相同的位置模數,且每個對應 (大約維護兩個間隔的預期平均效果, (對應至 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

和 不同 HashtableHashMap ,這個類別不會 < 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)

根據指定的元素 initialCapacity 數目, () 和初始資料表密度 loadFactor () ,建立具有初始資料表大小的新空白對應。

ConcurrentHashMap(Int32, Single, Int32)

根據指定的元素數目,建立新的空白對應 () initialCapacity 、初始資料表密度 (loadFactor) ,以及同時更新執行緒 () concurrencyLevel 數目。

ConcurrentHashMap(IntPtr, JniHandleOwnership)

建立 JNI 物件的 Managed 標記法時所使用的建構函式;由執行時間呼叫。

屬性

Class

傳回這個 Object 的執行時間類別。

(繼承來源 Object)
Handle

基礎 Android 實例的控制碼。

(繼承來源 Object)
IsEmpty

要新增

(繼承來源 AbstractMap)
JniIdentityHashCode

雜湊表,支援完整擷取並行,以及更新預期的高平行存取。

(繼承來源 Object)
JniPeerMembers

雜湊表,支援完整擷取並行,以及更新預期的高平行存取。

PeerReference

雜湊表,支援完整擷取並行,以及更新預期的高平行存取。

(繼承來源 Object)
ThresholdClass

此 API 支援 Mono for Android 基礎結構,並不適合直接從您的程式碼使用。

ThresholdType

此 API 支援 Mono for Android 基礎結構,並不適合直接從您的程式碼使用。

方法

Clear()

要新增

(繼承來源 AbstractMap)
Clone()

建立並傳回這個 物件的複本。

(繼承來源 Object)
Compute(Object, IBiFunction)

嘗試計算指定索引鍵的對應及其目前對應值 (,或者 null 如果沒有目前的對應) 。

ComputeIfAbsent(Object, IFunction)

如果指定的索引鍵尚未與值相關聯,請嘗試使用指定的對應函式來計算其值,並輸入到這個對應中,除非 。 null

ComputeIfPresent(Object, IBiFunction)

如果指定的索引鍵值存在,則嘗試計算指定的索引鍵及其目前對應值的新對應。

Contains(Object)

測試某些索引鍵是否對應至此資料表中的指定值。

ContainsKey(Object)

要新增

(繼承來源 AbstractMap)
ContainsValue(Object)

要新增

(繼承來源 AbstractMap)
Dispose()

雜湊表,支援完整擷取並行,以及更新預期的高平行存取。

(繼承來源 Object)
Dispose(Boolean)

雜湊表,支援完整擷取並行,以及更新預期的高平行存取。

(繼承來源 Object)
Elements()

傳回這個資料表中值的列舉。

EntrySet()

Set傳回這個對應中包含的對應檢視。

Equals(Object)

指出其他物件是否「等於」這個物件。

(繼承來源 Object)
ForEach(IBiConsumer)

針對每個 (索引鍵、值) 執行指定的動作。

ForEach(Int64, IBiConsumer)

針對每個 (索引鍵、值) 執行指定的動作。

ForEach(Int64, IBiFunction, IConsumer)

針對每個 (索引鍵、值) 的每個非 Null 轉換,執行指定的動作。

ForEachEntry(Int64, IConsumer)

針對每個專案執行指定的動作。

ForEachEntry(Int64, IFunction, IConsumer)

針對每個專案的每個非 Null 轉換執行指定的動作。

ForEachKey(Int64, IConsumer)

針對每個索引鍵執行指定的動作。

ForEachKey(Int64, IFunction, IConsumer)

針對每個索引鍵的每個非 Null 轉換,執行指定的動作。

ForEachValue(Int64, IConsumer)

針對每個值執行指定的動作。

ForEachValue(Int64, IFunction, IConsumer)

針對每個值的每個非 Null 轉換執行指定的動作。

Get(Object)

要新增

(繼承來源 AbstractMap)
GetHashCode()

傳回此物件的雜湊碼值。

(繼承來源 Object)
GetOrDefault(Object, Object)

傳回指定索引鍵所對應的值,如果這個對應不包含索引鍵的對應,則傳回指定的預設值。

JavaFinalize()

當垃圾收集判斷物件沒有其他參考時,由物件上的垃圾收集行程呼叫。

(繼承來源 Object)
Keys()

傳回這個資料表中索引鍵的列舉。

KeySet()

要新增

(繼承來源 AbstractMap)
MappingCount()

傳回對應數目。

Merge(Object, Object, IBiFunction)

如果指定的索引鍵尚未與 (非 Null) 值相關聯,請將它與指定的值產生關聯。

Notify()

喚醒正在等候此物件的監視器的單一線程。

(繼承來源 Object)
NotifyAll()

喚醒正在等候此物件監視器的所有線程。

(繼承來源 Object)
Put(Object, Object)

要新增

(繼承來源 AbstractMap)
PutAll(IDictionary)

要新增

(繼承來源 AbstractMap)
PutIfAbsent(Object, Object)

要新增

Reduce(Int64, IBiFunction, IBiFunction)

傳回使用指定歸納器來合併值的所有 (索引鍵、值) 組的指定轉換結果,如果沒有,則傳回 null。

ReduceEntries(Int64, IBiFunction)

傳回使用指定歸納器來合併值的所有專案的結果,如果沒有,則傳回 null。

ReduceEntries(Int64, IFunction, IBiFunction)

傳回使用指定歸納器來合併值之所有專案的指定轉換結果,如果沒有,則傳回 null。

ReduceEntriesToDouble(Int64, IToDoubleFunction, Double, IDoubleBinaryOperator)

傳回使用指定歸納器來合併值之所有專案的指定轉換結果,以及指定基礎做為識別值。

ReduceEntriesToInt(Int64, IToIntFunction, Int32, IIntBinaryOperator)

傳回使用指定歸納器來合併值之所有專案的指定轉換結果,以及指定基礎做為識別值。

ReduceEntriesToLong(Int64, IToLongFunction, Int64, ILongBinaryOperator)

傳回使用指定歸納器來合併值之所有專案的指定轉換結果,以及指定基礎做為識別值。

ReduceKeys(Int64, IBiFunction)

傳回使用指定歸納器來合併值的所有索引鍵的結果,如果沒有,則傳回 null。

ReduceKeys(Int64, IFunction, IBiFunction)

傳回使用指定歸納器來合併值之所有索引鍵的指定轉換結果,如果沒有,則傳回 null。

ReduceKeysToDouble(Int64, IToDoubleFunction, Double, IDoubleBinaryOperator)

傳回使用指定歸納器來合併值之所有索引鍵的指定轉換結果,並傳回指定基礎做為識別值。

ReduceKeysToInt(Int64, IToIntFunction, Int32, IIntBinaryOperator)

傳回使用指定歸納器來合併值之所有索引鍵的指定轉換結果,並傳回指定基礎做為識別值。

ReduceKeysToLong(Int64, IToLongFunction, Int64, ILongBinaryOperator)

傳回使用指定歸納器來合併值之所有索引鍵的指定轉換結果,並傳回指定基礎做為識別值。

ReduceToDouble(Int64, IToDoubleBiFunction, Double, IDoubleBinaryOperator)

傳回使用指定歸納器來結合值,並將指定基礎當做識別值來累積所有 (索引鍵、值) 組的結果。

ReduceToInt(Int64, IToIntBiFunction, Int32, IIntBinaryOperator)

傳回使用指定歸納器來結合值,並將指定基礎當做識別值來累積所有 (索引鍵、值) 組的結果。

ReduceToLong(Int64, IToLongBiFunction, Int64, ILongBinaryOperator)

傳回使用指定歸納器來結合值,並將指定基礎當做識別值來累積所有 (索引鍵、值) 組的結果。

ReduceValues(Int64, IBiFunction)

傳回使用指定歸納器來合併值的所有值的結果,如果沒有,則傳回 null。

ReduceValues(Int64, IFunction, IBiFunction)

傳回使用指定歸納器來合併值的所有指定轉換的結果,如果沒有,則傳回 null。

ReduceValuesToDouble(Int64, IToDoubleFunction, Double, IDoubleBinaryOperator)

傳回使用指定歸納器來結合值,並將指定基礎當做識別值來累積所有值的指定轉換結果。

ReduceValuesToInt(Int64, IToIntFunction, Int32, IIntBinaryOperator)

傳回使用指定歸納器來結合值,並將指定基礎當做識別值來累積所有值的指定轉換結果。

ReduceValuesToLong(Int64, IToLongFunction, Int64, ILongBinaryOperator)

傳回使用指定歸納器來結合值,並將指定基礎當做識別值來累積所有值的指定轉換結果。

Remove(Object)

要新增

(繼承來源 AbstractMap)
Remove(Object, Object)

要新增

Replace(Object, Object)

要新增

Replace(Object, Object, Object)

要新增

ReplaceAll(IBiFunction)

雜湊表,支援完整擷取並行,以及更新預期的高平行存取。

Search(Int64, IBiFunction)

傳回非 Null 結果,從在每個 (索引鍵、值) 套用指定的搜尋函式,如果沒有,則傳回 null。

SearchEntries(Int64, IFunction)

傳回非 Null 結果,從在每個專案上套用指定的搜尋函式,如果沒有,則傳回 null。

SearchKeys(Int64, IFunction)

傳回非 Null 結果,從在每個索引鍵上套用指定的搜尋函式,如果沒有,則傳回 null。

SearchValues(Int64, IFunction)

傳回非 Null 結果,從在每個值上套用指定的搜尋函式,如果沒有,則傳回 null。

SetHandle(IntPtr, JniHandleOwnership)

設定 Handle 屬性。

(繼承來源 Object)
Size()

要新增

(繼承來源 AbstractMap)
ToArray<T>()

雜湊表,支援完整擷取並行,以及更新預期的高平行存取。

(繼承來源 Object)
ToString()

傳回物件的字串表示。

(繼承來源 Object)
UnregisterFromRuntime()

雜湊表,支援完整擷取並行,以及更新預期的高平行存取。

(繼承來源 Object)
Values()

要新增

(繼承來源 AbstractMap)
Wait()

讓目前的執行緒等到喚醒為止,通常是藉由 < em > notified < /em > 或 < em > interrupted < /em > 來喚醒。

(繼承來源 Object)
Wait(Int64)

讓目前的執行緒等到喚醒為止,通常是 < 透過 em > notified < /em 或 em > interrupted < /em >> ,或 < 直到經過一定數量的即時為止。

(繼承來源 Object)
Wait(Int64, Int32)

讓目前的執行緒等到喚醒為止,通常是 < 透過 em > notified < /em 或 em > interrupted < /em >> ,或 < 直到經過一定數量的即時為止。

(繼承來源 Object)

明確介面實作

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)

雜湊表,支援完整擷取並行,以及更新預期的高平行存取。

適用於