Java EnumMap详解

培训教学 潘老师 7个月前 (10-13) 140 ℃ (0) 扫码查看

让我们深入了解如何创建和详细使用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.panziye.com/teach/9512.html
喜欢 (0)
请潘老师喝杯Coffee吧!】
分享 (0)
用户头像
发表我的评论
取消评论
表情 贴图 签到 代码

Hi,您需要填写昵称和邮箱!

  • 昵称【必填】
  • 邮箱【必填】
  • 网址【可选】