我正在使用 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? .
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/