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

2023-11-15 09:13:43 浏览数 (1)

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

  今天我要给大家分享一些自己日常学习到的一些知识点,并以文字的形式跟大家一起交流,互相学习,一个人虽可以走的更快,但一群人可以走的更远。

  我是一名后端开发爱好者,工作日常接触到最多的就是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 !!!

***

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

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

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

邀请人:“bug菌”

我正在参与2023腾讯技术创作特训营第三期有奖征文,组队打卡瓜分大奖!

0 人点赞