一文弄懂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:

    @Test
public 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);
else
return 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. 一文弄懂神经网络中的反向传播法——BackPropagation【转】

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

  2. 一文弄懂-Netty核心功能及线程模型

    目录 一. Netty是什么? 二. Netty 的使用场景 三. Netty通讯示例 1. Netty的maven依赖 2. 服务端代码 3. 客户端代码 四. Netty线程模型 五. Netty ...

  3. 一文弄懂-《Scalable IO In Java》

    目录 一. <Scalable IO In Java> 是什么? 二. IO架构的演变历程 1. Classic Service Designs 经典服务模型 2. Event-drive ...

  4. 一文弄懂-BIO,NIO,AIO

    目录 一文弄懂-BIO,NIO,AIO 1. BIO: 同步阻塞IO模型 2. NIO: 同步非阻塞IO模型(多路复用) 3.Epoll函数详解 4.Redis线程模型 5. AIO: 异步非阻塞IO ...

  5. 一文弄懂CGAffineTransform和CTM

    一文弄懂CGAffineTransform和CTM 一些概念 坐标空间(系):视图(View)坐标空间与绘制(draw)坐标空间 CTM:全称current transformation matrix ...

  6. 【TensorFlow】一文弄懂CNN中的padding参数

    在深度学习的图像识别领域中,我们经常使用卷积神经网络CNN来对图像进行特征提取,当我们使用TensorFlow搭建自己的CNN时,一般会使用TensorFlow中的卷积函数和池化函数来对图像进行卷积和 ...

  7. 一文弄懂Pytorch的DataLoader, DataSet, Sampler之间的关系

    以下内容都是针对Pytorch 1.0-1.1介绍. 很多文章都是从Dataset等对象自下往上进行介绍,但是对于初学者而言,其实这并不好理解,因为有的时候会不自觉地陷入到一些细枝末节中去,而不能把握 ...

  8. 一文弄懂js的执行上下文与执行上下文栈

    目录 执行上下文与执行上下文栈 变量提升与函数提升 变量提升 函数提升 变量提升与函数提升的优先级 变量提升的一道题目引出var关键字与let关键字各自的特性 执行上下文 全局执行上下文 函数(局部) ...

  9. 一文弄懂pytorch搭建网络流程+多分类评价指标

    讲在前面,本来想通过一个简单的多层感知机实验一下不同的优化方法的,结果写着写着就先研究起评价指标来了,之前也写过一篇:https://www.cnblogs.com/xiximayou/p/13700 ...

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

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

随机推荐

  1. 项目实战:Qt + 树莓派3B+ 智能笔筒系统

    红胖子(红模仿)的博文大全:开发技术集合(包含Qt实用技术.树莓派.三维.OpenCV.OpenGL.ffmpeg.OSG.单片机.软硬结合等等)持续更新中-(点击传送门)   需求   1.基于树莓 ...

  2. kafka节点故障恢复原理

    Kafka的LEO和HW LEO LEO是Topic每一个副本的最后的偏移量offset+1 HW(高水位线) High WaterMark是所有副本中,最小的LEO Follower副本所在节点宕机 ...

  3. 【Azure 媒体服务】使用编码预设文件(Preset.json)来自定义编码任务 -- 创建视频缩略图

    问题描述 在Azure门户上创建Transform Encoding时候,只能选择 Built-in Preset 编码方式(如:H265ContentAwareEncoding) 在创建编码任务时, ...

  4. 【Azure 环境】Azure门户中 Metrics 图表的聚合指标每项具体代表什么意思呢?

    问题描述 下图中,指标里的每项聚合指标具体代表什么呢? 问题解答 Azure Metrics 指标中提供了五种基本的聚合类型. Sum - 在聚合间隔内捕获的所有值的总和. 有时称为总聚合. Coun ...

  5. 详解 nebula 2.0 性能测试和 nebula-importer 数据导入调优

    这是由社区用户--繁凡撰写的一篇他的实践分享,主要讲解如何进行 Nebula 性能测试以及数据导入部分的性能调优.下文中出现的"我"代指用户繁凡. 0. 概要 之前在做 Nebul ...

  6. 李宏毅2022机器学习HW4 Speaker Identification上(Dataset &Self-Attention)

    Homework4 Dataset介绍及处理 Dataset introduction 训练数据集metadata.json包括speakers和n_mels,前者表示每个speaker所包含的多条语 ...

  7. Java 理解“万事万物皆对象”+ 匿名对象的使用

    1 /** 2 * 3 * @Description 4 * @author Bytezero·zhenglei! Email:420498246@qq.com 5 * @version 6 * @d ...

  8. SQL之 数据库表字段约束与索引

    第三范式 MySQL四种字段约束 主键约束 非空约束 唯一约束 创建索引 添加和删除索引

  9. Find The Multiple 题解

      Find The Multiple The long-lost Sunday is coming again, and the ACM Laboratory Elimination Competi ...

  10. 阿里巴巴/1688 api接口 获取商品详情 数据采集

    iDataRiver平台 https://www.idatariver.com/zh-cn/ 提供开箱即用的阿里巴巴1688电商数据采集API,供用户按需调用. 接口使用详情请参考阿里巴巴1688接口 ...