枚举详解之EnumSet、EnumMap用法
枚举简单例子
/*** @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用法相关推荐
- greenDAO的使用详解---(5)greenDAO高级用法
greenDAO的使用详解-(5)greenDAO高级用法 1.greenDao多表关联 一对一关联:使用@ToOne 注解关联对象,通过注解joinProperty参数来定义一个外键,下面是示例代码 ...
- Masonry自动布局详解一:基本用法
Masonry自动布局详解一:基本用法 说到iOS自动布局,有很多的解决办法.有的人使用xib/storyboard自动布局,也有人使用frame来适配.对于前者,笔者并不喜欢,也不支持.对于后者,更 ...
- 单片机c语言中枚举,嵌入式开发-枚举详解---朱有鹏
嵌入式开发-枚举详解 朱有鹏 1.枚举m 1.1.枚举是用来干嘛的? #include // 这个枚举用来表示函数返回值,ERROR表示错,RIGHT表示对 enum return_value { E ...
- design短语的用法总结_最新高中英语知识点详解之design的用法及常见短语
英语的应用越来越广泛了,我们必须好好来学习英语知识.对此小学频道编辑为大家整理了最新高中英语知识点详解之design的用法及常见短语.详情如下: design的用法 n.设计;图案;构思 vt.设计; ...
- 结构体,联合体,枚举详解
结构体,联合体,枚举详解 目录 结构体 联合体 枚举常量 1.结构体 在C语言中,系统已经提供了一些数据类型,比如float,int,double,char等,但是我们有时会需要更复杂的类型来描述一个 ...
- java 枚举使用例子_Java枚举详解及使用实例(涵盖了所有典型用法)
在实际编程中,往往存在着这样的"数据集",它们的数值在程序中是稳定的,而且"数据集"中的元素是有限的. 例如星期一到星期日七个数据元素组成了一周的"数 ...
- python argv 详解_Python3 sys.argv[ ]用法详解
sys.argv[]说白了就是一个从程序外部获取参数的桥梁,这个"外部"很关键,因为我们从外部取得的参数可以是多个,所以获得的是一个列表(list),也就是说sys.argv其实可 ...
- python中 的用法_详解python中@的用法
python中@的用法 @是一个装饰器,针对函数,起调用传参的作用. 有修饰和被修饰的区别,@function作为一个装饰器,用来修饰紧跟着的函数(可以是另一个装饰器,也可以是函数定义). 代码1 结 ...
- java list详解_Java 中 list 用法案例详解
LIST是个容器接口可以理解为动态数组,传统数组必须定义好数组的个数才可以使用,而容器对象无须定义好数组下标总数,用add()方法即可添加新的成员对象,他可以添加的仅仅只能为对象,不能添加基本数据类型 ...
最新文章
- 智能猫窝是如何诞生的?详解百度大脑的开放生态
- 软件BT是硬盘杀手?
- 科大星云诗社动态20210204
- 【LeetCode】深搜DFS(共85题)
- Hadoop之HDFS读写数据流程
- C++中事件机制的简洁实现
- springboot gateway post body 为空_Spring Boot常见属性以及问题总结
- XSS-Game Level 2
- 大数据架构师工作内容有哪些?
- asp.net下Response.ContentType类型汇总
- npy文件转换为txt文件
- 天猫魔盒android开发者模式,【当贝市场】天猫魔盒M16S开启远程调试模式教程
- bs 网站获取电子秤重量方案
- 北京最新城市总体规划草案
- 关于pdms中设备参数模板的更新PML代码
- AdMob广告变现:新增开屏广告
- 图像处理:基于cv2.inpaint()图像修补
- C# 生成带二维表头的Excel表
- mongodb 创建只读用户
- CP速配app v2.0.8.2
热门文章
- 组合模式_设计模式结构性:组合模式(CompositePattern)
- 数字信号处理学习笔记(五)|有限脉冲响应数字滤波器的设计
- 英语语法---主语详解
- 签约中国搜索,第四范式助力智慧媒体转型发展
- AI之matlab随笔(1)-数据类型,逻辑操作,数组,逻辑运算,异或,零向量或零矩阵
- 【机器学习】深度剖析 LightGBM vs XGBOOST 哪个更胜一筹
- 【深度学习】编写同时在PyTorch和Tensorflow上工作的代码
- 【资源】首发:徐亦达老师的机器学习课件及下载(中文目录)
- 解读:一种来自Facebook团队的大规模时间序列预测算法(附github链接)
- 数据分析必备工具书:Python官方中文文档