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

哈喽,各位小伙伴们好,我是喵手。

今天我要给大家分享一些自己日常学习到的一些知识点,并以文字的形式跟大家一起交流学习,互相学习,才能成长的更快,对吧。

我是一名java开发,所以日常接触到最多的就是java啦,所以我趁自己有空,就来好好回忆,把自己学到的会的,进行输出,不图什么有回报,只想能帮助到更多的小伙伴,就好。

小伙伴们在批阅的过程中,如果觉得文章不错,欢迎点赞、收藏、关注哦。三连即是对喵手我创作道路上最好的鼓励与支持!

前言

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

摘要

本篇文章主要介绍Java中的EnumMap,包括EnumMap的概念、使用方法、实现原理以及一些例子。EnumMap是一种基于枚举类型的Map实现,它具有非常高的性能和可读性。在使用EnumMap时,需要先定义枚举类型,然后利用枚举类型来创建EnumMap的实例。EnumMap的实现采用了一种非常高效的方式,它使用一个数组来存储Map中的键值对,并且可以保证枚举类型中的所有值都被覆盖到。在实际开发中,EnumMap可以用于替代一些需要使用switch语句或if语句的场合,从而提高代码的可读性和性能。

内容

什么是EnumMap

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

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

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

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

EnumMap的主要特点如下:

  • EnumMap是一种基于枚举类型的Map实现。
  • EnumMap中的键必须是枚举类型。
  • EnumMap中的值可以是任意类型。
  • EnumMap中的键值对是有序的,它们的顺序是根据枚举类型中定义的顺序来排序的。
  • EnumMap的实现采用了一种非常高效的方式,它使用一个数组来存储Map中的键值对,并且可以保证枚举类型中的所有值都被覆盖到。

如何使用EnumMap

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

java 复制代码
@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public class EnumMapTest {

    enum Color {
        RED, GREEN, BLUE
    }
    
    @Test
    public 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输出到控制台中,可以看到输出结果如下:

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

EnumMap的实现原理

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

数组

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

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

EnumMap的例子

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

java 复制代码
interface Command {
    void execute();
}

class StartCommand implements Command {
    @Override
    public void execute() {
        System.out.println("Start command executed");
    }
}

class StopCommand implements Command {
    @Override
    public 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接口以及两个具体的命令实现类:StartCommand和StopCommand。然后,利用EnumMap将CommandType枚举类型的值和具体的命令实现类映射起来。最后,在main()方法中,从EnumMap中获取StartCommand和StopCommand实例,并执行它们的execute()方法。

测试用例

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

java 复制代码
@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public class EnumMapTest {

    enum Weekday {
        MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY
    }

    @Test
    public 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实例。

测试结果如下:

小结

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

... ...

最后

好啦,以上就是我这期的全部内容,如果有任何疑问,欢迎下方留言哦,咱们下期见。

... ...

学习不分先后,知识不分多少;事无巨细,当以虚心求教;三人行,必有我师焉!!!

wished for you successed !!!


⭐️若喜欢我,就请关注我叭。

⭐️若对您有用,就请点赞叭。

⭐️若有疑问,就请评论留言告诉我叭。

相关推荐
counting money6 小时前
Tomcat 专题:从基础架构到性能调优与 WebSocket 实战
java·websocket·tomcat
xiaohaiAIgeo7 小时前
【2026年】HG/T 20656-2024化工暖通空调设计规范:新版标准的变化与影响
java·前端·javascript·科普知识
weixin_431600447 小时前
NestJS 入门(7):生命周期钩子——构造函数和 `OnModuleInit` 差在哪?
前端·后端·学习·node.js·nest.js
小强库计算机毕业设计7 小时前
基于 Spring Boot + Vue3 的校园管理系统
java·spring boot·后端·项目实战·管理系统·技术分享·校园管理系统实战
霸道流氓气质7 小时前
Java中信号量(Semaphore):从本地到分布式
java·开发语言·分布式
怪奇云呼军7 小时前
G.711、Opus 和重采样会拖慢识别吗?闪电智能VoiceAgent 的音频入口怎么选
java·人工智能·python·算法·云计算·音视频
编程令我快乐7 小时前
maven部分构建参数讲解
java·maven
ZC跨境爬虫7 小时前
LeetCode 27. 移除元素(双指针详解 + Java Python 多解法对比)
java·python·leetcode
canonical_entropy7 小时前
关于《Mission Driver:Loop Engineering 的一种通用参考实现》的补充说明
后端·agent·ai编程
__zRainy__8 小时前
Node系列 · Node基础:Node.js 概述
后端·node.js