EnumMap:让Java Map更高效的技巧

  • 前言

  • 摘要

  • 内容

    • 什么是EnumMap

    • 如何使用EnumMap

    • EnumMap的实现原理

    • EnumMap的例子

    • 测试用例

  • 小结


前言

在Java中,枚举类型是一种非常有用的数据类型,它可以用于定义一组固定的常量。枚举类型在很多场景中都有广泛的应用,例如状态码、命令等。

在Java中,EnumMap是一种基于枚举类型的Map实现,它具有非常高的性能和可读性。在本篇文章中,我们将会介绍EnumMap的概念、使用方法和实现原理,并且会通过一些例子来展示EnumMap的使用。

摘要

本篇文章主要介绍Java中的EnumMap,包括EnumMap的概念、使用方法、实现原理以及一些例子。EnumMap是一种基于枚举类型的Map实现,它具有非常高的性能和可读性。在使用EnumMap时,需要先定义枚举类型,然后利用枚举类型来创建EnumMap的实例。

EnumMap的实现采用了一种非常高效的方式,它使用一个数组来存储Map中的键值对,并且可以保证枚举类型中的所有值都被覆盖到。在实际开发中,EnumMap可以用于替代一些需要使用switch语句或if语句的场合,从而提高代码的可读性和性能。

内容

什么是EnumMap

在Java中,枚举类型是一种非常有用的数据类型,它可以用于定义一组固定的常量。枚举类型在很多场景中都有广泛的应用,例如状态码、命令等。而EnumMap是一种基于枚举类型的Map实现,它可以用于将枚举常量映射到一个值,以实现高效的查找和访问。

在Java中,EnumMap的定义如下所示:

public class EnumMap<K extends Enum<K>,V> extends AbstractMap<K,V>implements java.io.Serializable, Cloneable

从上面的定义可以看出,EnumMap是一种泛型类,它继承自AbstractMap类,并实现了SerializableCloneable接口。EnumMap的泛型参数包括两个,K表示枚举类型,V表示枚举类型对应的值类型。通常情况下,V可以是任意类型,例如String、Integer等。

EnumMap的主要特点如下:

  • EnumMap是一种基于枚举类型的Map实现。

  • EnumMap中的键必须是枚举类型。

  • EnumMap中的值可以是任意类型。

  • EnumMap中的键值对是有序的,它们的顺序是根据枚举类型中定义的顺序来排序的。

  • EnumMap的实现采用了一种非常高效的方式,它使用一个数组来存储Map中的键值对,并且可以保证枚举类型中的所有值都被覆盖到。

如何使用EnumMap

在使用EnumMap时,需要先定义枚举类型,然后利用枚举类型来创建EnumMap的实例。下面是一个使用EnumMap的例子:

@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public class EnumMapTest {enum Color {RED, GREEN, BLUE}@Testpublic void testColorEnumMap(){EnumMap<Color, String> colorMap = new EnumMap<>(Color.class);colorMap.put(Color.RED, "#FF0000");colorMap.put(Color.GREEN, "#00FF00");colorMap.put(Color.BLUE, "#0000FF");System.out.println(colorMap);}
}

上面的例子定义了一个Color枚举类型,它包含三个值:RED、GREEN、BLUE。然后,利用Color枚举类型来创建了一个EnumMap实例,并将Color枚举类型中的每个值和一个字符串映射起来。最后,将整个EnumMap输出到控制台中,可以看到输出结果如下:

图片

img

从上面的例子可以看出,使用EnumMap非常简单,只需要定义枚举类型并创建EnumMap实例即可。在EnumMap中添加、删除或查找元素的方法与其他Map实现类非常相似,例如put()get()remove()等方法。

EnumMap的实现原理

EnumMap的实现采用了一种非常高效的方式,它使用一个数组来存储Map中的键值对,并且可以保证枚举类型中的所有值都被覆盖到。具体来说,EnumMap的实现分成两个部分:数组和值。

  • 数组

EnumMap的实现中,采用一个Object类型的数组来存储Map中的键值对。数组的长度等于枚举类型中定义的值的数量。例如,如果枚举类型中定义了3个值,那么数组的长度就是3。采用数组的方式存储键值对,可以非常高效地进行查找、添加和删除操作。

EnumMap的实现中,采用一个value变量来存储枚举类型对应的值。由于在Java中,枚举类型的值是有限的,因此可以采用一个数组来存储枚举类型值对应的值。在EnumMap的实现中,如果枚举类型的值很少,那么数组的容量也会很小,因此占用的空间也会非常小。

EnumMap的例子

下面是一个更复杂的EnumMap例子,它用于实现命令模式。在命令模式中,命令被抽象为一个接口,每个具体的命令都实现了该接口。然后,利用EnumMap将不同的命令和具体的实现类映射起来。

interface Command {void execute();
}class StartCommand implements Command {@Overridepublic void execute() {System.out.println("Start command executed");}
}class StopCommand implements Command {@Overridepublic void execute() {System.out.println("Stop command executed");}
}enum CommandType {START, STOP
}public class CommandExample {private static final EnumMap<CommandType, Command> commandMap = new EnumMap<>(CommandType.class);static {commandMap.put(CommandType.START, new StartCommand());commandMap.put(CommandType.STOP, new StopCommand());}public static void main(String[] args) {Command startCommand = commandMap.get(CommandType.START);Command stopCommand = commandMap.get(CommandType.STOP);startCommand.execute();stopCommand.execute();}
}

上面的例子中,定义了一个Command接口以及两个具体的命令实现类:StartCommandStopCommand。然后,利用EnumMapCommandType枚举类型的值和具体的命令实现类映射起来。

最后,在main()方法中,从EnumMap中获取StartCommandStopCommand实例,并执行它们的execute()方法。

测试用例

下面是一个简单的测试用例,用于测试EnumMap的基本功能:

@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public class EnumMapTest {enum Weekday {MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY}@Testpublic void testWeekDayEnumMap() {EnumMap<Weekday, String> map = new EnumMap<>(Weekday.class);map.put(Weekday.MONDAY, "星期一");map.put(Weekday.TUESDAY, "星期二");map.put(Weekday.WEDNESDAY, "星期三");System.out.println(" map = " + map);assertTrue(map.containsKey(Weekday.MONDAY));assertFalse(map.containsKey(Weekday.SATURDAY));System.out.println(" map.size() = " + map.size());assertEquals(3, map.size());System.out.println("map.get(Weekday.MONDAY) = " + map.get(Weekday.MONDAY));assertEquals("星期一", map.get(Weekday.MONDAY));map.remove(Weekday.MONDAY);assertEquals(2, map.size());}
}

上面的测试用例中,定义了一个Weekday枚举类型,并创建了一个EnumMap实例。

测试结果如下:

图片

img

小结

总体来说,EnumMap是非常便捷和高效的,尤其适合用于枚举类型作为键的情况。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/491044.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

计算机游戏运行时常见问题解析:d3dx9_43.dll丢失的真相与修复指南

游戏运行时d3dx9_43.dll缺失问题全解析 在计算机游戏的探险之旅中&#xff0c;d3dx9_43.dll文件缺失常成为玩家的绊脚石。此DLL文件是DirectX 9的关键组件&#xff0c;对图形渲染至关重要。以下&#xff0c;我们将深入剖析其丢失原因&#xff0c;并提供精简有效的修复策略。 …

电子科技大学《2024年839自动控制原理真题》 (完整版)

本文内容&#xff0c;全部选自自动化考研联盟的&#xff1a;《电子科技大学839自控考研资料》的真题篇。后续会持续更新更多学校&#xff0c;更多年份的真题&#xff0c;记得关注哦~ 目录 2024年真题 Part1&#xff1a;2024年完整版真题 2024年真题

BUUCTF Pwn [HarekazeCTF2019]baby_rop2 题解

下载 得到两个文件 checksec 64位 拖入IDA64 查看main函数 看到给了个libc说明这题是ret2libc题 这里的打印函数是printf 所以利用printf函数的plt输出真实地址got 但printf的got好像不行 所以换成了read的got 因为这是64位程序 所以用寄存器传参&#xff1b;又因为printf得…

Starfish 因子开发管理平台快速上手:如何完成策略编写与回测

DolphinDB 开发的因子开发管理平台 Starfish 围绕量化投研的因子、策略开发阶段设计&#xff0c;为用户提供了一个从数据管理、因子研究到策略回测的完整解决方案。 因子平台的回测引擎提供了多个关键的事件函数&#xff0c;涵盖策略初始化、每日盘前和盘后回调、逐笔、快照和…

ASP.NET|日常开发中读写TXT文本详解

ASP.NET&#xff5c;日常开发中读写TXT文本详解 前言一、读取 TXT 文本1.1 使用StreamReader类 二、写入 TXT 文本2.1 使用StreamWriter类 三、文件编码问题3.1 常见编码格式 四、错误处理和性能考虑4.1 错误处理4.2 性能考虑 结束语优质源码分享 ASP.NET&#xff5c;日常开发中…

走进 RAG 技术:一场智能数据交互的奇幻之旅

朋友们&#xff0c;咱身处的这个时代&#xff0c;科技那可是跟开了挂似的往前冲&#xff0c;其中人工智能更是厉害得没话说&#xff0c;宛如一个充满无限可能的魔法领域&#xff0c;时不时就给咱的生活来个大变样。而在这其中&#xff0c;RAG 技术就像是突然冒出来的一颗超亮眼…

leetcode-402.移调k位数字-day8

代码实现细节影响 方法一&#xff1a;在构建最终结果字符串时&#xff0c;通过 stack.substring(0, stack.length() - k < 1? 0 : stack.length() - k).toString() 这样的方式来截取需要的部分&#xff0c;这个操作相对比较直接简洁&#xff0c;不需要额外的反转等操作&…

第十二课 Unity 内存优化_内存工具篇(Memory)详解

内存&#xff08;Memory&#xff09; unity 内存部分也是优化过程中非常重要的一个环节&#xff0c;也会影像渲染过程中的同步等待与带宽问题。因此内存的优化也可能会给我们渲染开销带来精简&#xff0c;今天我们先来了解unity中的内存与使用到的内存工具。 Unity中的内存 托…

ESlint代码规范,手动与自动修复

规范说明 规则参考 - ESLint - 插件化的 JavaScript 代码检查工具 规范说明 ​ ​ 可看到是main.js文件报错分别是第三行第30个字符&#xff0c;以及第七行第一个字符 后面则是规范说明&#xff0c;可以根据说明查找相应的规范 一.手动修正 ctrl f 可以搜索 二.自动修正 …

Python的3D可视化库【vedo】2-3 (plotter模块) 增删物体、控制相机

文章目录 4 Plotter类的方法4.3 渲染器内的物体操作4.3.1 添加物体4.3.2 移除物体4.3.3 渲染器的内容列表 4.4 相机控制4.4.1 访问相机对象4.4.2 重置相机状态4.4.3 移动相机位置4.4.4 改变相机焦点4.4.5 改变相机朝向的平面4.4.5 旋转相机4.4.6 对齐相机的上朝向4.4.7 缩放 ve…

vue3监听横向滚动条的位置;鼠标滚轮滑动控制滚动条滚动;监听滚动条到顶端

1.横向取值scrollLeft 竖向取值scrollTop 2.可以监听到最左最右侧 3.鼠标滚轮滑动控制滚动条滚动 效果 <template><div><div class"scrollable" ref"scrollableRef"><!-- 内容 --><div style"width: 2000px; height: 100…

FFTW 库于 Qt Creator 环境的部署与应用

1.什么是FFTW库 FFTW库是用于一维或多维快速傅里叶变换(FFT)的C函数库。 2.在Qt中的安装和使用 2.1 下载合适版本 我们以 FFTW 3.3.5 版本为例&#xff0c;对于 Windows 64 位平台&#xff0c;&#xff0c;可以从官网的下载链接&#xff1a;FFTW Installation on Windows 2…

加餐:读者写者问题与读写锁+自旋锁

目录 一、读者写者问题1、读者写者问题2、读者写者 vs 生产消费3、读者写者问题如何理解 二、读写锁1、读写锁接口&#xff08;1&#xff09;设置读写优先&#xff08;2&#xff09;初始化&#xff08;3&#xff09;销毁&#xff08;4&#xff09;加锁和解锁 2、读写锁案例 三、…

新零售社交电商系统小程序功能开发详细解析

现在的购物方式是越来越有趣了&#xff0c;新零售社交电商系统是互联网、大数据、人工智能的技术和咱们熟悉的传统零售深度结合后产生的。它整合线上线下渠道及数据&#xff0c;带来全方位、多渠道、个性化购物体验。借助实时库存管理、智能推荐和无缝购物体验等功能&#xff0…

【学习笔记】移动端浏览器的视口

两个视口 视觉视口&#xff1a;是当前显示屏页面中的一部分 布局视口&#xff1a;完整页面的大小 视觉视口 布局视口有多宽&#xff1f;这因浏览器而异。Safari iPhone使用980px&#xff0c; Opera 850px, Android WebKit 800px, IE 974px 视觉视口和布局视口相同 局视口宽度…

xshell连接虚拟机,更换网络模式:NAT->桥接模式

NAT模式&#xff1a;虚拟机通过宿主机的网络访问外网。优点在于不需要手动配置IP地址和子网掩码&#xff0c;只要宿主机能够访问网络&#xff0c;虚拟机也能够访问。对外部网络而言&#xff0c;它看到的是宿主机的IP地址&#xff0c;而不是虚拟机的IP。但是&#xff0c;宿主机可…

PVE系统下——OpenWRT一键扩容脚本(x86下EXT4SquashFS)

扩容了x86上的 OpenWrt 根分区和文件系统。 1.PVE 上增加硬盘大小 2.执行脚本 安装依赖 opkg update opkg install parted losetup resize2fs下载脚本并一键执行 wget -U "" -O expand-root.sh "https://openwrt.org/_export/code/docs/guide-user/advanced…

嵌入式Linux之wifi配网C++版

上篇文章,介绍了嵌入式Linux开发板中,通过sh脚本调用wpa_supplicant等工具进行配网。 本篇,来介绍如何通过C++编程 ,来实现同样的功能。 1 准备工作 我这个开发板,之前配置了开机自动启动配网脚本,为了便于测试C++编程,可以先关掉开机配网的自动脚本。 在/etc/init.d…

YOLOv8目标检测(六)_封装API接口

YOLOv8目标检测(一)_检测流程梳理&#xff1a;YOLOv8目标检测(一)_检测流程梳理_yolo检测流程-CSDN博客 YOLOv8目标检测(二)_准备数据集&#xff1a;YOLOv8目标检测(二)_准备数据集_yolov8 数据集准备-CSDN博客 YOLOv8目标检测(三)_训练模型&#xff1a;YOLOv8目标检测(三)_训…

Intel(R) Iris(R) Xe Graphics安装Anaconda、Pytorch(CPU版本)

一、Intel(R) Iris(R) Xe Graphics安装Anaconda 下载网址&#xff1a;https://repo.anaconda.com/archive/ 双击Anaconda3-2024.10-1-Windows-x86_64&#xff0c;一直下一步&#xff0c;选择安装的路径位置&#xff0c;一直下一步就安装完成了。打开Anaconda PowerShell Promp…