⭐⭐⭐ Spring Boot 项目实战 ⭐⭐⭐ Spring Cloud 项目实战
《Dubbo 实现原理与源码解析 —— 精品合集》 《Netty 实现原理与源码解析 —— 精品合集》
《Spring 实现原理与源码解析 —— 精品合集》 《MyBatis 实现原理与源码解析 —— 精品合集》
《Spring MVC 实现原理与源码解析 —— 精品合集》 《数据库实体设计合集》
《Spring Boot 实现原理与源码解析 —— 精品合集》 《Java 面试题 + Java 学习指南》

摘要: 原创出处 juejin.cn/post/7276694924137693218 「喵手」欢迎转载,保留摘要,谢谢!


🙂🙂🙂关注微信公众号:【芋道源码】有福利:

  1. RocketMQ / MyCAT / Sharding-JDBC 所有源码分析文章列表
  2. RocketMQ / MyCAT / Sharding-JDBC 中文注释源码 GitHub 地址
  3. 您对于源码的疑问每条留言都将得到认真回复。甚至不知道如何读源码也可以请教噢。
  4. 新的源码解析文章实时收到通知。每周更新一篇左右。
  5. 认真的源码交流微信群。

前言

在Java中,枚举类型是一种非常有用的数据类型,它可以用于定义一组固定的常量。枚举类型在很多场景中都有广泛的应用,例如状态码、命令等。

在Java中,EnumMap是一种基于枚举类型的Map实现,它具有非常高的性能和可读性。在本篇文章中,我们将会介绍EnumMap的概念、使用方法和实现原理,并且会通过一些例子来展示EnumMap的使用。

摘要

本篇文章主要介绍Java中的EnumMap,包括EnumMap的概念、使用方法、实现原理以及一些例子。EnumMap是一种基于枚举类型的Map实现,它具有非常高的性能和可读性。在使用EnumMap时,需要先定义枚举类型,然后利用枚举类型来创建EnumMap的实例。

EnumMap的实现采用了一种非常高效的方式,它使用一个数组来存储Map中的键值对,并且可以保证枚举类型中的所有值都被覆盖到。在实际开发中,EnumMap可以用于替代一些需要使用switch语句或if语句的场合,从而提高代码的可读性和性能。

内容

什么是EnumMap

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

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

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的例子:

@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将不同的命令和具体的实现类映射起来。

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的基本功能:

@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是非常便捷和高效的,尤其适合用于枚举类型作为键的情况。

文章目录
  1. 1. 前言
  2. 2. 摘要
  3. 3. 内容
    1. 3.1. 什么是EnumMap
    2. 3.2. 如何使用EnumMap
    3. 3.3. EnumMap的实现原理
    4. 3.4. EnumMap的例子
    5. 3.5. 测试用例
  4. 4. 小结