行业资讯 2025年08月6日
0 收藏 0 点赞 717 浏览 3130 个字
摘要 :

文章目录 1.Java EnumMap 介绍 2.使用EnumMap 2.1 创建EnumMap 2.2 EnumMap方法 3.Java EnumMap和HashMap的区别 3.1 创建 3.2 NULL键 3.3. 内部实现 3.4. 元素顺序 3……




  • 1.Java EnumMap 介绍
  • 2.使用EnumMap
    • 2.1 创建EnumMap
    • 2.2 EnumMap方法
  • 3.Java EnumMap和HashMap的区别
    • 3.1 创建
    • 3.2 NULL键
    • 3.3. 内部实现
    • 3.4. 元素顺序
    • 3.5. 性能
  • 4.结论

让我们深入了解如何创建和详细使用Java EnumMap,了解它与HashMap的区别,以及探索实际用例。

1.Java EnumMap 介绍

EnumMap是一个专门的Map实现,它使用枚举类型作为键。创建该Map时,所有的键必须来自同一个枚举类型,无论是显式还是隐式。

enum Direction {
  EAST, WEST, NORTH, SOUTH
}

EnumMap<Direction, Boolean> allowedDirectionsMap = new EnumMap<>(Direction.class);
allowedDirectionsMap.put(Direction.EAST, true);

EnumMap类(位于java.util包中)扩展了AbstractMap类,自Java 1.5以来就一直存在。

  • 这个类使用枚举类型作为其键,EnumMap实例的所有键必须是同一个枚举类型。
  • EnumMap中的所有元素按照映射键的自然顺序排列(即按照枚举类型中声明枚举常量的顺序)。
  • 它不是线程安全的类。要获得这个类的线程安全引用,请使用Collections.synchronizedMap()。
  • 在迭代期间尝试修改映射时,它的迭代器不会引发ConcurrentModificationException。

在Java集合中,该类的声明如下:

public class EnumMap<K extends Enum<K>, V> extends AbstractMap<K, V> implements Serializable, Cloneable

2.使用EnumMap

2.1 创建EnumMap

我们可以使用以下构造函数创建EnumMap:

  • EnumMap(Class keyType):用于创建具有指定keyType的空映射。
  • EnumMap(EnumMap m):用于创建具有与指定Enum Map相同的键类型的映射。
  • EnumMap(Map m):用于从指定的映射初始化Enum Map。
EnumMap<Direction, Boolean> allowedDirectionsMap = new EnumMap<>(Direction.class);
EnumMap<Direction, Boolean> newMap = new EnumMap<>(allowedDirectionsMap);
EnumMap<Direction, Boolean> newMapFromAnotherMap = new EnumMap<>(Map.of(EAST, true));

2.2 EnumMap方法

EnumMap支持Map接口中可用的所有标准方法。

  • Object put(key, value):将键值对插入映射中。
  • Object get(key):返回映射中指定键的值。
  • boolean containsKey(key):根据指定的键是否在映射中找到返回true或false。
  • boolean containsValue(value):类似于containsKey()方法,它查找指定值而不是键。
  • Set keySet():返回映射中存储的所有键的集合。
  • Set entrySet():返回映射中存储的所有映射的集合。
  • Value remove(Object key):删除指定键的键值对。
  • int size():返回与映射中存储的键值对数量相等的映射大小。
public enum Planet
{
   MERCURY, VENUS, EARTH, MARS, JUPITER
}
// Creating EnumMap
EnumMap<Planet, String> map = new EnumMap<>(Planet.class);
// Putting elements in map
map.put(Planet.MERCURY, “Closest Planet to Sun”);
map.put(Planet.JUPITER, “Largest Planet”);
map.put(Planet.VENUS, “Hottest Planet”);
System.out.println(map);       // {MERCURY=Closest Planet to Sun, VENUS=Hottest Planet, JUPITER=Largest Planet}
// Getting a value from the map
System.out.println(map.get(Planet.VENUS));     // Hottest Planet
// Checking if a key or value present in the map
System.out.println(map.containsKey(Planet.JUPITER));       // true
System.out.println(map.containsValue(“Red Planet”));       // false
// Removing an entry
map.remove(Planet.MERCURY);
// Finding map size
System.out.println(map.size());      // 2
// Iterating over the map
for(Map.Entry<Planet, String> entry : map.entrySet())
{
    System.out.println(entry.getKey() + \" :: \" + entry.getValue());
}

3.Java EnumMap和HashMap的区别

3.1 创建

  • 在EnumMap中,只允许枚举类型的键。此外,在创建映射时需要在构造函数中指定键类型。
  • 在HashMap中,允许所有类型的键,包括枚举。
// EnumMap Creation
EnumMap<Planet, String> enumMap = new EnumMap<>(Planet.class);
// HashMap Creation
HashMap<String, String> hashMap = new HashMap<>();

3.2 NULL键

  • EnumMap不允许空键,但支持任意数量的空值。它在运行时抛出NullPointerException。
  • HashMap支持一个空键和任意数量的空值。
EnumMap<Planet, String> map = new EnumMap<>(Planet.class);
map.put(null, \"value1\");   //抛NullPointerException

3.3. 内部实现

EnumMap在内部使用数组,而HashMap使用哈希表并基于哈希技术。

3.4. 元素顺序

  • EnumMap中的元素按照键的自然顺序排列,即按照枚举类型中声明的键/常量的顺序。
  • HashMap不维护其键的任何顺序,因此无法保证在迭代期间首先插入映射的元素将首先检索。

3.5. 性能

与HashMap相比,EnumMap性能更好,原因如下:

  • EnumMap在内部由数组支持,并在使用put()方法插入元素时使用ordinal()方法,从而消除了在HashMap中很常见的哈希冲突的机会,因为HashMap使用hashCode()方法来插入元素。
  • 在EnumMap中,由于它使用枚举常量作为键,键是预先知道的。因此,它在性能优化方面比HashMap更有优势。

4.结论

我们学习了Java中的Enum Map,它的构造函数、基本方法以及与HashMap的区别。我们还覆盖了关于Enum Map的实际示例以及如何从其他映射中创建Enum Map。

微信扫一扫

支付宝扫一扫

版权: 转载请注明出处:https://www.zuozi.net/9389.html

管理员

相关推荐
2025-08-06

文章目录 一、Reader 接口概述 1.1 什么是 Reader 接口? 1.2 Reader 与 InputStream 的区别 1.3 …

988
2025-08-06

文章目录 一、事件溯源 (一)核心概念 (二)Kafka与Golang的优势 (三)完整代码实现 二、命令…

465
2025-08-06

文章目录 一、证明GC期间执行native函数的线程仍在运行 二、native线程操作Java对象的影响及处理方…

348
2025-08-06

文章目录 一、事务基础概念 二、MyBatis事务管理机制 (一)JDBC原生事务管理(JdbcTransaction)…

456
2025-08-06

文章目录 一、SnowFlake算法核心原理 二、SnowFlake算法工作流程详解 三、SnowFlake算法的Java代码…

517
2025-08-06

文章目录 一、本地Jar包的加载操作 二、本地Class的加载方法 三、远程Jar包的加载方式 你知道Groo…

832
发表评论
暂无评论

还没有评论呢,快来抢沙发~

助力内容变现

将您的收入提升到一个新的水平

点击联系客服

在线时间:08:00-23:00

客服QQ

122325244

客服电话

400-888-8888

客服邮箱

122325244@qq.com

扫描二维码

关注微信客服号