Emum是在Java5中引入的新特性,从那开始,它被广泛的用在不同的Java应用中,相比于C和C++的Enum,Java的Enum功能更加强大。但是很多开发人员暂时还没意识到它的强大之处,在Enum的一些细节问题上把握的还不到位。Enum的特性及相关资料可以整理出一本书也不为过,这里简单对Enum做个大概。主要讲解以下几个方面。

Enum的介绍

Enum的特性

Enum的用法

Enum的一些面试题

Enum用法建议

什么是Enum

Enum是一个Java的关键字,用于表示一个固定的常用值。例如,每周的天数,每年的月数等。Enum是一种类型,就像Class和Interface可以用于定义一系列的Enum常量

Enum的特性

Enum常量隐式的加上了static和final,一旦被创建就无法修改

Enum提供了是类型安全的(type-safe)

Enum隐式的加上了values()方法,返回一个数组包含所有的Enum常量

两个Enum常量可以使用 ==或equals()方法比较

Enum可以用在switch语句中,就像int,String。

Enum有自己的名称空间

Enum可以实现Java接口

可以在Enum中定义构造器

Enum的用法

1 . Enum的声明,Enum可以声明在一个类之外或者在类内部,但是不能在方法中。

// 外部声明Enum

enum Color {

RED,GREEN,BLUE;

}

public class Test

{

public static void main(String[] args)

{

Color c1 = Color.RED;

System.out.println(c1);

}

}

//内部声明Enum

public class Test

{

enum Color

{

RED, GREEN, BLUE;

}

public static void main(String[] args)

{

Color c1 = Color.RED;

System.out.println(c1);

}

}

2 . 在创建Enum常量的时候可以指定值,但是这个时候你需要定义一个成员变量构造器。构造器必须是private的,不然会报编译错误。

public enum Currency {

PENNY(1), NICKLE(5), DIME(10), QUARTER(25);

private int value;

private Currency(int value) {

this.value = value;

}

}

3 . 使用==或equals比较两个enum

因为enum对象都是继承自Enum类的,可以看到Enum中的equals方法为。

建议使用==方法,直接比较应该比调用方法的速度更快一些。另外==号还能防止NullPointerException

public final boolean equals(Object other) {

return this==other;

}

4 . 对Enum进行排序的时候,使用compareTo方法。

public final int compareTo(E o) {

Enum> other = (Enum>)o;

Enum self = this;

if (self.getClass() != other.getClass() && // optimization

self.getDeclaringClass() != other.getDeclaringClass())

throw new ClassCastException();

return self.ordinal - other.ordinal;

}

5 .有两个新的集合类EnumMap和EnumSet ,他们两个是对Set和Map的高性能实现,当有机会使用它们的时候,尽量使用它们。

Enum面试问题

说说Enum的继承

所有的enums隐式的extend了java.lang.Enum类,因为一个类只能extend一个父亲,所以enum不能extend其它的类。

但是Enum可以实现许多接口

Enum的values,ordinal,valueOf方法

enums默认有values(),ordinal()和valueOf()方法。

values()方法返回所有在enum中定义的常量值,以数组形式返回。

ordinal()方法返回每个常量的索引下标,就像数组的下标

valueOf()方法传入字符串参数,如果enum中存在对应字符串的常量值,则返回对应的enum常量

// 案例代码

enum Color

{

RED, GREEN, BLUE;

}

public class EnumLearn

{

public static void main(String[] args)

{

Color arr[] = Color.values();

for (Color col : arr)

{

System.out.println(col + " at index "

+ col.ordinal());

}

System.out.println(Color.valueOf("RED"));

}

}

//输出

RED at index 0

GREEN at index 1

BLUE at index 2

RED

3 . Enum的构造器特性

enum可以有构造器方法,它的构造器方法会在enum类型加载的时候,按常量的个数顺序的执行

我们不能直接创建enum对象,因此我们也不能直接调用enum的构造器方法,构造器方法必须是private的

//案例代码

enum AccountType implements Serializable,Cloneable

{

SAVING, FIXED, CURRENT;

private AccountType()

{

System.out.println("It is a account type");

}

}

class EnumOne

{

public static void main(String[]args)

{

System.out.println(AccountType.FIXED);

}

}

//输出结果

It is a account type

It is a account type

It is a account type

FIXED

4 . Enum的单例模式优缺点

参考《Effitive Java》,优点大于缺点,因为enum是线程安全的,因此我们无需考虑单例模式的双重检查。主要原因:

enum的单例模式简单

enum是线程安全的

enum的单例模式自己处理序列化 *

// Enum的单例模式 VS 传统双重检查的单例模式

//单例模式,仅需使用一行代码.

// EasySingleton.INSTANCE,enum中也可以写其他方法

public enum EasySingleton{

INSTANCE;

}

//传统模式

public class DoubleCheckedLockingSingleton{

private volatile DoubleCheckedLockingSingleton INSTANCE;

private DoubleCheckedLockingSingleton(){}

public DoubleCheckedLockingSingleton getInstance(){

if(INSTANCE == null){

synchronized(DoubleCheckedLockingSingleton.class){

// 二次检查

if(INSTANCE == null){

INSTANCE = new DoubleCheckedLockingSingleton();

}

}

}

return INSTANCE;

}

}

5 . Enum的==和equals的区别。

前面有提到。

6 . 我们能使用构造方法创建enum实例吗?

不能,enum的构造方法必须是私有的。

Enum的用法建议

在能想到使用Enum的时候可以考虑使用Enum。

使用Enum代替定义的相关int类型常量

能用到EnumSet和EnumMap的时候使用它们,后面会再说明它们两个的用法

最后

看一些Java相关的面试题,发现Enum相关问题出现频率挺高的,在这里对enum用法做个整理。希望能帮助到大家

参考

c enum能像java一样吗_不一样的Java Enum相关推荐

  1. java python算法_用Python,Java和C ++示例解释的排序算法

    java python算法 什么是排序算法? (What is a Sorting Algorithm?) Sorting algorithms are a set of instructions t ...

  2. java 判断类型_如何快速入门Java编程学习(干货)

    一.初识Java 1.生活中的程序: 从起床到教室上课的过程 穿衣打扮>起床>洗漱>出宿舍>>吃早餐>到教室 按照特定的顺序去完成某一件事的过程我们叫做生活中的程序 ...

  3. 支持java虚拟主机_为何缺乏支持Java的虚拟主机

    现在很多站长们,都青睐于香港虚拟主机建站.现在常见的是asp和PHP的程序空间很多,但是Java的少之又少,下面小编我给大家聊一聊! 一.香港Java虚拟主机成本高 使用Java程序建站,就必须要用支 ...

  4. 做Java头发少_这35个Java代码优化细节,你用了吗

    链接:https://www.jianshu.com/p/6e472304b5ac 前言 代码 优化 ,一个很重要的课题.可能有些人觉得没用,一些细小的地方有什么好修改的,改与不改对于代码的运行效率有 ...

  5. 我的世java途径错误_我的世界JAVA路径错误的解决方法分享

    我的世界JAVA路径错误该怎么解决呢?JAVA是Minecraft运行的虚拟环境必要条件,需要您安装后才开始游戏.很多童鞋在安装过程中都遇到了JAVA路径错误的提示,这是什么原因导致的?第一手游网必须 ...

  6. java编程赋值运算符_跟我学java编程—简单赋值运算符“=”

    赋值运算符是双目运算符,用在赋值表达式中.赋值运算符将值存储在运算符左边操作数指定的变量中.有两种赋值操作,简单赋值和复合赋值,简单赋值把运算符右边的操作数的值存储在运算符左边操作数指定的变量中:复合 ...

  7. java session使用_使用Neo4j和Java进行大数据分析 第2部分

    本文的第一部分介绍了Neo4j及其Cypher查询语言.如果您已经阅读了第1部分,那么您已经了解了为什么Neo4j和其他图形数据库特别受社交图形或网络中用户之间关系建模的影响.您还在开发环境中安装了N ...

  8. java 异常信息_优雅的异常处理 -- Java中的异常

    处理异常自己处理 try-catch抛出让别人处理 throws 获得异常信息 直接打印异常对象 通过异常对象调用getMessage()方法获得 通过异常对象调用printStackTrace()方 ...

  9. java基础知识点_零基础学习Java语言,各个阶段需要掌握的知识点

    随社会的脚步的不断发展,Java技术在不断的与时俱进,这也是Java一直长盛不衰的原因之一.Java技术的学习,永远没有早晚之分,技不压身,对于21世纪的我们80后,90后,甚至00后,尤其适用! 那 ...

最新文章

  1. 在centos下启动nginx出现Failed to start nginx.service:unit not found
  2. python runner是什么_HttpRunner-01-初识
  3. 01_基于应用拆分的技术架构
  4. (error) LOADING Redis is loading the dataset in memory问题解决
  5. 修改bootstrap modal模态框的宽度
  6. JS三大经典变量命名法
  7. SDUT OJ 3403 数据结构实验之排序六:希尔排序
  8. 你真的会用Context么?
  9. 125KHz 100cm ID 读卡电路_NX系列PLC-NX-ID数字输入单元_欧姆龙继电器_欧姆龙PLC_欧姆龙接近开关...
  10. 拉普拉斯变换和Z变换表
  11. C/S、B/S架构模式的三层结构特点分析
  12. 二叉搜索树的删除操作详解,图文并茂,化繁为简
  13. python学而思和猿辅导哪个好_学而思和猿辅导哪个好,说说我的评价
  14. MySQL数据导出:ERROR 1 (HY000) 错误解决
  15. pytorch gpu版本安装
  16. python时间序列分解STL
  17. cmd 查看端口占用并且结束进程【建议收藏】
  18. python-docx结合lxml读取word文档段落格式、字体格式等信息
  19. 小红书流量不好数据差,怎么解决?
  20. 基本数据结构--字典和常用内置序列函数

热门文章

  1. 联合使用 HTML 5、地理定位 API
  2. Android之个性化ListView实现
  3. Apache/Tomcat/JBOSS/Nginx(2)
  4. 新的网站上线 linux视野
  5. Oracle 统计信息备份/表分析
  6. 这几天惨遭Delphi类型转换折磨,请问怎么把double转成int类型
  7. sql 查询上个月的数据_数据分析-SQL 进阶篇 多表查询
  8. oracle schema_oracle数据库全局统计更新
  9. mysql数据库的链接地址_常用数据库连接URL地址大全
  10. Java BufferedWriter close()方法与示例