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版本。 但是,即使所有操作都是线程安全的,检索操作也不需要<><>锁定,并且<><>没有任何支持以阻止所有访问的方式锁定整个表。 此类与依赖于其线程安全但不依赖于其同步详细信息的程序中完全互 Hashtable 操作。

检索操作 (包括 get) 通常不会阻止,因此可能与包括 putremove) (更新操作重叠。 检索反映最近<>完成<的>更新操作的结果,这些操作在开始时保持这些操作。 (更正式地说,给定密钥<><>的更新操作与报告更新的 value 的键的任何 (非 null) 检索关系。) 对于 和 clearputAll聚合操作,并发检索可能仅反映插入或删除某些条目。 同样,迭代器、拆分器和枚举返回元素,这些元素反映哈希表在迭代器/枚举创建时或创建后的状态。 它们不会<><引发>java.util.ConcurrentModificationException ConcurrentModificationException。 但是,迭代器设计为一次只能由一个线程使用。 请记住,包括 、 isEmptycontainsValuesize聚合状态方法的结果通常仅在映射未在其他线程中进行并发更新时才有用。 否则,这些方法的结果反映的暂时性状态可能足以用于监视或估计目的,但不适用于程序控制。

当 (冲突过多时,表会动态扩展,即,具有不同哈希代码但与表大小) 相同槽的键,其预期平均效果是,每个映射 (对应于重设大小) 的 0.75 负载因子阈值。 添加和删除映射时,此平均值可能存在很大的差异,但总体而言,这保持了哈希表的普遍接受的时间/空间权衡。 但是,调整此哈希表或任何其他类型的哈希表的大小可能是一个相对缓慢的操作。 如果可能,最好提供大小估计作为可选 initialCapacity 构造函数参数。 附加的可选 loadFactor 构造函数参数通过指定用于计算要为给定数量的元素分配的空间量时使用的表密度,提供了自定义初始表容量的进一步方法。 此外,为了与此类的早期版本兼容,构造函数可以选择性地指定预期的 concurrencyLevel 作为内部大小调整的附加提示。 请注意,使用具有相同 hashCode() 的许多键是降低任何哈希表性能的一种肯定方法。 为了减轻影响,当键为 Comparable时,此类可以使用键之间的比较顺序来帮助打破联系。

Set使用 或 () #newKeySet() 创建 ConcurrentHashMap 的投影时,可以使用 或 #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,>此类不允许<<>null用作键或值。

ConcurrentHashMaps 支持一组顺序和并行批量操作,与大多数Stream方法不同,这些操作设计为安全且通常合理地应用,即使映射由其他线程同时更新;例如,在计算共享注册表中值的快照摘要时。 有三种类型的操作,每个操作都有四种形式,接受具有键、值、条目和 (键、值) 对的函数作为参数和/或返回值。 由于 ConcurrentHashMap 的元素不是以任何特定方式排序的,并且可以在不同的并行执行中按不同的顺序进行处理,因此所提供的函数的正确性不应依赖于任何排序,也不应依赖于在计算过程中可能暂时更改的任何其他对象或值;和 ,除了 forEach 操作,理想情况下应为无副作用。 对 Map.Entry 对象的批量操作不支持方法 setValue

<ul><li>forEach:对每个元素执行给定操作。 变体形式在执行操作之前对每个元素应用给定的转换。

<li>search:返回对每个元素应用给定函数的第一个可用非 null 结果;找到结果时跳过进一步搜索。

<li>reduce:累积每个元素。 提供的缩减函数不能更正式地依赖于排序 (,它应该是结合和交换性) 。 有五种变体:

<ul>

<李>平原减少。 (没有用于 (键、值) 函数参数的此方法形式,因为没有相应的返回类型。)

<li>映射缩减,累积应用于每个元素的给定函数的结果。

<li>使用给定基值缩减为标量双精度型、长型和 ints。

</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)“纯”条目参数。

批量操作可能会突然完成,引发在提供的函数的应用程序中遇到的异常。 处理此类异常时,请记住,其他并发执行的函数也可能引发异常,或者在未发生第一个异常时引发异常。

与顺序形式相比,并行加速是常见的,但不保证。 如果并行化计算的基础工作比计算本身更昂贵,则涉及小型映射上简短函数的并行操作的执行速度可能比顺序形式慢。 同样,如果所有处理器都忙于执行不相关的任务,则并行化可能不会产生太多的实际并行度。

所有任务方法的所有参数都必须为非 null。

此类是 Java 集合框架的成员。

在 1.5 中添加。

java.util.concurrent.ConcurrentHashMapJava 文档。

此页面的某些部分是基于 创建和共享的工作进行的修改,并根据 署名许可中所述的条款使用。

构造函数

ConcurrentHashMap()

创建一个新的空映射,默认初始表大小 (16) 。

ConcurrentHashMap(IDictionary)

使用与给定映射相同的映射创建新映射。

ConcurrentHashMap(Int32)

创建一个新的空映射,其初始表大小容纳指定数量的元素,而无需动态调整大小。

ConcurrentHashMap(Int32, Single)

创建一个新的空映射,其初始表大小基于给定数量的元素 (initialCapacity) 和初始表密度 (loadFactor) 。

ConcurrentHashMap(Int32, Single, Int32)

创建一个新的空映射,其初始表大小基于给定数量的元素 () initialCapacity 、初始表密度 (loadFactor) ,以及同时更新 (concurrencyLevel) 线程数。

ConcurrentHashMap(IntPtr, JniHandleOwnership)

创建 JNI 对象的托管表示形式时使用的构造函数;由运行时调用。

属性

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 <通知/em> 或 <em>interrupted</em>。<>

(继承自 Object)
Wait(Int64)

导致当前线程等待,直到它被唤醒,通常是通过 em <通知/em> 或 <em>interrupted</em>,或直到经过一定数量的实时。<>

(继承自 Object)
Wait(Int64, Int32)

导致当前线程等待,直到它被唤醒,通常是通过 em <通知/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)

支持检索的完全并发性和更新的高预期并发性的哈希表。

适用于