枚举简单例子

/*** @author shuliangzhao* @Title: Color* @ProjectName design-parent* @Description: TODO* @date 2019/6/12 22:35*/
public enum Color {YELLOW,RED,BLUE,PURPLE,BLACK;}
/*** @author shuliangzhao* @Title: ColorEnumTest* @ProjectName design-parent* @Description: TODO* @date 2019/6/12 22:37*/
public class ColorEnumTest {public static void main(String[] args) {Color color = Color.BLUE;switch (color) {case RED:System.out.println("红色");break;case BLUE:System.out.println("蓝色");break;case PURPLE:System.out.println("紫色");break;case BLACK:System.out.println("黑色");break;case YELLOW:System.out.println("黄色");break;default:System.out.println("蓝色");break;}}}

测试结果

image.png

Color枚举的本质就是一个类,编译器会自动为我们生成Color类,通过反编译得到该类如下:

final class Color extends Enum {//编译器为我们添加的静态的values()方法public static Color[] values(){return (Color[])$VALUES.clone();}//编译器为我们添加的静态的valueOf()方法,注意间接调用了Enum也类的valueOf方法public static Color valueOf(String s){return (Color)Enum.valueOf(com/sl/emun/Color, s);}//私有构造函数private Color(String s, int i){super(s, i);}//前面定义的7种枚举实例public static final Color YELLOW;public static final Color RED;public static final Color BLUE;public static final Color PURPLE;public static final Color BLACK;private static final Color $VALUES[];static{//实例化枚举实例YELLOW = new Color("YELLOW", 0);RED = new Color("RED", 1);BLUE = new Color("BLUE", 2);PURPLE = new Color("PURPLE", 3);BLACK = new Color("BLACK", 4);$VALUES = (new Color[] {YELLOW, RED, BLUE, PURPLE, BLACK});}
}

可以看出每个枚举类型颜色是该Color类的一个实例对象,该构成方式和单例模式有些类似,故可以用只有一个枚举类型的枚举作为单例模式,而且枚举的构造器由编译器管理安全性十分高,既可以防止反射破解也可以防止反序列破解。

EnumMap用法

/*** @author shuliangzhao* @Title: EnumMapTest* @ProjectName design-parent* @Description: TODO* @date 2019/6/12 22:49*/
public class EnumMapTest {public static void main(String[] args) {EnumMap<Color,String> enumMap = new EnumMap(Color.class);enumMap.put(Color.BLACK,"黑色");enumMap.put(Color.BLUE,"蓝色");System.out.println(enumMap);System.out.println(enumMap.get(Color.BLUE));}
}

运行结果

image.png

EnumMap put方法

public V put(K key, V value) {typeCheck(key);int index = key.ordinal();Object oldValue = vals[index];vals[index] = maskNull(value);if (oldValue == null)size++;return unmaskNull(oldValue);}

首先调用typeCheck检查键的类型,如果类型不对,会抛出异常。类型正确的话,调用ordinal获取索引index,并将值value放入值数组vals[index]中。EnumMap允许值为null,为了区别null值与没有值,EnumMap将null值包装成了一个特殊的对象,有两个辅助方法用于null的打包和解包,打包方法为maskNull,解包方法为unmaskNull。

get方法

public V get(Object key) {return (isValidKey(key) ?unmaskNull(vals[((Enum<?>)key).ordinal()]) : null);}

键有效的话,通过ordinal方法取索引,然后直接在值数组vals里找。isValidKey的代码与typeCheck类似,但是返回boolean值而不是抛出异常。

以上就是EnumMap的基本实现原理,内部有两个数组,长度相同,一个表示所有的键,一个表示对应的值,值为null表示没有该键值对,键都有一个对应的索引,根据索引可直接访问和操作其键和值,效率很高。

EnumSet

EnumSet这是一个用来操作Enum的集合,是一个抽象类,它有两个继承类:JumboEnumSet和RegularEnumSet。在使用的时候,需要确定枚举类型。它的特点也是速度非常快,为什么速度很快呢?因为每次add的时候,每个枚举值只占一个长整型的一位。
EnumSet.noneOf()方法创建一个空的set

public class EnumSetTest {public static void main(String[] args) {EnumSet<Color> enumSet = EnumSet.noneOf(Color.class);System.out.println(enumSet);enumSet.add(Color.BLUE);enumSet.add(Color.PURPLE);System.out.println(enumSet);}
}

运行结果

image.png

EnumSet.allOf()方法创建一个满的set

/*** @author shuliangzhao* @Title: EnumSetTest* @ProjectName design-parent* @Description: TODO* @date 2019/6/12 23:24*/
public class EnumSetTest {public static void main(String[] args) {/*EnumSet<Color> enumSet = EnumSet.noneOf(Color.class);System.out.println(enumSet);enumSet.add(Color.BLUE);enumSet.add(Color.PURPLE);System.out.println(enumSet);*/EnumSet<Color> enumSet = EnumSet.allOf(Color.class);System.out.println(enumSet);}
}

运行结果

image.png

EnumSet.range创建指定范围set

public class EnumSetTest {public static void main(String[] args) {/*EnumSet<Color> enumSet = EnumSet.noneOf(Color.class);System.out.println(enumSet);enumSet.add(Color.BLUE);enumSet.add(Color.PURPLE);System.out.println(enumSet);EnumSet<Color> enumSet = EnumSet.allOf(Color.class);System.out.println(enumSet);*/EnumSet<Color> enumSet = EnumSet.range(Color.YELLOW,Color.BLUE);System.out.println(enumSet);}
}

image.png

EnumSet.complementOf补集创建set

public class EnumSetTest {public static void main(String[] args) {/*EnumSet<Color> enumSet = EnumSet.noneOf(Color.class);System.out.println(enumSet);enumSet.add(Color.BLUE);enumSet.add(Color.PURPLE);System.out.println(enumSet);EnumSet<Color> enumSet = EnumSet.allOf(Color.class);System.out.println(enumSet);*/EnumSet<Color> enumSet = EnumSet.range(Color.YELLOW,Color.BLUE);System.out.println(enumSet);EnumSet<Color> enumSet1 = EnumSet.complementOf(enumSet);System.out.println(enumSet1);}
}

运行结果

image.png

EnumSet.copyOf复制创建set

public class EnumSetTest {public static void main(String[] args) {/*EnumSet<Color> enumSet = EnumSet.noneOf(Color.class);System.out.println(enumSet);enumSet.add(Color.BLUE);enumSet.add(Color.PURPLE);System.out.println(enumSet);EnumSet<Color> enumSet = EnumSet.allOf(Color.class);System.out.println(enumSet);EnumSet<Color> enumSet = EnumSet.range(Color.YELLOW,Color.BLUE);System.out.println(enumSet);EnumSet<Color> enumSet1 = EnumSet.complementOf(enumSet);System.out.println(enumSet1);*/EnumSet<Color> enumSet = EnumSet.range(Color.YELLOW,Color.BLUE);System.out.println(enumSet);EnumSet<Color> enumSet1 = EnumSet.copyOf(enumSet);System.out.println(enumSet1);}
}

运行结果

image.png

EnumSet.copyOf复制创建集合

public class EnumSetTest {public static void main(String[] args) {/*EnumSet<Color> enumSet = EnumSet.noneOf(Color.class);System.out.println(enumSet);enumSet.add(Color.BLUE);enumSet.add(Color.PURPLE);System.out.println(enumSet);EnumSet<Color> enumSet = EnumSet.allOf(Color.class);System.out.println(enumSet);EnumSet<Color> enumSet = EnumSet.range(Color.YELLOW,Color.BLUE);System.out.println(enumSet);EnumSet<Color> enumSet1 = EnumSet.complementOf(enumSet);System.out.println(enumSet1);EnumSet<Color> enumSet = EnumSet.range(Color.YELLOW,Color.BLUE);System.out.println(enumSet);EnumSet<Color> enumSet1 = EnumSet.copyOf(enumSet);System.out.println(enumSet1);*/List<Color> colors = new ArrayList<>();colors.add(Color.PURPLE);colors.add(Color.BLUE);colors.add(Color.BLUE);System.out.println(colors);EnumSet<Color> enumSet = EnumSet.copyOf(colors);System.out.println(enumSet);}
}

运行结果

image.png

注意:通过结果可以看出ArrayList内放置的元素可以重复,而EnumSet内放置的元素不重复。

枚举详解之EnumSet、EnumMap用法相关推荐

  1. greenDAO的使用详解---(5)greenDAO高级用法

    greenDAO的使用详解-(5)greenDAO高级用法 1.greenDao多表关联 一对一关联:使用@ToOne 注解关联对象,通过注解joinProperty参数来定义一个外键,下面是示例代码 ...

  2. Masonry自动布局详解一:基本用法

    Masonry自动布局详解一:基本用法 说到iOS自动布局,有很多的解决办法.有的人使用xib/storyboard自动布局,也有人使用frame来适配.对于前者,笔者并不喜欢,也不支持.对于后者,更 ...

  3. 单片机c语言中枚举,嵌入式开发-枚举详解---朱有鹏

    嵌入式开发-枚举详解 朱有鹏 1.枚举m 1.1.枚举是用来干嘛的? #include // 这个枚举用来表示函数返回值,ERROR表示错,RIGHT表示对 enum return_value { E ...

  4. design短语的用法总结_最新高中英语知识点详解之design的用法及常见短语

    英语的应用越来越广泛了,我们必须好好来学习英语知识.对此小学频道编辑为大家整理了最新高中英语知识点详解之design的用法及常见短语.详情如下: design的用法 n.设计;图案;构思 vt.设计; ...

  5. 结构体,联合体,枚举详解

    结构体,联合体,枚举详解 目录 结构体 联合体 枚举常量 1.结构体 在C语言中,系统已经提供了一些数据类型,比如float,int,double,char等,但是我们有时会需要更复杂的类型来描述一个 ...

  6. java 枚举使用例子_Java枚举详解及使用实例(涵盖了所有典型用法)

    在实际编程中,往往存在着这样的"数据集",它们的数值在程序中是稳定的,而且"数据集"中的元素是有限的. 例如星期一到星期日七个数据元素组成了一周的"数 ...

  7. python argv 详解_Python3 sys.argv[ ]用法详解

    sys.argv[]说白了就是一个从程序外部获取参数的桥梁,这个"外部"很关键,因为我们从外部取得的参数可以是多个,所以获得的是一个列表(list),也就是说sys.argv其实可 ...

  8. python中 的用法_详解python中@的用法

    python中@的用法 @是一个装饰器,针对函数,起调用传参的作用. 有修饰和被修饰的区别,@function作为一个装饰器,用来修饰紧跟着的函数(可以是另一个装饰器,也可以是函数定义). 代码1 结 ...

  9. java list详解_Java 中 list 用法案例详解

    LIST是个容器接口可以理解为动态数组,传统数组必须定义好数组的个数才可以使用,而容器对象无须定义好数组下标总数,用add()方法即可添加新的成员对象,他可以添加的仅仅只能为对象,不能添加基本数据类型 ...

最新文章

  1. 智能猫窝是如何诞生的?详解百度大脑的开放生态
  2. 软件BT是硬盘杀手?
  3. 科大星云诗社动态20210204
  4. 【LeetCode】深搜DFS(共85题)
  5. Hadoop之HDFS读写数据流程
  6. C++中事件机制的简洁实现
  7. springboot gateway post body 为空_Spring Boot常见属性以及问题总结
  8. XSS-Game Level 2
  9. 大数据架构师工作内容有哪些?
  10. asp.net下Response.ContentType类型汇总
  11. npy文件转换为txt文件
  12. 天猫魔盒android开发者模式,【当贝市场】天猫魔盒M16S开启远程调试模式教程
  13. bs 网站获取电子秤重量方案
  14. 北京最新城市总体规划草案
  15. 关于pdms中设备参数模板的更新PML代码
  16. AdMob广告变现:新增开屏广告
  17. 图像处理:基于cv2.inpaint()图像修补
  18. C# 生成带二维表头的Excel表
  19. mongodb 创建只读用户
  20. CP速配app v2.0.8.2

热门文章

  1. 组合模式_设计模式结构性:组合模式(CompositePattern)
  2. 数字信号处理学习笔记(五)|有限脉冲响应数字滤波器的设计
  3. 英语语法---主语详解
  4. 签约中国搜索,第四范式助力智慧媒体转型发展
  5. AI之matlab随笔(1)-数据类型,逻辑操作,数组,逻辑运算,异或,零向量或零矩阵
  6. 【机器学习】深度剖析 LightGBM vs XGBOOST 哪个更胜一筹
  7. 【深度学习】编写同时在PyTorch和Tensorflow上工作的代码
  8. 【资源】首发:徐亦达老师的机器学习课件及下载(中文目录)
  9. 解读:一种来自Facebook团队的大规模时间序列预测算法(附github链接)
  10. 数据分析必备工具书:Python官方中文文档