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每個方法版本。 然而,即使所有操作都是執行緒安全的,檢索操作 do <em>not</em> 會包含鎖定,且 <em>not</em> 支援以阻止所有存取的方式鎖定整個資料表。 此類別與依賴執行緒安全但不依賴同步細節的程式完全互 Hashtable 通。

檢索操作(包括 get)通常不會阻塞,因此可能與更新操作(包含 putremove)重疊。 檢索反映最近完成的 EM>< 或 EM> 更新操作在啟動時的結果<。 (更正式地說,對於某一金鑰的更新操作, <具有 em>happens-before</em> 關係,且該金鑰的任意(非空)檢索都會報告更新值。) 對於像 和 clear這樣的聚合操作putAll,並行檢索可能只反映部分條目的插入或移除。 同樣地,迭代器、分割器與枚舉器回傳反映雜湊表在迭代器/枚舉建立時或自建立以來的狀態的元素。 他們不做</>>他們丟java.util.ConcurrentModificationException ConcurrentModificationException。< 然而,迭代器設計時只能同時由一個執行緒使用。 請記住,包含 sizeisEmptycontainsValue 的聚合狀態方法的結果通常只有在地圖未同時在其他執行緒中更新時才有用。 否則,這些方法的結果反映的暫時狀態可能足以用於監控或估算,但不適合程式控制。

當碰撞過多(即金鑰雖有不同雜湊碼但模於表格大小的槽位)時,表格會動態展開,預期平均效果是每次映射維持約兩個箱(對應 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)

建立一個新的空映射,初始資料表大小基於給定的元素數(initialCapacity)、初始資料表密度(loadFactor)及同時更新執行緒數(concurrencyLevel)。

ConcurrentHashMap(Int32, Single)

建立一個新的、空白的映射,初始資料表大小依據給定的元素數(initialCapacity)和初始資料表密度(loadFactor)。

ConcurrentHashMap(Int32)

建立一個新的空映射,初始資料表大小可容納指定元素數量,無需動態調整大小。

ConcurrentHashMap(IntPtr, JniHandleOwnership)

用於建立 JNI 物件受管理表示的建構器;由執行時呼叫。

屬性

名稱 Description
Class

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

(繼承來源 Object)
Handle

基礎Android實例的句柄。

(繼承來源 Object)
IsEmpty

待補充

(繼承來源 AbstractMap)
JniIdentityHashCode

一個支援全檢索並行及高預期並行以更新的雜湊表。

(繼承來源 Object)
JniPeerMembers

一個支援全檢索並行及高預期並行以更新的雜湊表。

PeerReference

一個支援全檢索並行及高預期並行以更新的雜湊表。

(繼承來源 Object)
ThresholdClass

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

ThresholdType

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

方法

名稱 Description
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)

對每個(鍵、值)的非空轉換執行給定動作。

ForEachEntry(Int64, IConsumer)

對每條目執行指定動作。

ForEachEntry(Int64, IFunction, IConsumer)

對每個非空轉換執行給定動作。

ForEachKey(Int64, IConsumer)

對每個鍵執行指定動作。

ForEachKey(Int64, IFunction, IConsumer)

對每個鍵的非空轉換執行給定動作。

ForEachValue(Int64, IConsumer)

對每個值執行給定動作。

ForEachValue(Int64, IFunction, IConsumer)

對每個非空變換執行給定動作。

Get(Object)

待補充

(繼承來源 AbstractMap)
GetHashCode()

傳回此物件的雜湊碼值。

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

回傳指定鍵映射的值,或若該映射無鍵映射,則回傳預設值。

JavaFinalize()

當垃圾收集決定不再參考物件時,垃圾收集行程在 物件上呼叫。

(繼承來源 Object)
Keys()

回傳此表中金鑰的枚舉。

KeySet()

待補充

(繼承來源 AbstractMap)
MappingCount()

回傳映射數量。

Merge(Object, Object, IBiFunction)

若指定的鍵尚未與(非空)值相關聯,則將其與該值關聯。

Notify()

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

(繼承來源 Object)
NotifyAll()

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

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

待補充

(繼承來源 AbstractMap)
PutAll(IDictionary)

待補充

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

待補充

Reduce(Int64, IBiFunction, IBiFunction)

回傳使用給定約簡器累積所有(鍵值)對的給定轉換結果,以合併值,若無則為空。

ReduceEntries(Int64, IBiFunction)

回傳使用給定縮減器累積所有條目以合併值的結果,若無則為 null。

ReduceEntries(Int64, IFunction, IBiFunction)

回傳使用給定還原器累積所有條目的給定轉換以合併值的結果,若無則為空值。

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)

回傳使用給定縮減器累積所有值以合併值的結果,若無則為空值。

ReduceValues(Int64, IFunction, IBiFunction)

回傳使用給定約簡器累積所有值轉換以合併值的結果,若無則為零。

ReduceValuesToDouble(Int64, IToDoubleFunction, Double, IDoubleBinaryOperator)

回傳使用給定約簡器累積所有值轉換後的結果,並將給定基底作為單位值。

ReduceValuesToInt(Int64, IToIntFunction, Int32, IIntBinaryOperator)

回傳使用給定約簡器累積所有值轉換後的結果,並將給定基底作為單位值。

ReduceValuesToLong(Int64, IToLongFunction, Int64, ILongBinaryOperator)

回傳使用給定約簡器累積所有值轉換後的結果,並將給定基底作為單位值。

Remove(Object, Object)

待補充

Remove(Object)

待補充

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

待補充

Replace(Object, Object)

待補充

ReplaceAll(IBiFunction)

一個支援全檢索並行及高預期並行以更新的雜湊表。

Search(Int64, IBiFunction)

對每個(鍵、值)應用給定搜尋函數後,回傳非空結果;若無則為空。

SearchEntries(Int64, IFunction)

對每個條目應用給定搜尋函數後,回傳非空結果;若無則為空。

SearchKeys(Int64, IFunction)

對每個鍵套用給定搜尋函數後,回傳非空結果;若無則為空。

SearchValues(Int64, IFunction)

對每個值應用給定搜尋函數後,回傳非空結果;若無則為空。

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, Int32)

讓目前的線程等到喚醒為止,通常是因為 <em>notified</em> 或 <em>interrupted</em>,或直到經過一定數量的實時為止。

(繼承來源 Object)
Wait(Int64)

讓目前的線程等到喚醒為止,通常是因為 <em>notified</em> 或 <em>interrupted</em>,或直到經過一定數量的實時為止。

(繼承來源 Object)

明確介面實作

名稱 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)

取得實例 self類型的 JNI 名稱。

JavaAs<TResult>(IJavaPeerable)

試著強制self輸入 TResult,檢查 強制在 Java 端是否有效。

JavaCast<TResult>(IJavaObject)

執行 Android 執行時間檢查的類型轉換。

JavaCast<TResult>(IJavaObject)

一個支援全檢索並行及高預期並行以更新的雜湊表。

TryJavaCast<TResult>(IJavaPeerable, TResult)

試著強制self輸入 TResult,檢查 強制在 Java 端是否有效。

適用於