EnumMap

Java编程拾遗『EnumMap』 到本文为止,之前已经介绍过HashMap、TreeMap、LinkedHashMap,本篇文章介绍一下集合框架系列最后一种类型的Map——EnumMap。在之前的文章中,我曾介绍过Java API中枚举类的本质(Java编程拾遗『枚举类』),本文讲的EnumMap就是一种key为枚举类型的Map结构。EnumMap类的继承关系如下: Enum类继承了AbstractMap抽象类,在EnumM... 阅读详情

EnumMap是Map接口的一种实现,专门用于枚举类型的键,所有枚举的键必须来自同一个枚举

EnumMap不允许键为空,允许值为空

EnumMap成员变量

    private final Class<K> keyType;

    private transient K[] keyUniverse;

    private transient Object[] vals;

    private transient int size = 0;

    private static final Object NULL = new Object() {
    public int hashCode() {
        return 0;
    }
    public String toString() {
        return "java.util.EnumMap.NULL";
    }
};

其中有一个特别的数据类型它是Object实例NULL,用于取代真正的NULL值

下面是几个常用的方法源码解读

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);
}

EnumMap key必须来自同一个枚举,在向EnumMap存放数据的时候,首先进行类型检查

private void typeCheck(K key) {
    Class<?> keyClass = key.getClass();
    if (keyClass != keyType && keyClass.getSuperclass() != keyType)
        throw new ClassCastException(keyClass + " != " + keyType);
}

然后获取该枚举的索引值以该索引为vals数组的索引存放数据

检查的逻辑是判断当前类和父类是否是指定的枚举类型,如果不是会抛出ClassCastException
类型检查之后,存放数据,数据的存放在EnumMap中对null型数据有额外的操作

private Object maskNull(Object value) {
    return (value == null ? NULL : value);
}
@SuppressWarnings("unchecked")
private V unmaskNull(Object value) {
    return (V)(value == NULL ? null : value);
}

如果存放null值,EnumMap会将其替换成一个重写了toString和hashcode的Object
如下代码所示

private static final Object NULL = new Object() {
    public int hashCode() {
        return 0;
    }
    public String toString() {
        return "java.util.EnumMap.NULL";
    }
};

取数据的时候如果是上面的NULL,那么进行unmask操作

get

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

get方法很简单,首先判断key值是否合理

private boolean isValidKey(Object key) {
    if (key == null)
        return false;
    // Cheaper than instanceof Enum followed by getDeclaringClass
    Class<?> keyClass = key.getClass();
    return keyClass == keyType || keyClass.getSuperclass() == keyType;
}

判断key的类型或者key的父类型是否与指定的EnumMap的键值类型相同

然后判断vals中的值是否为NULL,如果是进行unmask转换

EnumMap vs HashMap:Java性能提升的终极对决? 摘要: Java的EnumMap专为枚举键设计,相比HashMap性能提升显著。其核心优势在于无哈希计算(直接数组索引)、低内存占用(固定数组)和类型安全(编译期检查)。实测表明,在10万次操作中,EnumMap的读写速度比HashMap快5倍以上,内存占用减少80%。适用场景包括:高频枚举映射(如游戏技能冷却)、配置项存储和内存敏感场景。通过避免哈希冲突与扩容开销,EnumMap成为枚举键场景下的性能最优解。 关键词:EnumMap、HashMap、性能优化、枚举、Java集合 阅读详情

相关推荐

使用 EnumMap 提升性能的实际案例,别再浪费性能了!

在 Java 中,当我们需要将枚举(enum)类型作为键来存储数据时,EnumMap是一种非常高效的解决方案。相比于其他Map实现,EnumMap的性能要高得多,尤其在枚举键的使用场景下。你可能会问:“使用普通的HashMap不行吗?为什么要特意使用EnumMap?今天,我们就来通过一个实际的案例,深入理解EnumMap的优势,并展示它如何提升性能!EnumMap是Map接口的一个实现类,专门用于将枚举类型作为键。EnumMap。

喵手的博客 1048

EnumMap使用

其实一直有这个疑问,感觉平时一点用不到,要么在enum当中定义属性,要么直接用hashMap,所以在开发中不用也没有任何不适。其实只要记住一点,当使用map的时候如果key值是枚举那么就可以使用😎。EnumMap创建的时候需要传入enum类型,内部存的是一个数组,这样在初始化的时候已经确定好数组的大小,不会有像hashmap那样的扩容问题,这里不同。...

木聪 2927

深度剖析Java集合之EnumMap

1. 首先我们得清楚EnumMap的使用场景,其次我们得知道EnumMap能实现的HashMap 都能实现,因为EnumMap是一种特殊的Map 2. EnumMap的性能更好,这是因为EnumMap的Enum特性决定了不论是从设计上,实现上,存储上都决定了其有很好的性能 3. EnumMap还有其特殊的一些特性,例如维持了自然顺序。

6万+

「探索Java中的EnumMap:利用枚举类型优化Map实现」

在Java中,枚举类型是一种非常有用的数据类型,它可以用于定义一组固定的常量。枚举类型在很多场景中都有广泛的应用,例如状态码、命令等。在Java中,EnumMap是一种基于枚举类型的Map实现,它具有非常高的性能和可读性。在本篇文章中,我们将会介绍EnumMap的概念、使用方法和实现原理,并且会通过一些例子来展示EnumMap的使用。本篇文章主要介绍Java中的EnumMap,包括EnumMap的概念、使用方法、实现原理以及一些例子。EnumMap是一种基于枚举类型的Map实现,它具有非常高的性能和可读性。

攻城狮不是猫 2014

【Java集合 4】LinkedHashSet、LinkedHashMap、EnumSet、EnumMap

Java中的链接散列集指的是HashSet和LinkedHashSet这两个集合实现类。它们都是基于哈希表(Hash Table)实现的,链式散列是解决哈希冲突的一种方法。

学Java,找哪吒 3224

避坑指南:企业微信IP白名单设置失败的5种常见原因及解决方案

本文深入解析企业微信API调用中IP白名单设置失败的5种常见原因,包括动态公网IP变更、代理服务器导致的IP失真等,并提供针对性的解决方案。特别针对可信IP配置问题,详细介绍了诊断方法和Java代码示例,帮助企业开发者快速解决访问限制问题,确保API调用安全稳定。

weixin_29280657的博客 619

EnumMap:让Java Map更高效的技巧

前言 摘要 内容 什么是EnumMap 如何使用EnumMap EnumMap的实现原理 EnumMap的例子 测试用例 小结 前言 在Java中,枚举类型是一种非常有用的数据类型,它可以用于定义一组固定的常量。枚举类型在很多场景中都有广泛的应用,例如状态码、命令等。 在Java中,EnumMap是一种基于枚举类型的Map实现,它具有非常高的性能和可读性。在本篇文章中,我们将会介绍Enu

lingqu+wx bjmsb06 1311

SAP PS项目计划成本与预算设计:从概念到可用性控制详解

在项目管理中,成本计划与预算管控是决定项目成本能否受控的两个核心概念。成本计划反映“预计花费”,预算是“授权上限”,两者在WBS结构上既相互关联又彼此独立。SAP PS通过计划版本管理不同口径的估算,并借助可用性控制机制对采购申请、采购订单等业务操作进行事前拦截与提示,从而实现从“事后追认”到“事前控制”的转变。理解计划成本作为预算基线、预算作为控制阀门的原理,能够帮助实施顾问和项目管理者合理设计项目财务流程。在大型工程、研发或总包项目中,明确WBS层级、预算对象和检查规则,可有效避免超支风险。围绕SAP

weixin_33146151的博客 359

EnumMap源码分析

自Java8以来,HashMap是高效的。应用HashMap完成枚举类型到值的映射也是我们常用的方式,但是EnumMap将更加高效。EnumMap顾名思义,是为枚举类服务的。 key必须为枚举类(Enum),且创建EnumMap时必须指定key的类型。key不能为null,NullPointerException,但value允许null。底层结构均为数组,大小为Enum成员数量,创建E

zxiaofan.com 1万+

Multisim仿真电路:(十二)MOS管缓启动电路设计与优化

本文详细介绍了基于Multisim的MOS管缓启动电路设计与优化方法。通过分析米勒平台效应,探讨RC参数选择、多级设计和有源电路等技巧,有效抑制冲击电流并优化开关损耗。文章结合仿真实例,提供实用的设计策略和实际应用注意事项,帮助工程师提升电源管理系统的可靠性。

pytorch8learner的博客 237

从透射谱到能量分布:用Rsoft破解光纤光栅耦合模式的3个关键技巧

本文面向光通信工程师与研究者,分享了利用Rsoft软件深入分析光纤光栅耦合模式的三个关键技巧。通过配置场监视器观察XY截面能量分布、利用传播动画追踪动态过程,并结合模式求解器精准判定相位匹配,帮助用户超越透射谱分析,直观可视化能量从纤芯到包层的耦合与流动,从而优化器件设计。

weixin_29290963的博客 420

EnumMap 分析

EnumMap(线程不安全): // 声明时首先会再内部根据传入的枚举类型的属性长度,创建等长的数组 public EnumMap(Class<K> keyType) { this.keyType = keyType; keyUniverse = getKeyUniverse(keyType); vals = new Ob...

yunzhonghefei的博客 465

Verilog基础知识11(异步FIFO为什么使用格雷码(gray-code) )

需求说明:Verilog设计 内容       :第一部分 异步FIFO为什么使用格雷码                   第二部分 格雷码在异步FIFO中的使用 来自       :时间的诗 第一部分 异步FIFO为什么使用格雷码 原文:http://www.cnblogs.com/kxk_kxk/p/3931591.html 异步FIFO通

时间的诗 8888

enummap java,Java EnumMap

Java EnumMap1 什么是Java EnumMapJava EnumMap类是用于枚举类型键的专用Map实现。它继承了Enum和AbstractMap类。2 Java EnumMap的层次结构下图是EnumMap的层次结构。3 Java EnumMap的语法public class EnumMap,V> extends AbstractMap implements Serializa...

weixin_31689651的博客 436

YOLOv11改进 | Conv篇 | 2024最新轻量化自适应提取模块LAE助力边缘设备部署计算(附代码 + 修改教程 + 运行教程)

本文给大家带来的一个改进机制是最新由LSM-YOLO提出的轻量化自适应特征提取(Lightweight Adaptive Extraction, LAE)模块,其是LSM-YOLO模型中的关键模块,旨在进行多尺度特征提取,同时降低计算成本。LAE通过以下方式实现更有效的特征提取:多尺度特征提取、自适应特征提取。LAE模块可以在不增加额外参数的情况下提高了模型对ROI区域的检测性能。​欢迎大家订阅我的专栏一起学习YOLO!YOLOv11改进系列专栏——本专栏持续复习各种顶会内容——科研必备目录一、本文介绍。

Snu77的博客 4054

Claude Code 100个真实案例 - 用AI设计Arduino PCB电路板(硬件小白也能画板)

本案例展示如何使用 Claude Code 配合 KiCad 的 Python 脚本接口,从零设计一块 Arduino 传感器扩展板 PCB。从原理图符号创建、网表生成到 PCB 布局布线,全程自动化完成,最终输出可直接发给工厂打样的 Gerber 文件。

yueyeguzhuo的专栏 438

一文弄懂EnumMap和EnumSet

文章目录简介EnumMap什么时候使用EnumMapEnumSet总结 一文弄懂EnumMap和EnumSet 简介 一般来说我们会选择使用HashMap来存储key-value格式的数据,考虑这样的特殊情况,一个HashMap的key都来自于一个Enum类,这样的情况则可以考虑使用本文要讲的EnumMap。 EnumMap 先看一下EnumMap的定义和HashMap定义的比较: public ...

程序那些事 9802

HDR 成像技术学习(三)—— LOFIC

LOFIC(Lateral Overflow Integration Capacitor,横向溢出集合电容)介绍,从像素结构到工作时序。

沧海一升的博客 9729

java-使用EnumMap

因为HashMap是一种通过对key计算hashCode(),通过空间换时间的方式,直接定位到value所在的内部数组的索引,因此,查找效率非常高。如果作为key的对象是enum类型,那么,还可以使用Java集合库提供的一种EnumMap,它在内部以一个非常紧凑的数组存储value,并且根据enum类型的key直接定位到内部数组的索引,并不需要计算hashCode(),不但效率最高,而且没有额外的空间浪费。我们以DayOfWeek使用EnumMap的时候,我们总是用Map接口来引用它,因此,实际上把。

qq_31098483的博客 880

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

Java-EnumMap

基本概念 概念 key的类型是enum类 根据enum直接定位到内部数组的索引,不需要计算hashCode 没有额外空间浪费 用Map接口引用,对于client来说,使用hashMap和EnumMap无区别 使用 如果Map的key是enum类型,推荐使用EnumMap,既保证速度,也不浪费空间。 保证速度:不进行hashCode的计算,直接通过枚举里的ordinal作为index,和key、value数组映射 不浪费空间:数据的大小和索引位置是固定的,不用对key进行散列和拉链,节约空间;此外数组不

你今天脱发了么 1716

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Enum和EnumMap的使用

在实际应用中,有的变量只有几种可能取值。如人的性别只有两种可能取值,星期只有七种可能取值。在 Java语言中对这样取值比较特殊的变量可以定义为枚举类型。所谓枚举是指将变量的值一一列举出来,变量只限于列举出来的值的范围内取值。 枚举是一个特殊的类,可以定义自己的变量,自己的方法,构造方法,甚至可以实现一个接口等等,只是它的实例是事先定义好的,限定了范围,可以使用的实例只能在限定范围内取得。 enum Car{ //枚举实例,限定枚举实例范围 lamborghini(888888,"兰博基

大叶子不小的博客 6298

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

Java 中EnumSet和EnumMap的作用

EnumSet和EnumMap是Java编程语言中的两个特殊集合类,它们与枚举类型(Enum)一起使用。EnumSet:EnumSet是一个专为枚举类型设计的集合类。它只能包含指定枚举类型的枚举值,这个枚举类型在创建EnumSet时显式或隐式地指定。EnumSet的所有元素都是有序的,这个顺序由枚举值在Enum类内的定义顺序决定。EnumSet在内部以位向量的形式存储,这种存储形式非常紧凑、高效,因此EnumSet对象占用的内存很小,运行效率也很好。

m0_60521228的博客 1182

enummap java,使用EnumMap

因为HashMap是一种通过对key计算hashCode(),通过空间换时间的方式,直接定位到value所在的内部数组的索引,因此,查找效率非常高。如果作为key的对象是enum类型,那么,还可以使用Java集合库提供的一种EnumMap,它在内部以一个非常紧凑的数组存储value,并且根据enum类型的key直接定位到内部数组的索引,并不需要计算hashCode(),不但效率最高,而且没有额外的...

weixin_42179184的博客 271

java enummap_Java EnumMap equals()方法与示例

java enummap EnumMap类equals()方法 (EnumMap Class equals() method) equals() method is available in java.util package. equals()方法在java.util包中可用。 equals() method is used to check whether this map compare...

cumtb2009的博客 202

java enummap_Java EnumMap put()方法与示例

java enummap EnumMap类的put()方法 (EnumMap Class put() method) put() method is available in java.util package. put()方法在java.util包中可用。 put() method is used to replace the previous value associated with the...

278

enummap java_Java之集合(十)EnumMap

1.前言本章介绍Map体系中的EnumMap,该类是专门针对枚举类设计的一个集合类。集合中的所有键必须是同一个枚举类的实例。当EnumMap创建后,会表现成一个数组array,这种表现方式是紧凑高效的。EnumMap的顺序,由枚举类实例的定义顺序决定。集合视图的迭代器是弱一致(weakly consistent)的,不会抛出并发异常ConcurrentModificationException。当...

weixin_42501704的博客 748
上一篇: java transient关键字
下一篇: 避免NPE
光与热
博客等级 码龄10年 55粉丝 126原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值