欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

【面试】枚举相关-这一篇全了解

程序员文章站 2022-07-12 23:14:20
...

什么是枚举?

解:

链接:Java的枚举类型用法介绍-HollisChuang's Blog

枚举是如何实现的?

解:

参考链接:深度分析Java的枚举类型—-枚举的线程安全性及序列化问题-HollisChuang's Blog

Java 枚举类比较用 == 还是 equals,有哪些区别?

解:

java 枚举值比较用 == 和 equals 方法没啥区别,两个随便用都是一样的效果。因为枚举 Enum 类的 equals 方法默认实现就是通过 == 来比较的;类似的 Enum 的 compareTo 方法比较的是 Enum 的 ordinal 顺序大小;类似的还有 Enum 的 name 方法和 toString 方法一样都返回的是 Enum 的 name 值。

Java 枚举类可以继承其他类(或实现其他接口)或者被其他类继承吗,为什么?

 解:

枚举类可以实现其他接口但不能继承其他类,因为所有枚举类在编译后的字节码中都继承自 java.lang.Enum,而 Java 不支持多继承,所以枚举类不可以继承其他类。 枚举类不可以被继承,因为所有枚举类在编译后的字节码中都是继承自 java.lang.Enum)的 final class 类,final 的类是不允许被派生继承的。

Java中的switch是如何对枚举进行支持的?

解:

Java 1.7 之前 switch 参数可用类型为 short、byte、int、char,枚举类型之所以能使用其实是编译器层面实现的,编译器会将枚举 switch 转换为类似 switch(s.ordinal()) { case Status.START.ordinal() } 形式,所以实质还是 int 参数类型,感兴趣的可以自己写个使用枚举的 switch 代码然后通过 javap -v 去看下字节码就明白了。

请使用枚举实现一个单例。

解:

public enum Singleton {
    INSTANCE;
    public void whateverMethod() {
    }
}

为什么枚举实现的单例比较受推崇?有哪些好处?

解:

参考:链接:为什么我墙裂建议大家使用枚举来实现单例。-HollisChuang's Blog

枚举的序列化是如何实现的?为什么枚举实现的单例不存在可能序列化破坏的问题。

解:

答案可以在Java Object Serialization Specification 中找到答案。其中专门对枚举的序列化做了规定。

大概意思就是:在序列化的时候Java仅仅是将枚举对象的name属性输出到结果中,反序列化的时候则是通过java.lang.Enum的valueOf方法来根据名字查找枚举对象。同时,编译器是不允许任何对这种序列化机制的定制的,因此禁用了writeObject、readObject、readObjectNoData、writeReplace和readResolve等方法。

普通的Java类的反序列化过程中,会通过反射调用类的默认构造函数来初始化对象。所以,即使单例中构造函数是私有的,也会被反射给破坏掉。由于反序列化后的对象是重新new出来的,所以这就破坏了单例。

但是,枚举的反序列化并不是通过反射实现的。所以,也就不会发生由于反序列化导致的单例破坏问题。

Java 枚举是如何保证线程安全的?

解:

enum反编译之后 是一个继承Enum类的public final class类(final保证不能被继承),类中的属性和方法都是static的 ,根据类的加载机制可知静态资源的初始化是线程安全的,所以java枚举是线程安全的

相关标签: 枚举