枚举|Java基础

109 阅读2分钟

这是我参与8月更文挑战的第15天,活动详情查看:8月更文挑战

介绍

  在数学和计算机科学理论中,一个集的枚举是列出某些有穷序列集的所有成员的程序,或者是一种特定类型对象的计数。这两种类型经常(但不总是)重叠。 是一个被命名的整型常数的集合,枚举在日常生活中很常见,例如表示星期的SUNDAY、MONDAY、TUESDAY、WEDNESDAY、THURSDAY、FRIDAY、SATURDAY就是一个枚举。

public enum WeekDay {
    SUNDAY,
    MONDAY,
    TUESDAY,
    WEDNESDAY,
    THURSDAY,
    FRIDAY,
    SATURDAY
}

枚举的特性

  enum枚举这个类比较有意思,当你创建完enum后,编译器会自动帮你生产toString(),能够方便显示enum实例的具体名称是什么。除了toString()之外患有ordinal(),这个方法用于表示enum常量的声明顺序,以及values()显示顺序的值。

public class Client {
    public static void main(String[] args) {
        for (WeekDay value : WeekDay.values()) {
            System.out.println(value + ", ordinal = " + value.ordinal());
        }
    }
}

输出

image.png

  enum可以进行静态导包,静态导入包可以做到不用输入枚举类名.常量,可以直接使用常量。

package com.shixf;
import static com.shixf.WeekDay.*;
public class Client {
    public static void main(String[] args) {
        WeekDay monday = MONDAY;
    }
}

  所有枚举类都是ENUM的子类,无需我们使用extends来继承。这说明Enum中的方法所有枚举类都拥有。

int compareTo(E e):比较两个枚举常量谁大谁小,其实比较的就是枚举常量在枚举类中声明的顺序,例如FRONT的下标为0,BEHIND下标为1,那么FRONT小于BEHIND;

boolean equals(Object o):比较两个枚举常量是否相等;

int hashCode():返回枚举常量的hashCode;

String name():返回枚举常量的名字;

int ordinal():返回枚举常量在枚举类中声明的序号,第一个枚举常量序号为0;

String toString():把枚举常量转换成字符串;

static T valueOf(Class enumType, String name):把字符串转换成枚举常量。

枚举与普通类

枚举和普通类一样,除了在枚举中能方便快捷定义常量

public enum WeekDay {
    SUNDAY,
    MONDAY,
    TUESDAY,
    WEDNESDAY,
    THURSDAY,
    FRIDAY,
    SATURDAY;

    String str;

    WeekDay() {
    }

    public String getStr() {
        return str;
    }

    public void setStr(String str) {
        this.str = str;
    }

    public static void main(String[] args) {
        WeekDay wednesday = WeekDay.WEDNESDAY;
        wednesday.setStr("123");
        System.out.println(wednesday.getStr());
    }
}

注意枚举是不可以通过new 关键字实例化的,因为它的构造方法默认是private修饰的 image.png

EnumSet和EnumMap

  • EnumSet是JDK1.5引入的,EnumSet的实际充分考虑到速度因素,EnumSet可以作为Enum的替代者,效率高。
  • EnumMap是一种特殊的map,他要求key来自一个enum。因为在EnumMap速度也很快,我们可以使用EnumMap作为key的快速查找。