文
章
目
录
章
目
录
让我们深入了解如何创建和详细使用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。