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

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/w372426096/article/details/84283981

什么是枚举?

解:

链接: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枚举是线程安全的

猜你喜欢

转载自blog.csdn.net/w372426096/article/details/84283981
今日推荐