首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 程式設計入門

Java EnumSet 高效操作枚舉集合:從基礎到範圍查詢完整指南

     編輯:Java 程式設計入門

為什麼選擇 EnumSet?

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]
    }
}

關鍵 API 解析

方法說明回傳類型
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>

效能優勢

  • 記憶體:64 個以下枚舉值僅佔 1 個 long(8 位元組);超過 64 個則用 long[]。
  • 速度:位運算(AND/OR/XOR)完成增刪查,遠快於 HashSet。
  • 型別安全:編譯期限制只能放入指定枚舉類型,避免 ClassCastException。
  • 有序性:迭代順序固定為枚舉宣告順序,無需額外排序。

最佳實踐建議

  1. 優先使用 EnumSet 替代 HashSet<Enum> 或位元組合(int flags)。
  2. 靜態導入枚舉常數(static import)提升程式碼可讀性。
  3. 需要「旗標」語義時,直接用 EnumSet 替代傳統 int bitmask。
  4. 序列化場景:EnumSet 實作 Serializable,可直接序列化。

總結

EnumSet 是 Java 集合框架中「為特定問題量身打造」的經典範例:針對枚舉類型提供極致效能與豐富語義。掌握 noneOf、allOf、complementOf、range 等工廠方法,能讓枚舉集合操作既優雅又高效。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved