天天看點

專為枚舉類設計的集合類EnumSet

一 集合類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集合裡的所有元素都是同一個枚舉類的枚舉值。