在本教程中,我們將借助示例學(xué)習(xí)Java EnumSet類及其各種方法。
Java集合框架的EnumSet類提供了單個(gè)枚舉的元素的集合實(shí)現(xiàn)。
在學(xué)習(xí)EnumSet之前,請(qǐng)確保了解Java Enums。
它實(shí)現(xiàn)Set接口。
為了創(chuàng)建一個(gè)枚舉集,我們必須首先導(dǎo)入java.util.EnumSet包。
與其他集合實(shí)現(xiàn)不同,枚舉集合沒(méi)有公共構(gòu)造函數(shù)。我們必須使用預(yù)定義的方法來(lái)創(chuàng)建一個(gè)枚舉集。
allof()方法創(chuàng)建一個(gè)枚舉集,其中包含指定枚舉類型Size的所有值。 例如,
import java.util.EnumSet; class Main { //一個(gè)名為Size的枚舉 enum Size { SMALL, MEDIUM, LARGE, EXTRALARGE } public static void main(String[] args) { //使用allOf()創(chuàng)建一個(gè)EnumSet EnumSet<Size> sizes = EnumSet.allOf(Size.class); System.out.println("EnumSet: " + sizes); } }
輸出結(jié)果
EnumSet: [SMALL, MEDIUM, LARGE, EXTRALARGE]
注意聲明,
EnumSet<Size> sizes = EnumSet.allOf(Size.class);
在這里,Size.class表示我們創(chuàng)建的Size枚舉。
noneOf()方法創(chuàng)建一個(gè)空的枚舉集。例如,
import java.util.EnumSet; class Main { //一個(gè)名為Size的枚舉 enum Size { SMALL, MEDIUM, LARGE, EXTRALARGE } public static void main(String[] args) { // 使用noneOf()創(chuàng)建一個(gè)EnumSet EnumSet<Size> sizes = EnumSet.noneOf(Size.class); System.out.println("空EnumSet: " + sizes); } }
輸出結(jié)果
空EnumSet : []
在這里,我們創(chuàng)建了一個(gè)名為sizes的空枚舉。
注意:我們只能在上述程序中插入枚舉類型為Size的元素。 這是因?yàn)槲覀兪褂肧ize枚舉創(chuàng)建了空的枚舉集。
range()方法創(chuàng)建一個(gè)枚舉集,其中包含e1和e2之間枚舉的所有值,包括這兩個(gè)值。例如
import java.util.EnumSet; class Main { enum Size { SMALL, MEDIUM, LARGE, EXTRALARGE } public static void main(String[] args) { //使用range()創(chuàng)建一個(gè)EnumSet EnumSet<Size> sizes = EnumSet.range(Size.MEDIUM, Size.EXTRALARGE); System.out.println("EnumSet: " + sizes); } }
輸出結(jié)果
EnumSet: [MEDIUM, LARGE, EXTRALARGE]
of()方法創(chuàng)建一個(gè)包含指定元素的枚舉集。例如,
import java.util.EnumSet; class Main { enum Size { SMALL, MEDIUM, LARGE, EXTRALARGE } public static void main(String[] args) { //使用帶有單個(gè)參數(shù)的of() EnumSet<Size> sizes1 = EnumSet.of(Size.MEDIUM); System.out.println("EnumSet1: " + sizes1); EnumSet<Size> sizes2 = EnumSet.of(Size.SMALL, Size.LARGE); System.out.println("EnumSet2: " + sizes2); } }
輸出結(jié)果
EnumSet1: [MEDIUM] EnumSet2: [SMALL, LARGE]
EnumSet類提供了一些方法,允許我們對(duì)枚舉集執(zhí)行各種元素。
add() - 將指定的枚舉值插入到枚舉集中
addAll() - 將指定集合的所有元素插入集合
例如,
import java.util.EnumSet; class Main { enum Size { SMALL, MEDIUM, LARGE, EXTRALARGE } public static void main(String[] args) { //使用allOf()創(chuàng)建一個(gè)EnumSet EnumSet<Size> sizes1 = EnumSet.allOf(Size.class); //使用noneOf()創(chuàng)建一個(gè)EnumSet EnumSet<Size> sizes2 = EnumSet.noneOf(Size.class); //使用add方法添加元素 sizes2.add(Size.MEDIUM); System.out.println("EnumSet 使用 add()方法: " + sizes2); //使用addAll()方法 sizes2.addAll(sizes1); System.out.println("EnumSet 使用 addAll()方法: " + sizes2); } }
輸出結(jié)果
EnumSet 使用 add()方法: [MEDIUM] EnumSet 使用 addAll()方法: [SMALL, MEDIUM, LARGE, EXTRALARGE]
在上面的示例中,我們使用了addAll()方法將sizes1的枚舉集的所有元素插入到sizes2的枚舉集。
也可以使用addAll()將其他集合中的元素(如ArrayList,LinkedList等)插入到枚舉集中。 但是,所有集合都應(yīng)具有相同的枚舉類型。
要訪問(wèn)枚舉集的元素,我們可以使用iterator()方法。為了使用此方法,我們必須導(dǎo)入java.util.Iterator包。例如,
import java.util.EnumSet; import java.util.Iterator; class Main { enum Size { SMALL, MEDIUM, LARGE, EXTRALARGE } public static void main(String[] args) { //使用allOf()創(chuàng)建一個(gè)EnumSet EnumSet<Size> sizes = EnumSet.allOf(Size.class); Iterator<Size> iterate = sizes.iterator(); System.out.print("EnumSet: "); while(iterate.hasNext()) { System.out.print(iterate.next()); System.out.print(", "); } } }
輸出結(jié)果
EnumSet: SMALL, MEDIUM, LARGE, EXTRALARGE,
注意事項(xiàng):
hasNext() - 如果枚舉集中存在下一個(gè)元素,則返回true
next() - 返回枚舉集中的下一個(gè)元素
remove() - 從枚舉集中刪除指定的元素
removeAll() - 從枚舉集中刪除所有元素
例如,
import java.util.EnumSet; class Main { enum Size { SMALL, MEDIUM, LARGE, EXTRALARGE } public static void main(String[] args) { //使用allOf()創(chuàng)建EnumSet EnumSet<Size> sizes = EnumSet.allOf(Size.class); System.out.println("EnumSet: " + sizes); // 使用 remove() boolean value1 = sizes.remove(Size.MEDIUM); System.out.println("MEDIUM是否已刪除? " + value1); // 使用 removeAll() boolean value2 = sizes.removeAll(sizes); System.out.println("所有的元素都被移除了嗎? " + value2); } }
輸出結(jié)果
EnumSet: [SMALL, MEDIUM, LARGE, EXTRALARGE] MEDIUM是否已刪除? true 所有的元素都被移除了嗎? true
方法 | 描述 |
---|---|
copyOf() | 創(chuàng)建EnumSet副本 |
contains() | 在中搜索EnumSet指定的元素,并返回布爾結(jié)果 |
isEmpty() | 檢查是否EnumSet為空 |
size() | 返回EnumSet的大小 |
clear() | 從EnumSet中刪除所有元素 |
EnumSet類還實(shí)現(xiàn)了Cloneable和Serializable接口。
克隆接口(Cloneable)
它允許EnumSet類制作該類實(shí)例的副本。
可序列化的接口(Serializable)
每當(dāng)需要通過(guò)網(wǎng)絡(luò)傳輸Java對(duì)象時(shí),就需要將對(duì)象轉(zhuǎn)換為位或字節(jié)。這是因?yàn)镴ava對(duì)象無(wú)法通過(guò)網(wǎng)絡(luò)傳輸。
該Serializable接口允許類被序列化。這意味著Serializable可以將實(shí)現(xiàn)的類的對(duì)象轉(zhuǎn)換為位或字節(jié)。
枚舉集提供了一種比其他set實(shí)現(xiàn)(如HashSet、TreeSet)更有效的存儲(chǔ)枚舉值的方法。
枚舉集僅存儲(chǔ)特定枚舉的枚舉值。 因此,JVM已經(jīng)知道該集合的所有可能值。
這就是為什么枚舉集在內(nèi)部被實(shí)現(xiàn)為位序列的原因。位指定元素是否出現(xiàn)在枚舉集中。
如果集合中存在該元素,則將其對(duì)應(yīng)的位打開(kāi)。