Java枚举类相关知识汇总

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 枚举器。

猜你喜欢

转载自blog.csdn.net/zai_xia/article/details/81835351