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> 需要锁定,并且<>对于<>锁定整个表没有任何支持,从而阻止所有访问。 此类在依赖于线程安全性但不依赖于其同步详细信息的程序中完全可 Hashtable 互操作。

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

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

Set可以创建 ConcurrentHashMap 的投影(使用#newKeySet()#newKeySet(int))或查看(仅当仅关注键时使用#keySet(Object)),并且映射的值(可能暂时未使用)或全部采用相同的映射值。

ConcurrentHashMap 可以使用值和初始化#computeIfAbsent computeIfAbsent值作为可缩放的频率映射(直方图或多集java.util.concurrent.atomic.LongAdder形式)。 例如,若要向 a ConcurrentHashMap<String,LongAdder> freqs添加计数,可以使用 freqs.computeIfAbsent(key, k -> new LongAdder()).increment();

此类及其视图和迭代器实现所有 <em>optional</em> 方法 Map 以及 Iterator 接口。

Hashtable但与不同HashMap,此类不<><允许null用作键或值。>

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

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

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

<li>reduce:累积每个元素。 提供的减少功能不能依赖于排序(更正式,它应该是关联和通勤的)。 有五个变体:

<ul>

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

<li>Mapped reductions that accumulate the results of a given function applied to each element.

<li>Reductions to scalar doubles, longs, and ints, using a given basis value.

</ul></ul>

这些批量操作接受参数 parallelismThreshold 。 如果估计当前映射大小小于给定阈值,则方法会按顺序继续。 使用一 Long.MAX_VALUE 个值可抑制所有并行度。 通过将分区到足够的子任务来充分利用ForkJoinPool#commonPool()用于所有并行计算的结果值1,实现最大并行度。 通常,你最初会选择其中一个极端值,然后测量使用在值之间权衡开销与吞吐量的性能。

大容量操作的并发属性遵循 ConcurrentHashMap 的并发属性:从 get(key) 相关访问方法返回的任何非 null 结果都与关联的插入或更新具有发生前的关系。 任何批量操作的结果都反映了这些每个元素关系的构成(但并不一定是整体地图的原子性,除非已知是静止的)。 相反,由于映射中的键和值从不为 null,null 用作当前缺少任何结果的可靠原子指示器。 为了维护此属性,null 作为所有非标量减少操作的隐式基础。 对于双精度、长版本和 int 版本,基础应为一个,当与任何其他值结合使用时,返回其他值(更正式,它应该是减少的标识元素)。 最常见的减少具有这些属性;例如,使用基数 0 或以基数计算最小值的总和MAX_VALUE。

作为参数提供的搜索和转换函数应同样返回 null,以指示缺少任何结果(在这种情况下不使用它)。 在映射减少的情况下,这还允许转换充当筛选器,如果不应组合元素,则返回 null(或者,在基元专用化的情况下为标识基数)。 在搜索或化简操作中使用它们之前,可以自行根据此“null”规则创建复合转换和筛选。

接受和/或返回 Entry 参数的方法维护键值关联。 例如,当查找最大值的键时,它们可能很有用。 请注意,可以使用 “plain” Entry 参数提供 new AbstractMap.SimpleEntry(k,v)

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

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

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

此类是 Java 集合框架的成员

在 1.5 中添加。

适用于 . 的 java.util.concurrent.ConcurrentHashMapJava 文档

本页的某些部分是根据 Android 开放源代码项目创建和共享的工作进行的修改,并根据 Creative Commons 2.5 属性许可证中所述的术语使用。

构造函数

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)

一个哈希表,支持完整并发检索和更新预期的高并发性。

适用于