AtomicLongMap的文档中:

注意:如果您的值始终为正且小于2 ^ 31,则可能希望使用诸如ConcurrentHashMultiset之类的Multiset。 警告:与Multiset不同,值0的条目不会自动从地图中删除。相反,必须使用removeAllZeros()手动将其删除。

它指出您可能会希望使用多重集。我的问题是,与AtomicLongMap相比,Multiset有什么好处?选择仅包含正值的地图时应使用哪些注意事项?使用Multiset的唯一原因是我不需要手动调用removeAllZeros()吗?

最佳答案

Multiset在概念上有所不同。首先,它是Collection,因此可以用作集合,而AtomicLongMap也不是集合(也不是地图)。多重集表示一组可能重复的元素,要对其计数进行数学运算,请添加或删除元素。 AtomicLongMap方法名称与AtomicLong类更一致,并明确假定您正在对值执行数学运算。某些操作可能不受某个实现或另一实现的支持。例如,addAndGet中有getAndAddAtomicLongMap ops,但是Multiset仅具有add方法,其作用类似于getAndAdd

因此,尽管这些类在许多情况下是可互换的,但如果您将数据视为可能重复的元素的集合,请使用ConcurrentHashMultiset。如果您认为数据是键和AtomicLongMap值之间的映射,请使用long

请注意,从Java-8开始,可以使用标准JDK ConcurrentHashMap<K, Long>轻松替换这些类。例如,您可以使用map.merge(key, 1L, Long::sum);来增加映射值。

10-07 16:41