Bag(多重集合)允許重複元素並記錄每個元素的出現次數。Commons Collections 提供完整的 Bag 體系:核心介面、抽象基礎實作、具體實作(HashBag/TreeBag)、裝飾器模式擴充(同步、唯讀、謂詞過濾、型別檢查),本文系統梳理全家族類別結構與核心邏輯。
public interface Bag extends Collection {
int getCount(Object object);
boolean add(Object object, int nCopies);
boolean remove(Object object, int nCopies);
Set uniqueSet(); // 不重複元素視圖
// 繼承 Collection: size(), iterator(), containsAll()...
}
public interface SortedBag extends Bag {
Comparator comparator();
Object first(); // 最小元素
Object last(); // 最大元素
}
以 Map<Object, MutableInteger> 為底層存儲,MutableInteger 封裝可變計數器。
public abstract class AbstractMapBag implements Bag {
private transient Map map; private int size; private transient int modCount;
private transient Set uniqueSet;
public int getCount(Object object) {
MutableInteger c = (MutableInteger) map.get(object);
return (c != null) ? c.value : 0;
}
public boolean add(Object object, int nCopies) {
if (nCopies <= 0) return false;
modCount++; size += nCopies;
MutableInteger c = (MutableInteger) map.get(object);
if (c == null) { map.put(object, new MutableInteger(nCopies)); return true; }
c.value += nCopies; return false;
}
// remove/removeAll/retainAll/iterator/序列化/equals/hashCode/toString 完整實作...
protected static class MutableInteger { int value; ... }
}
MutableInteger 避免頻繁建立新 Integer 物件,提升高頻計數效能。BagIterator 內部類實作疊代器,支援 remove() 正確遞減計數。uniqueSet() 回傳 UnmodifiableSet.decorate(map.keySet())。| 類別 | 底層 Map | 特性 |
|---|---|---|
HashBag | HashMap | 無序、O(1) 存取、可序列化 |
TreeBag | TreeMap | 有序、實作 SortedBag、支援 first()/last()/comparator() |
| 裝飾器 | 功能 | 靜態工廠方法 |
|---|---|---|
SynchronizedBag | 執行緒安全包裝 | BagUtils.synchronizedBag() |
UnmodifiableBag | 唯讀檢視 | BagUtils.unmodifiableBag() |
PredicatedBag | 元素謂詞驗證(加入前檢查) | BagUtils.predicatedBag() |
TypedBag | 型別檢查(InstanceofPredicate) | BagUtils.typedBag() |
TransformedBag | 元素轉換(加入時自動轉型) | BagUtils.transformedBag() |