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

news2024/10/6 6:58:00
在线工具站
  • 推荐一个程序员在线工具站:程序员常用工具(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.coloradmin.cn/o/1905103.html

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

相关文章

C/C++ 代码注释规范及 doxygen 工具

参考 谷歌项目风格指南——注释 C doxygen 风格注释示例 ubuntu20 中 doxygen 文档生成 doxygen 官方文档 在 /Doxygen/Special Command/ 章节介绍 doxygen 的关键字 注释说明 注释的目的是提高代码的可读性与可维护性。 C 风格注释 // 单行注释/* 多行注释 */ C 风格注…

ESP32 步进电机精准控制:打造高精度 DIY 写字机器人,实现流畅书写体验

摘要: 想让你的 ESP32 不再仅仅是控制灯光的工具吗&#xff1f; 本文将带你使用 ESP32 开发板、步进电机和简单的机械结构打造一个能够自动写字的机器人。我们将深入浅出地讲解硬件连接、软件代码以及控制逻辑&#xff0c;并提供完整的项目代码和电路图&#xff0c;即使是 Ardu…

AI与编程:一个学生的心路历程与思考

前言 大家好&#xff0c;本人是在一个在校的大学生&#xff0c;方向是前端语言。爱好是码代码和看一点小新闻&#xff0c;游戏也是喜爱的。其实本篇文章的想法是源于网上一些人对AI以及对前端的看法&#xff0c;看完网上的评论后我也是有感而发。本篇文章的讨论中心也是围绕着A…

我国网络安全领域有哪些法律法规?主要内容是什么?

1. 背景介绍 网络信息安全方面的法规在全球范围内都有相应的立法&#xff0c;我们主要的立法有《网络安全法》、《密码法》、《数据安全法》以及《个人信息保护法》。当前也有一些相关的条例和管理办法&#xff0c;接下来就为大家一一介绍。 2. 法规介绍 在中国&#xff0c;…

昇思25天学习打卡营第14天|基于MindNLP的文本解码原理

基于MindNLP的文本解码原理 文本解码 文本解码是自然语言处理中的一个关键步骤,特别是在任务如机器翻译、文本摘要、自动回复生成等领域。解码过程涉及将编码器(如语言模型、翻译模型等)的输出转换为可读的文本序列。以下是一些常见的文本解码方法和原理: 1. 自回归解码:…

2.3.2 主程序和外部IO交互 (文件映射方式)----C#调用范例

2.3.2 主程序和外部IO交互 &#xff08;文件映射方式&#xff09;----C#调用范例 效果显示 1 说明 1 .1 Test_IOServer是64bit 程序&#xff0c; BD_SharedIOServerd.dll 在 /Debug文件夹中 1 .2 Test_IOServer是32bit 程序&#xff0c; BD_SharedIOClientd.dll (32bit&#…

安卓的组件

人不走空 &#x1f308;个人主页&#xff1a;人不走空 &#x1f496;系列专栏&#xff1a;算法专题 ⏰诗词歌赋&#xff1a;斯是陋室&#xff0c;惟吾德馨 目录 &#x1f308;个人主页&#xff1a;人不走空 &#x1f496;系列专栏&#xff1a;算法专题 ⏰诗词歌…

六、数据可视化—flask框架入门(爬虫及数据可视化)

六、数据可视化—flask框架入门&#xff08;爬虫及数据可视化&#xff09; 1&#xff0c;数据可视化简介2&#xff0c;flask&#xff08;1&#xff09;创建flask项目&#xff08;2&#xff09;开启debug模式&#xff08;3&#xff09;通过访问路径传递参数&#xff08;4&#x…

【鸿蒙学习笔记】页面布局

官方文档&#xff1a;布局概述 常见页面结构图 布局元素的组成 线性布局&#xff08;Row、Column&#xff09; 了解思路即可&#xff0c;更多样例去看官方文档 Entry Component struct PracExample {build() {Column() {Column({ space: 20 }) {Text(space: 20).fontSize(15)…

C语言 指针和数组——指针和二维数组之间的关系

目录 换个角度看二维数组 指向二维数组的行指针 按行指针访问二维数组元素 再换一个角度看二维数组 按列指针访问二维数组元素 二维数组作函数参数 指向二维数组的行指针作函数参数 指向二维数组的列指针作函数参数​编辑 用const保护你传给函数的数据 小结 换个角度看…

Mysql explain语句详解与实例展示

首先简单介绍sql&#xff1a; SQL语言共分为四大类&#xff1a;数据查询语言DQL&#xff0c;数据操纵语言DML&#xff0c;数据定义语言DDL&#xff0c;数据控制语言DCL。 1. 数据查询语言DQL 数据查询语言DQL基本结构是由SELECT子句&#xff0c;FROM子句&#xff0c;WHERE子句…

Kafka(一)基础介绍

一&#xff0c;Kafka集群 一个典型的 Kafka 体系架构包括若Producer、Broker、Consumer&#xff0c;以及一个ZooKeeper集群&#xff0c;如图所示。 ZooKeeper&#xff1a;Kafka负责集群元数据的管理、控制器的选举等操作的&#xff1b; Producer&#xff1a;将消息发送到Broker…

k8s学习之cobra命令库学习

1.前言 打开k8s代码的时候&#xff0c;我发现基本上那几个核心服务都是使用cobra库作为命令行处理的能力。因此&#xff0c;为了对代码之后的代码学习的有比较深入的理解&#xff0c;因此先基于这个库写个demo&#xff0c;加深对这个库的一些理解吧 2.cobra库的基本简介 Git…

《昇思 25 天学习打卡营第 11 天 | ResNet50 图像分类 》

《昇思 25 天学习打卡营第 11 天 | ResNet50 图像分类 》 活动地址&#xff1a;https://xihe.mindspore.cn/events/mindspore-training-camp 签名&#xff1a;Sam9029 计算机视觉-图像分类&#xff0c;很感兴趣 且今日精神颇佳&#xff0c;一个字&#xff0c;学啊 上一节&…

张量分解(1)——初探张量

&#x1f345; 写在前面 &#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;这里是hyk写算法了吗&#xff0c;一枚致力于学习算法和人工智能领域的小菜鸟。 &#x1f50e;个人主页&#xff1a;主页链接&#xff08;欢迎各位大佬光临指导&#xff09; ⭐️近…

MybatisPlus实现插入/修改数据自动设置时间

引言 插入数据时自动设置当前时间&#xff0c;更新数据时自动修改日期为修改时的日期。 使用MybatisPlus的扩展接口MetaObjectHandler 步骤 实现接口 实体类加注解 实现接口 package com.example.vueelementson.common;import com.baomidou.mybatisplus.core.handlers.M…

GraalVM上的多语言混合开发

上篇文件我们介绍了GraalVM强大的静态编译功能,能够让Java应用程序摆脱虚拟机的束缚,像其它本地编译的应用一样直接运行。那么GraalVM的神奇之处仅限于此吗?今天我们再来看看它的另一个重要特性—多语言混合开发 多语言平台 Java并不是唯一运行在JVM上的语言,这个我们都应…

Qt/C++音视频开发78-获取本地摄像头支持的分辨率/帧率/格式等信息/mjpeg/yuyv/h264

一、前言 上一篇文章讲到用ffmpeg命令方式执行打印到日志输出&#xff0c;可以拿到本地摄像头设备信息&#xff0c;顺藤摸瓜&#xff0c;发现可以通过执行 ffmpeg -f dshow -list_options true -i video“Webcam” 命令获取指定摄像头设备的分辨率帧率格式等信息&#xff0c;会…

ts-01.泛型(函数和接口)

泛型 泛的意思是:漂浮, 比如泛舟; 泛型: 类型漂浮未定 > 动态类型. 用于: 函数 接口 类 T extends string | number 泛型约束 function a<T any, K> (: number, value: T) { // 泛型参数设置默认值anyconst arr Array<T>(l).fill(value) // [foo, foo, foo] }…

IntelliJ IDEA菜单不见了设置找回方法

通过CtrAltS键按出设置 找到View,然后自定义一个快捷键,然后保存 使用自定义快捷键弹出改界面,点击Main Menu即可