Java collections framework 的 EnumMap
类提供了一个用于枚举元素实现的映射。
在 EnumMap
中,枚举元素用作键。它实现了 Map
接口。

在学习 EnumMap
之前,请确保您了解 Java 枚举。
创建 EnumMap
为了创建 enum map,我们必须首先导入 java.util.EnumMap
包。导入包后,我们可以在 Java 中创建 enum map。
enum Size {
SMALL, MEDIUM, LARGE, EXTRALARGE
}
EnumMap<Size, Integer> sizes = new EnumMap<>(Size.class);
在上面的示例中,我们创建了一个名为 sizes
的 enum map。
这里,
- Size - 枚举的键,映射到值
- Integer - enum map 的值,与相应的键关联
EnumMap 的方法
EnumMap
类提供的方法允许我们对 enum maps 执行各种操作。
向 EnumMap 插入元素
put()
- 将指定的键/值映射(条目)插入到 enum map 中putAll()
- 将指定 map 的所有条目插入到此 map 中
例如,
import java.util.EnumMap;
class Main {
enum Size {
SMALL, MEDIUM, LARGE, EXTRALARGE
}
public static void main(String[] args) {
// Creating an EnumMap of the Size enum
EnumMap<Size, Integer> sizes1 = new EnumMap<>(Size.class);
// Using the put() Method
sizes1.put(Size.SMALL, 28);
sizes1.put(Size.MEDIUM, 32);
System.out.println("EnumMap1: " + sizes1);
EnumMap<Size, Integer> sizes2 = new EnumMap<>(Size.class);
// Using the putAll() Method
sizes2.putAll(sizes1);
sizes2.put(Size.LARGE, 36);
System.out.println("EnumMap2: " + sizes2);
}
}
输出
EnumMap1: {SMALL=28, MEDIUM=32} EnumMap2: {SMALL=28, MEDIUM=32, LARGE=36}
在上面的示例中,我们使用 putAll()
方法将 enum map sizes1
的所有元素插入到 sizes2
的 enum map 中。
也可以使用 putAll()
将 HashMap
、TreeMap
等其他 map 的元素插入到 enum map 中。但是,所有 map 都必须是相同的 enum 类型。
访问 EnumMap 元素
1. 使用 entrySet()、keySet() 和 values()
entrySet()
- 返回 enum map 的所有键/值映射(条目)的集合keySet()
- 返回 enum map 的所有键的集合values()
- 返回 enum map 的所有值的集合
例如,
import java.util.EnumMap;
class Main {
enum Size {
SMALL, MEDIUM, LARGE, EXTRALARGE
}
public static void main(String[] args) {
// Creating an EnumMap of the Size enum
EnumMap<Size, Integer> sizes = new EnumMap<>(Size.class);
sizes.put(Size.SMALL, 28);
sizes.put(Size.MEDIUM, 32);
sizes.put(Size.LARGE, 36);
sizes.put(Size.EXTRALARGE, 40);
System.out.println("EnumMap: " + sizes);
// Using the entrySet() Method
System.out.println("Key/Value mappings: " + sizes.entrySet());
// Using the keySet() Method
System.out.println("Keys: " + sizes.keySet());
// Using the values() Method
System.out.println("Values: " + sizes.values());
}
}
输出
EnumMap: {SMALL=28, MEDIUM=32, LARGE=36, EXTRALARGE=40} Key/Value mappings: [SMALL=28, MEDIUM=32, LARGE=36, EXTRALARGE=40] Keys: [SMALL, MEDIUM, LARGE, EXTRALARGE] Values: [28, 32, 36, 40]
2. 使用 get() 方法
get()
方法返回与指定键关联的值。如果找不到指定的键,则返回 null
。
例如,
import java.util.EnumMap;
class Main {
enum Size {
SMALL, MEDIUM, LARGE, EXTRALARGE
}
public static void main(String[] args) {
// Creating an EnumMap of the Size enum
EnumMap<Size, Integer> sizes = new EnumMap<>(Size.class);
sizes.put(Size.SMALL, 28);
sizes.put(Size.MEDIUM, 32);
sizes.put(Size.LARGE, 36);
sizes.put(Size.EXTRALARGE, 40);
System.out.println("EnumMap: " + sizes);
// Using the get() Method
int value = sizes.get(Size.MEDIUM);
System.out.println("Value of MEDIUM: " + value);
}
}
输出
EnumMap: {SMALL=28, MEDIUM=32, LARGE=36, EXTRALARGE=40} Value of MEDIUM: 32
删除 EnumMap 元素
remove(key)
- 返回并从映射中移除与指定键关联的条目remove(key, value)
- 仅当指定键映射到指定值时才从映射中移除该条目,并返回一个布尔值
例如,
import java.util.EnumMap;
class Main {
enum Size {
SMALL, MEDIUM, LARGE, EXTRALARGE
}
public static void main(String[] args) {
// Creating an EnumMap of the Size enum
EnumMap<Size, Integer> sizes = new EnumMap<>(Size.class);
sizes.put(Size.SMALL, 28);
sizes.put(Size.MEDIUM, 32);
sizes.put(Size.LARGE, 36);
sizes.put(Size.EXTRALARGE, 40);
System.out.println("EnumMap: " + sizes);
// Using the remove() Method
int value = sizes.remove(Size.MEDIUM);
System.out.println("Removed Value: " + value);
boolean result = sizes.remove(Size.SMALL, 28);
System.out.println("Is the entry {SMALL=28} removed? " + result);
System.out.println("Updated EnumMap: " + sizes);
}
}
输出
EnumMap: {SMALL=28, MEDIUM=32, LARGE=36, EXTRALARGE=40} Removed Value: 32 Is the entry {SMALL=28} removed? True Updated EnumMap: {LARGE=36, EXTRALARGE=40}
替换 EnumMap 元素
replace(key, value)
- 用新的 value 替换与指定 key 关联的值replace(key, old, new)
- 仅当 old 值已与指定 key 关联时,才用 new 值替换 old 值replaceAll(function)
- 用指定 function 的结果替换 map 的每个值
import java.util.EnumMap;
class Main {
enum Size {
SMALL, MEDIUM, LARGE, EXTRALARGE
}
public static void main(String[] args) {
// Creating an EnumMap of the Size enum
EnumMap<Size, Integer> sizes = new EnumMap<>(Size.class);
sizes.put(Size.SMALL, 28);
sizes.put(Size.MEDIUM, 32);
sizes.put(Size.LARGE, 36);
sizes.put(Size.EXTRALARGE, 40);
System.out.println("EnumMap: " + sizes);
// Using the replace() Method
sizes.replace(Size.MEDIUM, 30);
sizes.replace(Size.LARGE, 36, 34);
System.out.println("EnumMap using replace(): " + sizes);
// Using the replaceAll() Method
sizes.replaceAll((key, oldValue) -> oldValue + 3);
System.out.println("EnumMap using replaceAll(): " + sizes);
}
}
输出
EnumMap: {SMALL=28, MEDIUM=32, LARGE=36, EXTRALARGE=40} EnumMap using replace(): {SMALL=28, MEDIUM=30, LARGE=34, EXTRALARGE=40} EnumMap using replaceAll(): {SMALL=31, MEDIUM=33, LARGE=37, EXTRALARGE=43}
在上面的程序中,请注意语句
sizes.replaceAll((key, oldValue) -> oldValue + 3);
在这里,该方法访问 map 的所有条目。然后,它使用 lambda 表达式提供的新值替换所有值。
其他方法
方法 | 描述 |
---|---|
clone() |
创建 EnumMap 的副本 |
containsKey() |
搜索 EnumMap 是否包含指定的键,并返回布尔值结果 |
containsValue() |
搜索 EnumMap 是否包含指定的值,并返回布尔值结果 |
size() |
返回 EnumMap 的大小 |
clear() |
从 EnumMap 中删除所有条目 |
EnumSet 与 EnumMap
EnumSet
和 EnumMap
类都提供了存储枚举值的数据结构。但是,它们之间存在一些主要差异。
- Enum set 在内部表示为位序列,而 enum map 在内部表示为数组。
- Enum set 是使用其预定义方法(如
allOf()
、noneOf()
、of()
等)创建的。然而,enum map 是使用其构造函数创建的。
Clonable 和 Serializable 接口
EnumMap
类还实现了 Cloneable
和 Serializable
接口。
Cloneable 接口
它允许 EnumMap
类创建类的实例副本。
Serializable 接口
当 Java 对象需要通过网络传输时,对象需要被转换为比特或字节。这是因为 Java 对象无法在网络上传输。
Serializable
接口允许类被序列化。这意味着实现 Serializable
的类的对象可以被转换为比特或字节。