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