AtomicLongMap与ConcurrentHashMultiset

时间:2015-08-17 09:07:10

标签: java collections guava

来自AtomicLongMap的文档:

  

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

它声明您可能希望使用Multiset。我的问题是,Multiset相对于AtomicLongMap有什么好处?选择仅包含正值的地图时,我应该考虑哪些因素?使用Multiset的唯一原因是,我不需要手动拨打removeAllZeros()吗?

1 个答案:

答案 0 :(得分:4)

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

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

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