这是我参与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());
}
}
}
输出
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修饰的
EnumSet和EnumMap
- EnumSet是JDK1.5引入的,EnumSet的实际充分考虑到速度因素,EnumSet可以作为Enum的替代者,效率高。
- EnumMap是一种特殊的map,他要求key来自一个enum。因为在EnumMap速度也很快,我们可以使用EnumMap作为key的快速查找。