哈喽,各位小伙伴们好,我是喵手。
今天我要给大家分享一些自己日常学习到的一些知识点,并以文字的形式跟大家一起交流学习,互相学习,才能成长的更快,对吧。
我是一名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 !!!
⭐️若喜欢我,就请关注我叭。
⭐️若对您有用,就请点赞叭。
⭐️若有疑问,就请评论留言告诉我叭。