java.util.EnumSet 是專為枚舉類型設計的高效能 Set 實現。內部以位向量儲存,佔用記憶體極小、運算速度極快,且提供豐富的靜態工廠方法,是處理「枚舉集合」的首選方案。
package cn.edu.xidian.crytoll;
public enum Weeks {
MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURADAY, SUNDAY
}
package cn.edu.xidian.crytoll;
import static cn.edu.xidian.crytoll.Weeks.MONDAY;
import static cn.edu.xidian.crytoll.Weeks.THURSDAY;
import java.util.EnumSet;
public class EnumSetTest {
public static void main(String[] args) {
// 1. 建立空集合
EnumSet<Weeks> week = EnumSet.noneOf(Weeks.class);
System.out.println("初始:" + week); // []
// 2. 新增單一元素
week.add(MONDAY);
System.out.println("新增 MONDAY:" + week); // [MONDAY]
// 3. 移除單一元素
week.remove(MONDAY);
System.out.println("移除 MONDAY:" + week); // []
// 4. 取補集:所有未在集合中的枚舉值
week.addAll(EnumSet.complementOf(week));
System.out.println("補集(全量):" + week); // [MONDAY, TUESDAY, ..., SUNDAY]
// 5. 範圍查詢:MONDAY 到 THURSDAY(含端點)
week.removeAll(EnumSet.range(MONDAY, THURSDAY));
System.out.println("移除 週一至週四:" + week); // [FRIDAY, SATURADAY, SUNDAY]
}
}
| 方法 | 說明 | 回傳類型 |
|---|---|---|
noneOf(E.class) | 建立空集合 | EnumSet<E> |
allOf(E.class) | 建立包含所有枚舉值的集合 | EnumSet<E> |
complementOf(EnumSet) | 取補集(全集 - 指定集合) | EnumSet<E> |
range(E from, E to) | 建立範圍集合(含端點,按宣告順序) | EnumSet<E> |
of(E...) | 快速建立包含指定元素的集合 | EnumSet<E> |
copyOf(Collection) | 從任意集合複製建立 | EnumSet<E> |
long(8 位元組);超過 64 個則用 long[]。HashSet。ClassCastException。EnumSet 替代 HashSet<Enum> 或位元組合(int flags)。static import)提升程式碼可讀性。EnumSet 替代傳統 int bitmask。EnumSet 實作 Serializable,可直接序列化。EnumSet 是 Java 集合框架中「為特定問題量身打造」的經典範例:針對枚舉類型提供極致效能與豐富語義。掌握 noneOf、allOf、complementOf、range 等工廠方法,能讓枚舉集合操作既優雅又高效。