Java集合框架的EnumMap
类为枚举的元素提供了一个映射实现。
在EnumMap
,枚举元素用作键 。它实现了Map接口。
在学习EnumMap
之前,请确保了解Java Enums。
创建一个EnumMap
为了创建一个枚举映射,我们必须首先导入java.util.EnumMap
包。导入程序包后,这就是我们可以用Java创建枚举映射的方法。
enum Size {
SMALL, MEDIUM, LARGE, EXTRALARGE
}
EnumMap sizes = new EnumMap<>(Size.class);
在上面的示例中,我们创建了一个名为size的枚举映射。
这里,
- 大小 -映射到值的枚举键
- 整数 -与对应键相关联的枚举映射的值
EnumMap的方法
EnumMap
类提供了使我们能够在枚举映射上执行各种元素的方法。
将元素插入EnumMap
-
put()
-将指定的键/值映射(条目)插入到枚举映射中
-
putAll()
-将指定映射的所有条目插入此映射
put()
-将指定的键/值映射(条目)插入到枚举映射中putAll()
-将指定映射的所有条目插入此映射例如,
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 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 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()
方法来插入一个枚举映射尺寸1到sizes2的枚举映射的所有元素。
也可以使用putAll()
将其他映射(例如HashMap
, TreeMap
等)中的元素插入到枚举映射中。但是,所有映射都应具有相同的枚举类型。
访问EnumMap元素
1.使用entrySet(),keySet()和values()
-
entrySet()
-返回枚举映射的所有键/值映射(条目)的集合 -
keySet()
-返回一个枚举映射的所有键的集合 -
values()
-返回一个枚举映射的所有值的集合
例如,
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 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 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)
-仅当指定键映射到指定值并返回布尔值时,才从映射中删除条目
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 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)
-用新值替换与指定键关联的值
-
replace(key, old, new)
-仅当旧值已与指定键关联时,才用新值替换旧值
-
replaceAll(function)
-用指定函数的结果替换映射的每个值
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 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);
}
}
replace(key, value)
-用新值替换与指定键关联的值 replace(key, old, new)
-仅当旧值已与指定键关联时,才用新值替换旧值replaceAll(function)
-用指定函数的结果替换映射的每个值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 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);
在此,该方法访问地图的所有条目。然后,它将所有值替换为lambda表达式提供的新值。
其他方法
Method | Description |
---|---|
clone() |
Creates a copy of the EnumMap |
containsKey() |
Searches the EnumMap for the specified key and returns a boolean result |
containsValue() |
Searches the EnumMap for the specified value and returns a boolean result |
size() |
Returns the size of the EnumMap |
clear() |
Removes all the entries from the EnumMap |
EnumSet与枚举地图
EnumSet和EnumMap
类都提供数据结构来存储枚举值。但是,它们之间存在一些主要差异。
- 枚举集在内部以位序列表示,而枚举图在内部以数组表示。
- 枚举集是使用其预定义的方法(例如
allOf()
,noneOf()
,of()
等)创建的。但是,枚举映射是使用其构造函数创建的。
可克隆和可序列化的接口
EnumMap
类还实现了Cloneable
和Serializable
接口。
克隆界面
它允许EnumMap
类制作该类实例的副本。
可序列化的接口
每当需要通过网络传输Java对象时,就需要将对象转换为位或字节。这是因为Java对象无法通过网络传输。
Serializable
接口允许对类进行序列化。这意味着可以将实现Serializable
的类的对象转换为位或字节。