一 集合類EnumSet概述
- EnumSet是一個專為枚舉類設計的集合類,EnumSet中所有元素都必須是指定枚舉類型的枚舉值,該枚舉類型在建立EnumSet時顯式或隐式地指定。EnumSet的集合元素也是有序的,EnumSet以枚舉值在Enum類的定義順序來決定集合元素的順序。
- EnumSet在内部以位向量的形式存儲,這種存儲形式非常緊湊、高效,是以EnumSet對象占用記憶體很小,而且運作效率很好。尤其是當進行批量操作(如調用containsAll 和 retainAll方法)時,如果其參數也是EnumSet集合,則該批量操作的執行速度也非常快。
- EnumSet集合不允許加入null元素。如果試圖插入null元素,EnumSet将抛出 NullPointerException異常。如果僅僅隻是試圖測試是否出現null元素、或删除null元素都不會抛出異常,隻是删除操作将傳回false,因為沒有任何null元素被删除。
二 EnumSet類的正常應用
1 代碼示例
import java.util.*;
enum Season
{
SPRING,SUMMER,FALL,WINTER
}
public class EnumSetTest
{
public static void main(String[] args)
{
// 建立一個EnumSet集合,集合元素就是Season枚舉類的全部枚舉值
EnumSet es1 = EnumSet.allOf(Season.class);
System.out.println(es1); // 輸出[SPRING,SUMMER,FALL,WINTER]
// 建立一個EnumSet空集合,指定其集合元素是Season類的枚舉值。
EnumSet es2 = EnumSet.noneOf(Season.class);
System.out.println(es2); // 輸出[]
// 手動添加兩個元素
es2.add(Season.WINTER);
es2.add(Season.SPRING);
System.out.println(es2); // 輸出[SPRING,WINTER]
// 以指定枚舉值建立EnumSet集合
EnumSet es3 = EnumSet.of(Season.SUMMER , Season.WINTER);
System.out.println(es3); // 輸出[SUMMER,WINTER]
EnumSet es4 = EnumSet.range(Season.SUMMER , Season.WINTER);
System.out.println(es4); // 輸出[SUMMER,FALL,WINTER]
// 新建立的EnumSet集合的元素和es4集合的元素有相同類型,
// es5的集合元素 + es4集合元素 = Season枚舉類的全部枚舉值
EnumSet es5 = EnumSet.complementOf(es4);
System.out.println(es5); // 輸出[SPRING]
}
}
2 運作結果
[SPRING, SUMMER, FALL, WINTER]
[]
[SPRING, WINTER]
[SUMMER, WINTER]
[SUMMER, FALL, WINTER]
[SPRING]
3 代碼說明
此代碼示範了如何使用EnumSet來儲存枚舉類的多個枚舉值。
三 EnumSet類的錯誤使用
1 代碼示例
import java.util.*;
enum Season
{
SPRING,SUMMER,FALL,WINTER
}
public class EnumSetTest2
{
public static void main(String[] args)
{
Collection c = new HashSet();
c.clear();
c.add(Season.FALL);
c.add(Season.SPRING);
// 複制Collection集合中所有元素來建立EnumSet集合
EnumSet enumSet = EnumSet.copyOf(c); // ①
System.out.println(enumSet); // 輸出[SPRING,FALL]
c.add("Java");
c.add("Linux");
// 下面代碼出現異常:因為c集合裡的元素不是全部都為枚舉值
enumSet = EnumSet.copyOf(c); // ②
System.out.println(enumSet);
}
}
2 運作結果
[SPRING, FALL]
Exception in thread "main" java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Enum
at java.util.EnumSet.copyOf(Unknown Source)
at EnumSetTest2.main(EnumSetTest2.java:21)
3 代碼說明
當試圖複制一個Collection集合裡的元素來建立EnumSet集合時,必須保證Collection集合裡的所有元素都是同一個枚舉類的枚舉值。