文章目录

  • 一、枚举类型
  • 二、switch 操作
  • 三、自定义枚举类
  • 四、相关枚举类
    • 4.1 EnumMap 枚举型映射/字典
    • 4.2 EnumSet 枚举集合

一、枚举类型

/*** @author zhangys* @description* @date 2020/4/15*/
public class EnumTest {enum Day {SUNDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY}public static void main(String[] args) {System.out.println(Day.SUNDAY);System.out.println(TestEnum.VALUE1);}
}enum TestEnum {VALUE1, VALUE2
}
//输出
SUNDAY
VALUE1

二、switch 操作

enum 支持 switch 操作。

/*** @author zhangys* @description* @date 2020/4/15*/
public class EnumTest {enum Day {SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY}public static void main(String[] args) {Day today = Day.WEDNESDAY;switch (today) {case MONDAY:System.out.println(Day.MONDAY);break;case TUESDAY:System.out.println(Day.TUESDAY);break;case WEDNESDAY:System.out.println(Day.WEDNESDAY);break;case THURSDAY:System.out.println(Day.THURSDAY);break;case FRIDAY:System.out.println(Day.FRIDAY);break;case SATURDAY:System.out.println(Day.SATURDAY);break;case SUNDAY:System.out.println(Day.SUNDAY);break;}}
}//enum TestEnum {//    VALUE1, VALUE2
//}

三、自定义枚举类

可以通过定制 Enum 类型来定义自己的枚举类。需要注意的是枚举类型的构造函数是私有的 private,所以不能通过 New 来创建枚举类型,正因如此才保证了枚举数据类型的安全,不会被更改。如:定义一个 Day enum 类型:

/*** @author zhangys* @date 2020/4/15*/
public enum Day {SUNDAY(7, "周日"), MONDAY(1, "周一"), TUESDAY(2, "周二"),WEDNESDAY(3, "周三"), THURSDAY(4, "周四"), FRIDAY(5, "周五"),SATURDAY(6, "周六");private Integer code;private String name;Day(Integer code, String name) {this.code = code;this.name = name;};public Integer getCode() {return code;}public String getName() {return name;}
}

测试

/*** @author zhangys* @description* @date 2020/4/15*/
public class EnumTest {public static void main(String[] args) {Day today = Day.WEDNESDAY;switch (today) {case MONDAY:System.out.println(Day.MONDAY.getName());break;case TUESDAY:System.out.println(Day.TUESDAY.getName());break;case WEDNESDAY:System.out.println(Day.WEDNESDAY.getName());break;case THURSDAY:System.out.println(Day.THURSDAY.getName());break;case FRIDAY:System.out.println(Day.FRIDAY.getName());break;case SATURDAY:System.out.println(Day.SATURDAY.getName());break;case SUNDAY:System.out.println(Day.SUNDAY.getName());break;}}
}
//结果
周三

四、相关枚举类

4.1 EnumMap 枚举型映射/字典

EnumMap 是对 Map 接口的实现类,其 key-value 映射中的 key 是 Enum 类型,其原理是一个对象数组,数组的下标索引就是根据 Map 中的 key 直接获取(即枚举中的 ordinal 值),数组长度就是枚举类成员个数;当 key 为枚举类型时其效率比 HashMap 高,因为可以直接获取数组下标索引访问到元素;此外 EnumMap 是保证顺序的,输出是按照 key 在枚举中的顺序来确定的。

EnumMap 的构造方法

//需要传递一个类型信息,因为没有这个类信息就不知道具体的枚举类是什么,
// 也就无法初始化内部的数据结构。public EnumMap(Class < K > keyType)
// 其他构造方法。public EnumMap(EnumMap < K, ? extends V > m ) public EnumMap(Map < K, ? extends V > m )

EnumMap 的实现原理

EnumMap 的实现原理依赖内部两个长度相同的数组,一个表示所有可能的键,一个表示对应的值,当放入 key-value 时首先会检查键的类型,如果类型不对会抛出异常,否则调用 key 的 ordinal 获取索引 index,并将值 value 放入值数组 vals[index] 中(注意:如果值 value 为 null,则为了区别真正的 null 与没有值,EnumMap 会将 null 值包装成一个特殊的对象)。

其构造方法主要就是在初始化相关数组,如下:

        public class EnumMap<K extends Enum<K>, V> extends AbstractMap<K, V> implements java.io.Serializable, Cloneable {//key键的具体枚举类型private final Class<K> keyType;// key的所有枚举值private transient K[] keyUniverse;// EnumMap的存储实现,仅仅为一个枚举成员个数长度的数组 private transient Object[] vals;......// 构造方法public EnumMap(Class<K> keyType) {// key的枚举类型赋值this.keyType = keyType;// 获取枚举类的所有枚举值存入数组缓存使用keyUniverse = getKeyUniverse(keyType);// 实例化枚举值个数长度的数组 vals = new Object[keyUniverse.length];}......}

测试

import java.util.EnumMap;
import java.util.HashMap;
import java.util.Map;/*** @author zhangys* @description* @date 2020/4/15*/
public class EnumMapTest {public static void main(String[] args) {EnumMap<Day,String> enumMap = new EnumMap<Day, String>(Day.class);enumMap.put(Day.WEDNESDAY,"今天是周三");Map<Day,String> map = new HashMap<>();map.put(Day.WEDNESDAY,"今天是周三");System.out.println("enumMap:"+enumMap.get(Day.WEDNESDAY));System.out.println("map:"+map.get(Day.WEDNESDAY));}
}

4.2 EnumSet 枚举集合

EnumSet 是个抽象类,不能实例化,查看源码发现有提供静态实例化 JumboEnumSet 或 RegularEnumSet 对象的方法。这两个对象继承自 EnumSet,区别在于 EnumSet 大小,大于 64 时创建的是 JumboEnumSet 对象,小于 64 时创建的是 RegularEnumSet 对象。

import java.util.EnumMap;
import java.util.EnumSet;
import java.util.HashMap;
import java.util.Map;/*** @author zhangys* @description* @date 2020/4/15*/
public class EnumMapTest {public static void main(String[] args) {EnumSet<Day> enumSet = EnumSet.noneOf(Day.class);enumSet.add(Day.WEDNESDAY);enumSet.add(Day.MONDAY);System.out.println(enumSet.toString());for (Day day:enumSet){System.out.println("code:" + day.getCode()+"name:"+day.getName());}enumSet.clear();System.out.println(enumSet);}
}
//输出
[MONDAY, WEDNESDAY]
code:1name:周一
code:3name:周三
[]

EnumSet 是非线程安全的,要想线程安全使用 Collections.synchronizedSet() 处理 numSet 对象,如:

Set<Day> enumSet = Collections.synchronizedSet(EnumSet.noneOf(Day.class));

java枚举类型及枚举集合相关推荐

  1. ef 在此上下文中只支持基本类型或枚举类型_Java枚举不应该成为你成功路上得绊脚石,源码给你讲解清楚

    现在在面试的过程中,基础得东西占的比重越来越高,尤其是对于Java底层得一些东西,比方说今天得内容---枚举,单纯说这些知识点其实并不难,甚至在日常得工作中用到的都不算多,但是,在面试的过程中会问到你 ...

  2. 深度分析 Java 的枚举类型:枚举的线程安全性及序列化问题(转)

    写在前面: Java SE5 提供了一种新的类型 Java的枚举类型,关键字 enum 可以将一组具名的值的有限集合创建为一种新的类型,而这些具名的值可以作为常规的程序组件使用,这是一种非常有用的功能 ...

  3. 深度分析 Java 的枚举类型:枚举的线程安全性及序列化问题

    本文作者: 伯乐在线 - HollisChuang .未经作者许可,禁止转载! 欢迎加入伯乐在线 专栏作者. 写在前面: Java SE5 提供了一种新的类型 Java的枚举类型,关键字 enum 可 ...

  4. java 枚举类型_java 枚举类型(翻译自Java Tutorials)

    枚举类型,它是字段包含固定数量的常量的类型.常见的例子,罗盘的方向包括东西南北,还有星期的天. 因为他们是常量,所有枚举类型的字段的名字一般是大写字母. java编程语言,声明一个枚举类型使用enum ...

  5. Java中的枚举类型与枚举实现接口的两种方式

    枚举的构造 若某事物的取值只有有限个,可以一个个罗列出来,则这个列举出来的类型就叫做枚举类型. (1)使用public static 修饰的方法构造枚举 public class Size {priv ...

  6. python 枚举类型_Python枚举类

    本篇主要介绍Python中枚举类的用法,更多内容请参考:Python学习指南 当我们需要定义常量时,一个办法就是用大写变量通过整数来定义,例如月份: JAN = 1 FEB = 2 MAR = 3 · ...

  7. 枚举类型、枚举名称、枚举值

    先看一个枚举类: from enum import Enum class Color(Enum):YELLOW = 1GREEN = 2BLACK = 3RED = 4print(Color.GREE ...

  8. java_枚举类型(支付方式枚举)

    package experiment7.exp1; /*支付方式有Cash(现金).WeChatPay(微信).Alipay(支付宝).BankCard(银行卡).CreditCard(信用卡)五种, ...

  9. desc 枚举类型id_枚举系列(四):实现接口的枚举类

    枚举类也可以实现一个或者多个接口.与普通实现一个或者多个接口完全一样,枚举类实现一个或者多个接口时,也需要实现该接口所包含的方法.下面程序定义了一个GenderDesc接口. public inter ...

最新文章

  1. 研究生导师为什么喜欢问学生家境?我帮你们问了几个导师
  2. C语言实现djikstra算法(附完整源码)
  3. lnmp pathinfo问题
  4. 《鸟哥的Linux私房菜--基础篇》学习
  5. android 存储不被垃圾清理,手机内存足够大,就不需要清理垃圾了?你错了!
  6. 直接内存与元空间_深入浅出 JVM 内存管理
  7. IOS微信API异常:unrecognized selector sent to instance 0x17005c9b0'
  8. Linux如何安装iperf软件,Linux 下网络性能测试工具 iperf 的安装和使用
  9. 机器学习方法_机器学习大拿253页新书:可解释机器学习方法的局限籍(附下载)...
  10. 提款机转账多久到账?
  11. centos7本地安装mysql_centos7安装mysql
  12. 第四章:FLASK结构拆分和循环引入问题
  13. Velocity笔记(上)
  14. 等级保护第三级安全扩展要求笔记(2019)
  15. winform DevComponents.DotNetBar2 添加到工具栏方法
  16. 颜色代码表(#号开头)
  17. 无法定位序数XX于动态链接库XX.dll的解决的方法
  18. iOS12适配适配iPhone XR/iPhone XS Max
  19. php死循浏览器卡死,Win10 Edge浏览器假死解决方案
  20. Python语言程序设计基础_期末作品设计_答案_通识教育必修课程_上海师范大学

热门文章

  1. [编程基础] Python命令行解析库argparse学习笔记
  2. orcal复习及作业
  3. GDB调试器——GDB调试器简介
  4. 同惠TH9310耐压测试仪应用举例
  5. Java Swing图书管理系统桌面软件附源码
  6. sql按客户号累计求和并且排序
  7. mysql定时任务自动备份
  8. 如何做Code Review——读后感
  9. HTML中表格怎么制作
  10. 量化数值评估,查准率和召回率