java-枚举

枚举是一个被命名的整型常数的集合,用于声明一组带标识符的常数。枚举在曰常生活中很常见,例如一个人的性别只能是“男”或者“女”,一周的星期只能是 7 天中的一个等

声明枚举时必须使用 enum 关键字,然后定义枚举的名称、可访问性、基础类型和成员等。枚举声明的语法如下:

enum-modifiers enum enumname:enum-base {
    enum-body,
}
/*
格式:enum-modifiers enum enumname:enum-base { body }
enum-modifiers:枚举的修饰符:public private internal;
enumname:枚举的名字
enum-base 枚举的基础类型
enum-body 枚举的成员

特性:
任意两个枚举成员不能具有相同的名称
它的常数值必须在该枚举的基础类型的范围之内
多个枚举成员之间使用逗号分隔

注意:如果没有显式地声明基础类型的枚举,那么意味着它所对应的基础类型是 int
 */

可以通过枚举类型名直接引用常量

enum类

Java 中的每一个枚举都继承自 java.lang.Enum 类。当定义一个枚举类型时,每一个枚举类型成员都可以看作是 Enum 类的实例,这些枚举成员默认都被 final、public, static 修饰,当使用枚举类型成员时,直接使用枚举名称调用成员即可。

方法名称描述
values() 以数组形式返回枚举类型的所有成员
valueOf() 将普通字符串转换为枚举实例
compareTo() 比较两个枚举成员在定义时的顺序
ordinal() 获取枚举成员的索引位置

 

/*
通过调用枚举类型实例的 values( ) 方法可以将枚举的所有成员以数组形式返回,
也可以通过该方法获取枚举类型的成员。
 */
public class DemoTest1 {

    public enum Demoonwo {
        male,female,middle,nothing;

    }

    public static void main(String[] args) {
        System.out.println(Demoonwo.values());//因为返回的数组,所以打印出来的数组的地址
        System.out.println("############################");
        for (int i = 0; i < Demoonwo.values().length ;i++){
            System.out.println(Demoonwo.values()[i]);
        }
        System.out.println("############################");
//        获取一名成员: 枚举.valueOf
        System.out.println(Demoonwo.valueOf("male"));
        System.out.println("##########################");

//        获取成员的索引位置 要先获取到枚举成员才能得到索引位置
        System.out.println(Demoonwo.valueOf("male").ordinal());
        System.out.println(Demoonwo.valueOf("nothing").ordinal());
//
    }

}
/*
[Lquan.DemoTest1$Demoonwo;@4554617c
male
female
middle
nothing

 

枚举类可以添加方法和内置值:

enum WeekDay{
//    如果在枚举里面要设置值的话,每个枚举里面的值抽象到枚举里面的私有变量
//并且创建构造函数去初始化,同时给与get方法
    one("星期一",1),two("星期二",2),three("星期三",3),
    four("星期四",4),five("星期五",5);
    private final String day;
    protected final int dd;
    private WeekDay(String day,int dd) {
        this.day = day;
        this.dd = dd;
    }

    public String getDay() {
        return day;
    }

    public int getDd() {
        return dd;
    }
    @Override
//    重载打印的格式,不在是默认的格式
    public String toString() {
        return "WeekDay{" +
                "day='" + day + '\'' +
                ", dd=" + dd +
                '}';
    }
}
public class  DemoValueOf {
    public static void main(String[] args) {
        for(int i = 0; i < WeekDay.values().length -3;i++){
            System.out.println(WeekDay.values()[i]+":"
                    +WeekDay.values()[i].getDay()
                    +"---"+WeekDay.values()[i].getDd());
        }
        System.out.println("#####################");
        for (WeekDay wd: WeekDay.values()) {
            System.out.println(wd + "--"+wd.getDd()+"---"+wd.getDay());
        }
//  返回的是数组,所以是地址
        System.out.println(WeekDay.values());
//因为toString已经重写了,所以按格式打印
        for (WeekDay wd: WeekDay.values()) {
            System.out.println(wd);
        }
    }

}
/*
WeekDay{day='星期一', dd=1}:星期一---1
WeekDay{day='星期二', dd=2}:星期二---2
#####################
WeekDay{day='星期一', dd=1}--1---星期一
WeekDay{day='星期二', dd=2}--2---星期二
WeekDay{day='星期三', dd=3}--3---星期三
WeekDay{day='星期四', dd=4}--4---星期四
WeekDay{day='星期五', dd=5}--5---星期五
[Lquan.WeekDay;@1540e19d
WeekDay{day='星期一', dd=1}
WeekDay{day='星期二', dd=2}
WeekDay{day='星期三', dd=3}
WeekDay{day='星期四', dd=4}
WeekDay{day='星期五', dd=5}
 */

 

EnumMap 类

 

 

 

EnumSet 类

EnumSet 是枚举类型的高性能 Set 实现,它要求放入它的枚举常量必须属于同一枚举类型。

 

方法名称描述
allOf(Class<E> element type) 创建一个包含指定枚举类型中所有枚举成员的 EnumSet 对象
complementOf(EnumSet<E> s) 创建一个与指定 EnumSet 对象 s 相同的枚举类型 EnumSet 对象,
并包含所有 s 中未包含的枚举成员
copyOf(EnumSet<E> s) 创建一个与指定 EnumSet 对象 s 相同的枚举类型 EnumSet 对象,
并与 s 包含相同的枚举成员
noneOf(<Class<E> elementType) 创建指定枚举类型的空 EnumSet 对象
of(E first,e...rest) 创建包含指定枚举成员的 EnumSet 对象
range(E from ,E to) 创建一个 EnumSet 对象,该对象包含了 from 到 to 之间的所有枚
举成员
enum Demo {
    zore,one,two,three,four,five;

}

public class EnumSetDemo {
    public static void main(String[] args) {
//        指定枚举类型,创建所有枚举成员的集合
        EnumSet<Demo> ende = EnumSet.allOf(Demo.class);
        System.out.println(ende);//[zore, one, two, three, four, five]
//        指定枚举类型,创建空集合
        EnumSet<Demo> endtwo = EnumSet.noneOf(Demo.class);
        System.out.println(endtwo);//[]

//     创建包含指定枚举成员的 EnumSet 对象
        EnumSet<Demo> endthree = EnumSet.of(Demo.five,Demo.one);
        System.out.println(endthree);//[one, five]

//        创建一个 EnumSet 对象,该对象包含了 from 到 to 之间的所有枚举成员
        EnumSet<Demo> endfout = EnumSet.range(Demo.one,Demo.four);
        System.out.println(endfout);//[one, two, three, four]

    }
}

 

posted @ 2020-06-03 16:24  小丑quan  阅读(155)  评论(0)    收藏  举报