1.Java枚举的本质原理
Java枚举的本质原理是通过普通类来实现的,只是编译器为我们做了加工处理,每个枚举类型编译后的字节码实质都是继承自java.lang.Enum的枚举类型同名普通类,每个枚举变量实质是一个与枚举类型同名普通类的静态常量对象,所有枚举常量都通过静态代码块进行初始化实例赋值。如:
public enum Status {
START("a"),
RUNNING("b"),
private Status(String name) {
this.name = name;
}
private String name;
}
效果等同于:
public class Status {
public static final Status START;
public static final Status RUNNING;
static {
START = new Status("a");
RUNNING = new Status("b");
}
private Status(String name) {
this.name = name;
}
private String name;
}
2.枚举类的继承、被继承、实现接口问题
枚举类可以实现其他接口,但是不能继承其他的类,因为所有枚举类在编译后的字节码中都继承自 java.lang.Enum,因为Java没有多继承,所以不能继承其他的类;
枚举类也不能被其他类继承,因为所有枚举类在编译后的字节码中都是继承自 java.lang.Enum(由编译器添加)的 final class 类,final 的类是不允许被派生继承的。
3.Java枚举如何保证线程安全
因为 Java 类加载与初始化是 JVM 保证线程安全,而 Java enum 枚举在编译器编译后的字节码实质是一个 final 类,每个枚举类型是这个 final 类中的一个静态常量属性,其属性初始化是在该 final 类的 static 块中进行,而 static 的常量属性和代码块都是在类加载时初始化完成的,所以自然就是 JVM 保证了并发安全。
4.Java迭代器和枚举器的区别
(1)Enumeration<E>枚举器接口是JDK1.0提供的,适用于传统类,而Iterator<E>迭代器接口是JDK1.2提供的,适用于Collections;
(2)Enumeration 只有两个方法接口,我们只能读取集合的数据而不能对数据进行修改,而 Iterator 有三个方法接口,除了能读取集合的数据外也能对数据进行删除操作。
(3)Enumeration 不支持 fail-fast 机制,而 Iterator 支持 fail-fast 机制
现在尽量使用 Iterator 迭代器而不是 Enumeration 枚举器。