文章目录

  • 简介
  • 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相关推荐

  1. 一文弄懂元学习 (Meta Learing)(附代码实战)《繁凡的深度学习笔记》第 15 章 元学习详解 (上)万字中文综述

    <繁凡的深度学习笔记>第 15 章 元学习详解 (上)万字中文综述(DL笔记整理系列) 3043331995@qq.com https://fanfansann.blog.csdn.net ...

  2. 一文弄懂神经网络中的反向传播法

    最近在看深度学习的东西,一开始看的吴恩达的UFLDL教程,有中文版就直接看了,后来发现有些地方总是不是很明确,又去看英文版,然后又找了些资料看,才发现,中文版的译者在翻译的时候会对省略的公式推导过程进 ...

  3. 一文弄懂各种loss function

    有模型就要定义损失函数(又叫目标函数),没有损失函数,模型就失去了优化的方向.大家往往接触的损失函数比较少,比如回归就是MSE,MAE,分类就是log loss,交叉熵.在各个模型中,目标函数往往都是 ...

  4. 一文弄懂神经网络中的反向传播法——BackPropagation【转】

    本文转载自:https://www.cnblogs.com/charlotte77/p/5629865.html 一文弄懂神经网络中的反向传播法--BackPropagation 最近在看深度学习的东 ...

  5. 一文弄懂String的所有小秘密

    文章目录 简介 String是不可变的 传值还是传引用 substring() 导致的内存泄露 总结 一文弄懂String的所有小秘密 简介 String是java中非常常用的一个对象类型.可以说ja ...

  6. CAD2010 为了保护_一文弄懂,锂电池的充电电路,以及它的保护电路方案设计

    原标题:一文弄懂,锂电池的充电电路,以及它的保护电路方案设计 锂电池特性 首先,芯片哥问一句简单的问题,为什么很多电池都是锂电池? 锂电池,工程师对它都不会感到陌生.在电子产品项目开发的过程中,尤其是 ...

  7. deque stack java_一文弄懂java中的Queue家族

    简介 java中Collection集合有三大家族List,Set和Queue.当然Map也算是一种集合类,但Map并不继承Collection接口. List,Set在我们的工作中会经常使用,通常用 ...

  8. 一文弄懂Flink网络流控及反压

    一文弄懂Flink网络流控及反压 1. 为什么需要网络流控? 2. 网络流控的实现:静态限速 3. 网络流控的实现:动态反馈/自动反压 3.1 案例一:Storm 反压实现 3.2 案例二:Spark ...

  9. 一文弄懂halcon例程:rim.hdev

    一文弄懂halcon例程:rim.hdev 打怪的路上总是无聊的,但是也不能不打啊,我自己现在也在每天打怪升级呢.昨天就因为一个问题,我到视觉群问里面的大牛,结果,他不帮我解答,他不告诉我怎么解决就算 ...

最新文章

  1. always@( )列表里不能同时有电平敏感事件和边沿触发事件
  2. DM8168学习--引导顺序
  3. android 删除wifi文件在哪里设置,如何删除无线终端的无线配置文件
  4. 可蠕虫 DarkRadiation 勒索软件瞄准 Linux 和 Docker 实例
  5. 美国联邦政府2020财年网络安全预算分析:174亿美元如何分配?
  6. 动态代理和静态代理的区别_动态代理与静态代理
  7. gooflow的流程设计
  8. linux - find查找文件/grep搜索文件内容
  9. 揭开姓氏的秘密|为什么最古老的八个姓氏都是女字旁?
  10. Raspberry Pi
  11. Excel中常用技巧
  12. APP开发从需求到产品—APP产品经理成长日记
  13. 在线笔试神器~福利哟
  14. 【无法完成更新 正在撤销更改 请不要关闭你的计算机】更新失败解决方案
  15. 卡了一年的联通IPTV,能查的都查了,最后发现是电源的问题
  16. abap视图字段限制_创建表维护视图(SE54)
  17. CISSP 第十一章 安全运营
  18. mp4封装格式各box类型讲解及IBP帧计算
  19. Liang-GaRy啃linux书想吐(六)
  20. 电脑突然无法上网如何解决 如何重新启用以太网

热门文章

  1. Cloud Programming Simplified: A Berkerley View on Serverless Computing笔记
  2. 容斥原理应用(求1~r中有多少个数与n互素)
  3. EXE和SYS通信IOCTL方式
  4. Shell函数:Shell函数返回值、删除函数、在终端调用函数
  5. cocos2d-x游戏开发(二)开始菜单续
  6. python wav模块获取采样率, 采样点,声道,量化位数和时间
  7. SQL 学习最强刷题网站!
  8. Java 开发人员 2019 生态系统信息图
  9. 如果我是面试官,我会问你 Spring 那些问题?
  10. 力扣174. 地下城游戏