一文弄懂EnumMap和EnumSet
文章目录
- 简介
- EnumMap
- 什么时候使用EnumMap
- EnumSet
- 总结
一文弄懂EnumMap和EnumSet
简介
一般来说我们会选择使用HashMap来存储key-value格式的数据,考虑这样的特殊情况,一个HashMap的key都来自于一个Enum类,这样的情况则可以考虑使用本文要讲的EnumMap。
EnumMap
先看一下EnumMap的定义和HashMap定义的比较:
public class EnumMap<K extends Enum<K>, V> extends AbstractMap<K, V>implements java.io.Serializable, Cloneable
public class HashMap<K,V> extends AbstractMap<K,V>implements Map<K,V>, Cloneable, Serializable
我们可以看到EnumMap几乎和HashMap是一样的,区别在于EnumMap的key是一个Enum。
下面看一个简单的使用的例子:
先定义一个Enum:
public enum Types {RED, GREEN, BLACK, YELLO
}
再看下怎么使用EnumMap:
@Testpublic void useEnumMap(){EnumMap<Types, String> activityMap = new EnumMap<>(Types.class);activityMap.put(Types.BLACK,"black");activityMap.put(Types.GREEN,"green");activityMap.put(Types.RED,"red");}
其他的操作其实和hashMap是类似的,我们这里就不多讲了。
什么时候使用EnumMap
因为在EnumMap中,所有的key的可能值在创建的时候已经知道了,所以使用EnumMap和hashMap相比,可以提升效率。
同时,因为key比较简单,所以EnumMap在实现中,也不需要像HashMap那样考虑一些复杂的情况。
EnumSet
跟EnumMap很类似,EnumSet是一个set,然后set中的元素都是某个Enum类型。
EnumSet是一个interface而不是一个类,要创建EnumSet类可以使用EnumSet提供的两个静态方法,noneOf和allOf。
先看一个noneOf:
public static <E extends Enum<E>> EnumSet<E> noneOf(Class<E> elementType) {Enum<?>[] universe = getUniverse(elementType);if (universe == null)throw new ClassCastException(elementType + " not an enum");if (universe.length <= 64)return new RegularEnumSet<>(elementType, universe);elsereturn new JumboEnumSet<>(elementType, universe);}
noneOf传入一个Enum类,返回一个空的Enum类型的EnumSet。
从上面的代码我们可以看到EnumSet有两个实现,长度大于64的时候使用JumboEnumSet,小有64的时候使用RegularEnumSet。
注意,JumboEnumSet和RegularEnumSet不建议直接使用,他是内部使用的类。
再看一下allOf:
public static <E extends Enum<E>> EnumSet<E> allOf(Class<E> elementType) {EnumSet<E> result = noneOf(elementType);result.addAll();return result;}
allOf很简单,先调用noneOf创建空的set,然后调用addAll方法将所有的元素添加进去。
总结
EnumMap和EnumSet对特定的Enum对象做了优化,可以在合适的情况下使用。
本文的例子https://github.com/ddean2009/learn-java-collections
欢迎关注我的公众号:程序那些事,更多精彩等着您!
更多内容请访问 www.flydean.com
一文弄懂EnumMap和EnumSet相关推荐
- 一文弄懂元学习 (Meta Learing)(附代码实战)《繁凡的深度学习笔记》第 15 章 元学习详解 (上)万字中文综述
<繁凡的深度学习笔记>第 15 章 元学习详解 (上)万字中文综述(DL笔记整理系列) 3043331995@qq.com https://fanfansann.blog.csdn.net ...
- 一文弄懂神经网络中的反向传播法
最近在看深度学习的东西,一开始看的吴恩达的UFLDL教程,有中文版就直接看了,后来发现有些地方总是不是很明确,又去看英文版,然后又找了些资料看,才发现,中文版的译者在翻译的时候会对省略的公式推导过程进 ...
- 一文弄懂各种loss function
有模型就要定义损失函数(又叫目标函数),没有损失函数,模型就失去了优化的方向.大家往往接触的损失函数比较少,比如回归就是MSE,MAE,分类就是log loss,交叉熵.在各个模型中,目标函数往往都是 ...
- 一文弄懂神经网络中的反向传播法——BackPropagation【转】
本文转载自:https://www.cnblogs.com/charlotte77/p/5629865.html 一文弄懂神经网络中的反向传播法--BackPropagation 最近在看深度学习的东 ...
- 一文弄懂String的所有小秘密
文章目录 简介 String是不可变的 传值还是传引用 substring() 导致的内存泄露 总结 一文弄懂String的所有小秘密 简介 String是java中非常常用的一个对象类型.可以说ja ...
- CAD2010 为了保护_一文弄懂,锂电池的充电电路,以及它的保护电路方案设计
原标题:一文弄懂,锂电池的充电电路,以及它的保护电路方案设计 锂电池特性 首先,芯片哥问一句简单的问题,为什么很多电池都是锂电池? 锂电池,工程师对它都不会感到陌生.在电子产品项目开发的过程中,尤其是 ...
- deque stack java_一文弄懂java中的Queue家族
简介 java中Collection集合有三大家族List,Set和Queue.当然Map也算是一种集合类,但Map并不继承Collection接口. List,Set在我们的工作中会经常使用,通常用 ...
- 一文弄懂Flink网络流控及反压
一文弄懂Flink网络流控及反压 1. 为什么需要网络流控? 2. 网络流控的实现:静态限速 3. 网络流控的实现:动态反馈/自动反压 3.1 案例一:Storm 反压实现 3.2 案例二:Spark ...
- 一文弄懂halcon例程:rim.hdev
一文弄懂halcon例程:rim.hdev 打怪的路上总是无聊的,但是也不能不打啊,我自己现在也在每天打怪升级呢.昨天就因为一个问题,我到视觉群问里面的大牛,结果,他不帮我解答,他不告诉我怎么解决就算 ...
最新文章
- always@( )列表里不能同时有电平敏感事件和边沿触发事件
- DM8168学习--引导顺序
- android 删除wifi文件在哪里设置,如何删除无线终端的无线配置文件
- 可蠕虫 DarkRadiation 勒索软件瞄准 Linux 和 Docker 实例
- 美国联邦政府2020财年网络安全预算分析:174亿美元如何分配?
- 动态代理和静态代理的区别_动态代理与静态代理
- gooflow的流程设计
- linux - find查找文件/grep搜索文件内容
- 揭开姓氏的秘密|为什么最古老的八个姓氏都是女字旁?
- Raspberry Pi
- Excel中常用技巧
- APP开发从需求到产品—APP产品经理成长日记
- 在线笔试神器~福利哟
- 【无法完成更新 正在撤销更改 请不要关闭你的计算机】更新失败解决方案
- 卡了一年的联通IPTV,能查的都查了,最后发现是电源的问题
- abap视图字段限制_创建表维护视图(SE54)
- CISSP 第十一章 安全运营
- mp4封装格式各box类型讲解及IBP帧计算
- Liang-GaRy啃linux书想吐(六)
- 电脑突然无法上网如何解决 如何重新启用以太网
热门文章
- Cloud Programming Simplified: A Berkerley View on Serverless Computing笔记
- 容斥原理应用(求1~r中有多少个数与n互素)
- EXE和SYS通信IOCTL方式
- Shell函数:Shell函数返回值、删除函数、在终端调用函数
- cocos2d-x游戏开发(二)开始菜单续
- python wav模块获取采样率, 采样点,声道,量化位数和时间
- SQL 学习最强刷题网站!
- Java 开发人员 2019 生态系统信息图
- 如果我是面试官,我会问你 Spring 那些问题?
- 力扣174. 地下城游戏