java - 使用 Guava 多重集或 Collections.frequency()?

标签 java collections guava multiset

我正在使用 Multiset 可以轻松访问元素的频率,但我意识到有 Collections#frequency(Collection<?>, Object) 这对任何集合都是一样的。使用 Multiset 有什么意义?然后?性能是这里的问题吗?

最佳答案

Multiset#count() 的 Guava 文档 不得不说:

Note that for an Object.equals(java.lang.Object)-based multiset, this gives the same result as Collections.frequency(java.util.Collection, java.lang.Object) (which would presumably perform more poorly).

所以,是的,我怀疑性能是这里的问题。

我认为Multiset#count效率更高,因为 Collections#frequency遍历整个集合。对于您正在检查其频率的对象 o,它将遍历集合中的所有元素 e 并检查 (o == null ? e == null : o.equals(e)) .

对于 Multiset(这是一个接口(interface)),count 的确切实现取决于类(class)。如果是HashMultiset ,例如,那么它由 HashMap 支持.有关这比遍历整个集合更有效的详细信息,请查看此答案:How does a Java HashMap handle different objects with the same hash code? .

Guava code如下

public int count(@Nullable Object element) {
    Count frequency = Maps.safeGet(backingMap, element);
    return (frequency == null) ? 0 : frequency.get();
}

类似地,对于 TreeMultiset ,它维护其元素的顺序并由 AVL 树支持,count可以在 O(log(n)) 步而不是 O(n) 中获得,其中 n 是集合的大小。 Guava code如下:

public int count(@Nullable Object element) {
    try {
      @SuppressWarnings("unchecked")
          E e = (E) element;
          AvlNode<E> root = rootReference.get();
          if (!range.contains(e) || root == null) {
              return 0;
          }
      return root.count(comparator(), e);
    } catch (ClassCastException e) {
          return 0;
    } catch (NullPointerException e) {
          return 0;
    }
}

关于java - 使用 Guava 多重集或 Collections.frequency()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27374200/

相关文章:

java - 如何从其他类获取文本框值?

java - VisualVM 中的美元符号

scala - 如何使用 scala 2.13 转换元组集合

java - Guava MinMaxPriorityQueue 实例化

Java Guava : Remove and put back elements from Multimap while iterating

Java 和 XML : Read XML tags with or without namespace

java - 转换引用与使用 new (ArrayList)

java - ArrayList 中类对象属性的总和值

java - 与java的Set Collection相关的查询

java - HashBiMap 是线程安全的吗?