Java 菜鳥(niǎo)教程

Java 流程控制

Java 數(shù)組

Java 面向?qū)ο?I)

Java 面向?qū)ο?II)

Java 面向?qū)ο?III)

Java 異常處理

Java 列表(List)

Java Queue(隊(duì)列)

Java Map集合

Java Set集合

Java 輸入輸出(I/O)

Java Reader/Writer

Java 其他主題

Java EnumSet

在本教程中,我們將借助示例學(xué)習(xí)Java EnumSet類及其各種方法。

Java集合框架的EnumSet類提供了單個(gè)枚舉的元素的集合實(shí)現(xiàn)。

在學(xué)習(xí)EnumSet之前,請(qǐng)確保了解Java Enums。

它實(shí)現(xiàn)Set接口。

Java EnumSet類實(shí)現(xiàn)Java Set接口。

創(chuàng)建EnumSet

為了創(chuàng)建一個(gè)枚舉集,我們必須首先導(dǎo)入java.util.EnumSet包。

與其他集合實(shí)現(xiàn)不同,枚舉集合沒(méi)有公共構(gòu)造函數(shù)。我們必須使用預(yù)定義的方法來(lái)創(chuàng)建一個(gè)枚舉集。

1.使用allOf(Size)

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枚舉。

2.使用noneOf(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)建了空的枚舉集。

3.使用range(e1,e2)方法

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]

4.使用of()方法

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的方法

EnumSet類提供了一些方法,允許我們對(duì)枚舉集執(zhí)行各種元素。

將元素插入EnumSet

  • 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)EnumSet元素

要訪問(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è)元素

刪除EnumSet元素

  • 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é)。

為什么選擇EnumSet?

枚舉集提供了一種比其他set實(shí)現(xiàn)(如HashSet、TreeSet)更有效的存儲(chǔ)枚舉值的方法。

枚舉集僅存儲(chǔ)特定枚舉的枚舉值。 因此,JVM已經(jīng)知道該集合的所有可能值。

這就是為什么枚舉集在內(nèi)部被實(shí)現(xiàn)為位序列的原因。位指定元素是否出現(xiàn)在枚舉集中。

如果集合中存在該元素,則將其對(duì)應(yīng)的位打開(kāi)。

丰满人妻一级特黄a大片,午夜无码免费福利一级,欧美亚洲精品在线,国产婷婷成人久久Av免费高清