1. 枚举
枚举是一个引用类型
枚举是一个规定了取值范围的数据类型
1.1 示例
定义枚举使用 enum 关键字
- 枚举中必须包含常量,也可以包含属性、方法、私有构造方法
- 枚举常量必须放在前面,多个常量之前使用逗号隔开,最后的分号可写可不写
public enum SeasonEnum {
SPRING("spring", "春天"),
SUMMER,
AUTUMN,
WINTER;
private String code;
private String name;
// 构造方法是 private
SeasonEnum() {
}
SeasonEnum(String code, String name) {
this.code = code;
this.name = name;
}
}
枚举成员默认是final、public、static (可使用 SeasonEnum.SPRING 方式调用枚举成员)
每一个枚举类型成员都可以看作是枚举类的实例 (SeasonEnum.SPRING的类型也是SeasonEnum)
反编译看看 javap -p SeasonEnum.class
public final class SeasonEnum extends java.lang.Enum {
public static final SeasonEnum SPRING;
public static final SeasonEnum SUMMER;
public static final SeasonEnum AUTUMN;
public static final SeasonEnum WINTER;
// 编译器添加的 values() 和 valueOf(String)
public static SeasonEnum[] values();
public static SeasonEnum valueOf(java.lang.String);
static {};
}
- 枚举是 final 类型,无法被继承
- 所有用
enum
修饰的类继承自Enum
,由于 Java 的单继承,enum 类不能再继承其他类,但可以实现多接口
1.2 枚举与switch
public static void main(String[] args) {
// SeasonEnum.SPRING 看上去像是一个类,这里很容易混淆,实际是一个对象
SeasonEnum seasonEnum = SeasonEnum.SPRING;
switch (seasonEnum) {
case SPRING:
break;
case AUTUMN:
break;
case SUMMER:
break;
case WINTER:
break;
default:
System.out.println();
}
}
1.3 枚举实现接口
// 枚举类里不写属性,通过接口里的默认方法来访问mei ju
public enum SeasonEnum {
SPRING("spring", "春天"),
SUMMER,
AUTUMN,
WINTER;
SeasonEnum() {
}
SeasonEnum(String code, String name) {
}
}
2. 枚举的本质
- 枚举是一个 final 类,并继承 Enum 抽象类
- 枚举中常量是当前类型的静态常量
public abstract class Enum<E extends Enum<E>>
implements Comparable<E>, Serializable {
// Returns the name of this enum constant,
public final String name() {
return name;
}
}
3. 数据结构
3.1 EnumSet
- 枚举类型专用 Set 集合,EnumSet 中所有元素都必须是枚举类型
- RegularEnumSet < 64-bit (long)
- JumboEnumSet > 64-bit (long[])

3.2 EnumMap
- EnumMap作为枚举的专属的集合,其 Key 为Enum类型
- 类似于 HashMap

网友评论