[英]Using Guava multisets or Collections.frequency()?
我使用Multiset
可以輕松訪問元素的頻率,但是我意識到有Collections#frequency(Collection<?>, Object)
對任何集合都可以做到這一點。 那么使用Multiset
什么意義呢? 性能是這里的問題嗎?
用於Multiset#count()的番石榴文檔必須說:
請注意,對於基於Object.equals(java.lang.Object)的多重集,此結果與Collections.frequency(java.util.Collection,java.lang.Object)的結果相同(可能表現較差)。
因此,是的,我懷疑性能是這里的問題。
我認為Multiset#count
效率更高,因為Collections#frequency
遍歷整個集合。 對於要檢查其頻率的對象o,它將遍歷集合中的所有元素e並進行檢查(o == null ? e == null : o.equals(e))
。
對於Multiset(這是一個接口), count
的確切實現取決於類。 例如,如果它是HashMultiset
,則由HashMap
支持。 有關與遍歷整個集合相比如何更有效的詳細信息,請查看以下答案: Java HashMap如何使用相同的哈希碼處理不同的對象? 。
番石榴代碼如下
public int count(@Nullable Object element) {
Count frequency = Maps.safeGet(backingMap, element);
return (frequency == null) ? 0 : frequency.get();
}
類似地,對於TreeMultiset
,它保持其元素的順序並由AVL樹支持,可以使用O(log(n))步而不是O(n)來獲得count
,其中n是集合的大小。 番石榴代碼如下:
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;
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.