从AtomicLongMap的文档中:
注意:如果您的值始终为正且小于2 ^ 31,则可能希望使用诸如ConcurrentHashMultiset之类的Multiset。 警告:与Multiset不同,值0的条目不会自动从地图中删除。相反,必须使用removeAllZeros()手动将其删除。
它指出您可能会希望使用多重集。我的问题是,与AtomicLongMap相比,Multiset有什么好处?选择仅包含正值的地图时应使用哪些注意事项?使用Multiset的唯一原因是我不需要手动调用removeAllZeros()
吗?
最佳答案
Multiset在概念上有所不同。首先,它是Collection
,因此可以用作集合,而AtomicLongMap
也不是集合(也不是地图)。多重集表示一组可能重复的元素,要对其计数进行数学运算,请添加或删除元素。 AtomicLongMap
方法名称与AtomicLong
类更一致,并明确假定您正在对值执行数学运算。某些操作可能不受某个实现或另一实现的支持。例如,addAndGet
中有getAndAdd
和AtomicLongMap
ops,但是Multiset
仅具有add
方法,其作用类似于getAndAdd
。
因此,尽管这些类在许多情况下是可互换的,但如果您将数据视为可能重复的元素的集合,请使用ConcurrentHashMultiset
。如果您认为数据是键和AtomicLongMap
值之间的映射,请使用long
。
请注意,从Java-8开始,可以使用标准JDK ConcurrentHashMap<K, Long>
轻松替换这些类。例如,您可以使用map.merge(key, 1L, Long::sum);
来增加映射值。