解析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.mfbz.cn/a/781584.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

SpringBoot3+Vue3开发园区管理系统

介绍 在当今快速发展的城市化进程中&#xff0c;高效、智能的园区管理成为了提升居民生活品质、优化企业运营环境的关键。为此&#xff0c;我们精心打造了全方位、一体化的园区综合管理系统&#xff0c;该系统深度融合了园区管理、楼栋管理、楼层管理、房间管理以及车位管理等…

微信小程序消息通知(一次订阅)

在微信公众平台配置通知模版 通过wx.login获取code发送给后端 let that this // 登陆codewx.login({success: function (res) {if (res.code) {// 发送code到后端换取openid和session_keythat.setData({openCode: res.code})console.log(that.data.openCode, openCode);// 调…

【SpringBoot】SpringBoot内置Servlet容器源码分析-Tomcat

自动装配加载 ServletWebServerFactoryAutoConfiguration 在自动装配的时候&#xff0c;会加载spring.factories&#xff0c;并且添加到IOC容器中。这里包含web自动配置类ServletWebServerFactoryAutoConfiguration &#xff0c;其中本类中注入三个bean&#xff0c;分别是Embed…

【数据结构与算法】插入排序

&#x1f493; 博客主页&#xff1a;倔强的石头的CSDN主页 &#x1f4dd;Gitee主页&#xff1a;倔强的石头的gitee主页 ⏩ 文章专栏&#xff1a;《数据结构与算法》 期待您的关注 ​

Ollama报错:Error: llama runner process has terminated: exit status 0xc0000409

0&#xff0c;背景 今天听说谷歌家的Gemma2性能很好&#xff0c;于是在Ollama上下载到本地测试一下 ollama run gemma2 结果终端里报错 Error: llama runner process has terminated: exit status 0xc0000409 1&#xff0c;原因 原因很简单&#xff0c;新的模型&#xff…

vue项目实现堆叠卡片拖动切换效果

实际效果 实现流程 1. 实现卡片位置堆叠 将父元素的 position 设置成relative &#xff0c;卡片的position 设置成 absolute 即可。 2. 消除图片的移动 如果卡片上有图片&#xff0c;默认拖动的时候就会导致像上图一样变成了选中图片移动&#xff0c;从而没法触发拖动事件。消…

Canal架构以及使用规范

Canal架构以及使用规范 一、Canal的作用 相关文档&#xff1a;GitHub - alibaba/canal: 阿里巴巴 MySQL binlog 增量订阅&消费组件 MySQL主备复制原理 MySQL master 将数据变更写入二进制日志( binary log, 其中记录叫做二进制日志事件binary log events&#xff0c;可…

上网监控软件有哪些?3款实力出众的上网监控软件

为什么需要上网监控软件&#xff1f; 据说&#xff0c;99%的员工上班都会摸鱼&#xff0c;1%的员工上班会窃取公司信息。 所以&#xff0c;因此&#xff0c;监控员工的上网行为是很有必要滴。 总结下来&#xff0c;上网监控软件的作用是&#xff1a; 1.提高生产力&#xff1…

Vben:表格的表头和表格的内容对不齐,以及解决方法

文章目录 一、问题描述二、解决方法 一、问题描述 基于Vue-Vbne-admin框架进行前端开发的时候&#xff0c;调用表格useTable函数实现表格之后&#xff0c;发现表格的表头和表格的内容对不齐。如下图所示。针对这种情况&#xff0c;本文记录了解决方法。 调用的模块如下&#x…

1958.力扣每日一题7/7 Java(100%解)

博客主页&#xff1a;音符犹如代码系列专栏&#xff1a;算法练习关注博主&#xff0c;后期持续更新系列文章如果有错误感谢请大家批评指出&#xff0c;及时修改感谢大家点赞&#x1f44d;收藏⭐评论✍ 目录 思路 解题方法 时间复杂度 空间复杂度 Code 思路 首先将指定位…

浏览器插件利器-allWebPluginV2.0.0.14-stable版发布

allWebPlugin简介 allWebPlugin中间件是一款为用户提供安全、可靠、便捷的浏览器插件服务的中间件产品&#xff0c;致力于将浏览器插件重新应用到所有浏览器。它将现有ActiveX插件直接嵌入浏览器&#xff0c;实现插件加载、界面显示、接口调用、事件回调等。支持谷歌、火狐等浏…

并查集(还有反集也在)

一.定义 定义&#xff1a; 并查集是一种树型的数据结构&#xff0c;用于处理一些不相交集合的合并及查询问题&#xff08;即所谓的并、查&#xff09;。比如说&#xff0c;我们可以用并查集来判断一个森林中有几棵树、某个节点是否属于某棵树等。 主要构成&#xff1a; 并查集…

2-27 基于matlab的一种混凝土骨料三维随机投放模型

基于matlab的一种混凝土骨料三维随机投放模型&#xff0c;为混凝土细观力学研究提供一种快捷的三维建模源代码。可设置骨料数量&#xff0c;边界距离、骨料大小等参数。程序已调通&#xff0c;可直接运行。 2-27 matlab 混凝土骨料三维随机投放模型 - 小红书 (xiaohongshu.com)…

Redis 7.x 系列【16】持久化机制之 AOF

有道无术&#xff0c;术尚可求&#xff0c;有术无道&#xff0c;止于术。 本系列Redis 版本 7.2.5 源码地址&#xff1a;https://gitee.com/pearl-organization/study-redis-demo 文章目录 1. 概述2. 执行原理2.1 Redis 6.x2.1.1 直接写2.1.2 重写 2.2 Redis 7.x2.2.1 直接写2…

PTA甲级1005:Spell It Right

错误代码&#xff1a; #include<iostream> #include<vector> #include<unordered_map> using namespace std;int main() {unordered_map<int, string> map {{0, "zero"}, {1, "one"}, {2, "two"}, {3, "three&qu…

线程安全的原因及解决方法

什么是线程安全问题 线程安全问题指的是在多线程编程环境中&#xff0c;由于多个线程共享数据或资源&#xff0c;并且这些线程对共享数据或资源的访问和操作没有正确地同步&#xff0c;导致数据的不一致、脏读、不可重复读、幻读等问题。线程安全问题的出现&#xff0c;通常是…

【大数据综合试验区1008】揭秘企业数字化转型:大数据试验区政策数据集大公开!

今天给大家分享的是国内顶级期刊中国工业经济2023年发布的最新期刊《政策赋能、数字生态与企业数字化转型——基于国家大数据综合试验区的准自然实验》文章中所使用到的数据集——国家大数据综合试验区政策数据集以及工具变量数据&#xff0c;该文章基于2009-2019年中国上市企业…

两个全开源的3D模型素材下载网站源码 3D图纸模型素材 三维图形素材会员下载站源码

今天推荐两个全开源的3D模型素材下载网站源码 3D图纸模型素材 三维图形素材会员下载站源码&#xff0c;这两个源码完整&#xff0c;都是基于thinkphp内核开发的&#xff0c;框架稳定&#xff0c;带数据库&#xff0c;源码文件&#xff0c;可以直接部署使用。 第一个&#xff1a…

【数据结构与算法】快速排序挖坑法

&#x1f493; 博客主页&#xff1a;倔强的石头的CSDN主页 &#x1f4dd;Gitee主页&#xff1a;倔强的石头的gitee主页 ⏩ 文章专栏&#xff1a;《数据结构与算法》 期待您的关注 ​