解析Java中1000个常用类:EnumMap类,你学会了吗?

在线工具站
  • 推荐一个程序员在线工具站:程序员常用工具(http://cxytools.com),有时间戳、JSON格式化、文本对比、HASH生成、UUID生成等常用工具,效率加倍嘎嘎好用。
程序员资料站
  • 推荐一个程序员编程资料站:程序员的成长之路(http://cxyroad.com),收录了一些列的技术教程、各大面试专题,还有常用开发工具的教程。
小报童专栏精选Top100
  • 推荐一个小报童专栏导航站:小报童精选Top100(http://xbt100.top),收录了生财有术项目精选、AI海外赚钱、纯银的产品分析等专栏,陆续会收录更多的专栏,欢迎体验~

在 Java 编程中,映射(Map)是一个常用的数据结构,它用于存储键值对。然而,在某些特定场景下,使用枚举类型作为键可以提高代码的可读性和性能。Java 提供了一个专门为枚举类型设计的映射类——EnumMap

1. EnumMap 类概述

1.1 定义

EnumMapjava.util 包中的一个类,它实现了 Map 接口,并且键必须是枚举类型。定义如下:

public class EnumMap<K extends Enum<K>, V> extends AbstractMap<K, V>implements Serializable, Cloneable {// 构造方法public EnumMap(Class<K> keyType) {// 初始化代码}// 常用方法省略...
}

1.2 主要特点

  • 高效EnumMap 在内部使用数组实现,性能非常高。
  • 枚举类型安全:键必须是枚举类型,避免了类型转换错误。
  • 有序性:按枚举类型的自然顺序存储键。
  • 低内存开销:相比于 HashMapEnumMap 更加节省内存。

2. 常用方法

2.1 构造方法

EnumMap 提供了多种构造方法来初始化映射。

// 使用指定的枚举类型初始化映射
public EnumMap(Class<K> keyType)// 使用指定的映射初始化 EnumMap
public EnumMap(EnumMap<K, ? extends V> m)// 使用指定的 Map 初始化 EnumMap
public EnumMap(Map<K, ? extends V> m)

示例:

EnumMap<Day, String> enumMap = new EnumMap<>(Day.class);

2.2 put(K key, V value)

put 方法用于在映射中添加键值对。

public V put(K key, V value)

示例:

enumMap.put(Day.MONDAY, "Work");

2.3 get(Object key)

get 方法用于根据键获取值。

public V get(Object key)

示例:

String activity = enumMap.get(Day.MONDAY);

2.4 containsKey(Object key)

containsKey 方法用于判断映射中是否包含指定的键。

public boolean containsKey(Object key)

示例:

boolean hasMonday = enumMap.containsKey(Day.MONDAY);

2.5 remove(Object key)

remove 方法用于根据键移除键值对。

public V remove(Object key)

示例:

enumMap.remove(Day.MONDAY);

2.6 size()

size 方法用于返回映射中键值对的数量。

public int size()

示例:

int size = enumMap.size();

2.7 keySet()

keySet 方法用于返回映射中所有键的集合。

public Set<K> keySet()

示例:

Set<Day> keys = enumMap.keySet();

3. 使用示例

以下是使用 EnumMap 类进行基本操作的示例代码:

3.1 定义枚举类型

public enum Day {MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY
}

3.2 创建和操作 EnumMap

import java.util.EnumMap;
import java.util.Map;
import java.util.Set;public class EnumMapExample {public static void main(String[] args) {EnumMap<Day, String> enumMap = new EnumMap<>(Day.class);// 添加键值对enumMap.put(Day.MONDAY, "Work");enumMap.put(Day.TUESDAY, "Gym");enumMap.put(Day.WEDNESDAY, "Shopping");// 获取值String activity = enumMap.get(Day.MONDAY);System.out.println("Activity on Monday: " + activity);// 检查是否包含键boolean hasMonday = enumMap.containsKey(Day.MONDAY);System.out.println("Contains Monday: " + hasMonday);// 移除键值对enumMap.remove(Day.MONDAY);System.out.println("After removing Monday: " + enumMap);// 获取键的集合Set<Day> keys = enumMap.keySet();System.out.println("Keys: " + keys);// 获取大小int size = enumMap.size();System.out.println("Size of EnumMap: " + size);}
}

运行上述代码,将输出:

Activity on Monday: Work
Contains Monday: true
After removing Monday: {TUESDAY=Gym, WEDNESDAY=Shopping}
Keys: [TUESDAY, WEDNESDAY]
Size of EnumMap: 2

4. 应用场景

4.1 状态管理

在状态管理中,可以使用枚举类型表示不同的状态,通过 EnumMap 来存储状态和对应的处理逻辑或数据。

4.2 配置管理

在配置管理中,可以使用 EnumMap 存储不同的配置选项和对应的值,确保配置的类型安全和高效访问。

4.3 表驱动法

在使用表驱动法处理不同情况时,可以使用 EnumMap 存储不同情况和对应的处理函数,使代码更加简洁和易于维护。

5. 性能考虑

使用 EnumMap 类进行映射操作时,需要注意以下几点:

  • 高效性EnumMap 在内部使用数组实现,访问速度快,适合在性能要求高的场景中使用。
  • 内存占用EnumMap 相比于 HashMap 更加节省内存,适合在内存受限的场景中使用。
  • 类型安全EnumMap 强制要求键为枚举类型,避免了类型转换错误,提高了代码的健壮性。

6. 与 HashMap 的比较

虽然 EnumMapHashMap 都实现了 Map 接口,但在某些场景下使用 EnumMap 更为合适。

6.1 性能

EnumMap 的性能比 HashMap 更高,因为它使用数组实现,时间复杂度为 O(1)。而 HashMap 使用散列表实现,时间复杂度在平均情况下也是 O(1),但在最坏情况下可能会降为 O(n)。

6.2 内存占用

EnumMap 的内存占用比 HashMap 更小,因为它使用紧凑的数组来存储键值对,而 HashMap 使用散列表,可能会有较多的空槽位。

6.3 类型安全

EnumMap 强制键为枚举类型,避免了类型转换错误,提高了代码的健壮性和可读性。而 HashMap 的键可以是任意类型,可能会导致类型转换错误。

7. 总结

EnumMap 类在 Java 中提供了一个高效、类型安全的工具,用于存储枚举类型的键值对。

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

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

相关文章

python破解字母已知但大小写未知密码

python穷举已知字符串中某个或多个字符为大写的所有情况 可以使用递归函数来实现这个功能。以下是一个示例代码&#xff1a; def generate_uppercase_combinations(s, index0, current):if index len(s):print(current)returngenerate_uppercase_combinations(s, index 1, …

图神经网络dgl和torch-geometric安装

文章目录 搭建环境dgl的安装torch-geometric安装 在跑论文代码过程中&#xff0c;许多小伙伴们可能会遇到一些和我一样的问题&#xff0c;就是文章所需要的一些库的版本比较老&#xff0c;而新版的环境跑代码会报错&#xff0c;这就需要我们手动的下载whl格式的文件来安装相应的…

数字信号处理及MATLAB仿真(3)——量化的其他概念

上回书说到AD转换的两个步骤——量化与采样两个步骤。现在更加深入的去了解以下对应的概念。学无止境&#xff0c;要不断地努力才有好的收获。万丈高楼平地起&#xff0c;唯有打好基础&#xff0c;才能踏实前行。 不说了&#xff0c;今天咱们继续说说这两个步骤&#xff0c;首先…

cloudflare tunnels tcp

这里是官网的说明Cloudflare Tunnel Cloudflare Zero Trust docs 根据实际情况安装环境 tunnels除了http,https协议是直接暴露公网&#xff0c;tcp是类似ssh端口转发。 在需要内网穿透的局域网找一条机子部署代理 我这边是window cloudflared tunnel login #生成一个身份校…

计算机网络 5.4中继器 5.5集线器

第四节 中继器 一、认识中继器 1.作用&#xff1a;对信号整形、放大&#xff0c;使之传播更远的距离。 2.特点&#xff1a; ①由中继器连接起来的两端必须采用相同介质访问控制协议。 ②理论上中继器的使用是无限的&#xff0c;但实际只能在规定的范围内有效工作&#xff0…

windows上传app store的构建版本简单方法

我们在上传app store上架&#xff0c;或上传到testflight进行ios的app测试的时候&#xff0c;需要mac下的上传工具上传ipa文件到app store的构建版本上。 然而windows电脑这些工具是无法安装的。 因此&#xff0c;假如在windows上开发hbuilderx或uniapp的应用&#xff0c;可以…

Mobile ALOHA: 你需不需要一个能做家务的具身智能机器人

相信做机器人的朋友最近一段时间一定被斯坦福华人团队这个Mobile ALOHA的工作深深所震撼&#xff0c;这个工作研究了一个能做饭&#xff0c;收拾衣服&#xff0c;打扫卫生的服务机器人&#xff0c;完成了传统机器人所不能完成的诸多任务&#xff0c;向大家展示了服务机器人的美…

一文全解Nginx

一文全解Nginx 一文全解 Nginx 1. 技术介绍 Nginx&#xff08;发音为"engine-x"&#xff09;是一个高性能的开源 Web 服务器软件&#xff0c;同时也可以用作反向代理、负载均衡器和 HTTP 缓存。它最初由俄罗斯的 Igor Sysoev 开发&#xff0c;并于 2004 年首次公开…

在Qt中使用C++编程与传统C++编程的区别

引言 C作为一种强大的编程语言&#xff0c;被广泛应用于系统编程、游戏开发、嵌入式系统等领域。而Qt作为一个跨平台的应用开发框架&#xff0c;通过其丰富的功能库和高效的开发工具&#xff0c;使得C开发变得更加高效和便捷。本文将深入探讨在Qt中使用C编程与传统C编程的区别…

el-date-picker 设置默认值为当前日期

this.listQuery.Date new Date().toISOString().substr(0, 10); <el-date-picker v-model"listQuery.Date" format"yyyy-MM-dd" value-format"yyyy-MM-dd" type"date" placeholder"选择日期" change"getList()&qu…

【MySQL】4.MySQL 的数据类型

MySQL 的数据类型 一.数据类型分类在这里插入图片描述二.注意点1.char VS varchar2.datetime VS timestamp3.enum 和 set 的使用方法 一.数据类型分类 二.注意点 1.char VS varchar char 的意义是直接开辟固定大小的空间&#xff0c;浪费磁盘空间&#xff0c;但是效率高varcha…

WEB05Web开发HTMLCSS

Web前端开发 什么是 Web &#xff1f; Web&#xff1a;全球广域网&#xff0c;也称为万维网(www World Wide Web)&#xff0c;能够通过浏览器访问的网站。 Web 网站的工作流程 W3C 万维网联盟&#xff08; World Wide Web Consortium &#xff09;&#xff0c;创建于1994年1…

ESP32-C3模组上跑通AES-GCM(1)

本文内容参考: mbedtls学习笔记 AES GCM_aes128 gcm的aad是什么-CSDN博客 https://www.cnblogs.com/testlearn/p/16547583.html 对称加密和非对称加密,一文讲解明白!-CSDN博客 深入理解高级加密标准(Advanced Encryption Standard)_aes在线加密-CSDN博客 特此致谢! …

OpenEarthMap:全球高分辨率土地覆盖制图的基准数据集(开源来下载!!!)

OpenEarthMap由220万段5000张航拍和卫星图像组成&#xff0c;覆盖6大洲44个国家97个地区&#xff0c;在0.25-0.5m的地面采样距离上人工标注8类土地覆盖标签。我们提供8类标注:裸地、牧场、已开发空间、道路、树木、水、农业用地和建筑。类选择与现有的具有亚米GSD的产品和基准数…

std::unordered_map和std::map在性能上有何不同

std::unordered_map和std::map在性能上的不同主要体现在以下几个方面&#xff1a; 1. 底层数据结构 std::unordered_map&#xff1a;基于哈希表实现&#xff0c;通过哈希函数计算元素的存储位置。哈希表能够直接通过哈希值快速定位到元素的位置&#xff0c;从而实现高效的查找…

30、PHP 实现 左旋转字符串、翻转单词顺序列

题目&#xff1a; PHP 实现 左旋转字符串 描述&#xff1a; 汇编语言中有一种移位指令叫做循环左移&#xff08;ROL&#xff09;&#xff0c;现在有个简单的任务&#xff0c; 就是用字符串模拟这个指令的运算结果。对于一个给定的字符序列S&#xff0c;请你把其循环左移K位后的…

电源纹波相关

什么是纹波&#xff1f;什么是噪声&#xff1f; 这种叠加在直流稳定量上的交流分量就称为纹波。 纹波的危害 电源纹波能影响设备性能和稳定性 纹波会导致电器上产生谐波&#xff0c;降低电源的使用效率&#xff1b; 高频电源纹波可能会产生浪涌电压或电流&#xff0c;影响设…

android deep links即scheme uri跳转以及googlePlay跳转配置

对于googlePlay的Custom URL就是googlePlay上APP网址&#xff1a; https://play.google.com/store/apps/details?idcom.yourapp如果是国内一些应用&#xff0c;则考虑market://包名等方式&#xff0c;自行百度。 对于Android URI Scheme&#xff1a; 首先需要在Manifest xm…

第2章大话 ASP.NET Core 入门

1.什么是ASP.NET Core框架 ASP.NET Core是一个超级棒的框架&#xff0c;它是免费的&#xff0c;你可以在任何主流的系统上&#xff0c;比如Windows、Linux或macOS上使用它&#xff0c;而且它是完全开放源代码的&#xff0c;意味着你可以看到并修改它的内部代码。这个框架是专门…

浅尝Apache Mesos

文章目录 1. Mesos是什么2. 共享集群3. Apache Mesos3.1 Mesos主节点3.2 Mesos代理3.3 Mesos框架 4. 资源管理4.1 资源提供4.2 资源角色4.3 资源预留4.4 资源权重与配额 5. 实现框架5.1 框架主类5.3 实现执行器 6. 小结参考 1. Mesos是什么 Mesos是什么&#xff0c;Mesos是一个…