原文: https://www.programiz.com/java-programming/enummap

在本教程中,我们将借助示例学习 Java EnumMap类及其操作。

Java 集合框架的EnumMap类为枚举的元素提供了映射实现。

EnumMap中,枚举元素用作。 它实现了Map接口

Java `EnumMap` - 图1

在学习EnumMap之前,请确保了解 Java 枚举


创建一个EnumMap

为了创建一个枚举映射,我们必须首先导入java.util.EnumMap包。 导入包后,可以使用以下方法在 Java 中创建枚举映射。

  1. enum Size {
  2. SMALL, MEDIUM, LARGE, EXTRALARGE
  3. }
  4. EnumMap<Size, Integer> sizes = new EnumMap<>(Size.class);

在上面的示例中,我们创建了一个名为sizes的枚举映射。

这里,

  • Size - 映射到值的枚举的
  • Integer - 与相应键关联的枚举映射的

EnumMap的方法

EnumMap类提供了允许我们在枚举映射上执行各种元素的方法。


将元素插入EnumMap

  • put() - 将指定的键/值映射(条目)插入到枚举映射中
  • putAll() - 将指定映射的所有条目插入此映射

例如,

  1. import java.util.EnumMap;
  2. class Main {
  3. enum Size {
  4. SMALL, MEDIUM, LARGE, EXTRALARGE
  5. }
  6. public static void main(String[] args) {
  7. // Creating an EnumMap of the Size enum
  8. EnumMap<Size, Integer> sizes1 = new EnumMap<>(Size.class);
  9. // Using the put() Method
  10. sizes1.put(Size.SMALL, 28);
  11. sizes1.put(Size.MEDIUM, 32);
  12. System.out.println("EnumMap1: " + sizes1);
  13. EnumMap<Size, Integer> sizes2 = new EnumMap<>(Size.class);
  14. // Using the putAll() Method
  15. sizes2.putAll(sizes1);
  16. sizes2.put(Size.LARGE, 36);
  17. System.out.println("EnumMap2: " + sizes2);
  18. }
  19. }

输出

  1. EnumMap1: {SMALL=28, MEDIUM=32}
  2. EnumMap2: {SMALL=28, MEDIUM=32, LARGE=36}

在上面的示例中,我们使用putAll()方法将枚举映射size1的所有元素插入到size2的枚举图中。

也可以使用putAll()将元素从其他映射(例如HashMapTreeMap等)插入到枚举映射中。 但是,所有映射都应具有相同的枚举类型。


访问EnumMap元素

1.使用entrySet()keySet()values()

  • entrySet() - 返回一个枚举映射的所有键/值映射(条目)的集合
  • keySet() - 返回一个枚举映射的所有键的集合
  • values() - 返回一个枚举映射的所有值的集合

例如:

  1. import java.util.EnumMap;
  2. class Main {
  3. enum Size {
  4. SMALL, MEDIUM, LARGE, EXTRALARGE
  5. }
  6. public static void main(String[] args) {
  7. // Creating an EnumMap of the Size enum
  8. EnumMap<Size, Integer> sizes = new EnumMap<>(Size.class);
  9. sizes.put(Size.SMALL, 28);
  10. sizes.put(Size.MEDIUM, 32);
  11. sizes.put(Size.LARGE, 36);
  12. sizes.put(Size.EXTRALARGE, 40);
  13. System.out.println("EnumMap: " + sizes);
  14. // Using the entrySet() Method
  15. System.out.println("Key/Value mappings: " + sizes.entrySet());
  16. // Using the keySet() Method
  17. System.out.println("Keys: " + sizes.keySet());
  18. // Using the values() Method
  19. System.out.println("Values: " + sizes.values());
  20. }
  21. }

输出

  1. EnumMap: {SMALL=28, MEDIUM=32, LARGE=36, EXTRALARGE=40}
  2. Key/Value mappings: [SMALL=28, MEDIUM=32, LARGE=36, EXTRALARGE=40]
  3. Keys: [SMALL, MEDIUM, LARGE, EXTRALARGE]
  4. Values: [28, 32, 36, 40]

2.使用get()方法

get()方法返回与指定键关联的值。 如果找不到指定的键,则返回null

例如:

  1. import java.util.EnumMap;
  2. class Main {
  3. enum Size {
  4. SMALL, MEDIUM, LARGE, EXTRALARGE
  5. }
  6. public static void main(String[] args) {
  7. // Creating an EnumMap of the Size enum
  8. EnumMap<Size, Integer> sizes = new EnumMap<>(Size.class);
  9. sizes.put(Size.SMALL, 28);
  10. sizes.put(Size.MEDIUM, 32);
  11. sizes.put(Size.LARGE, 36);
  12. sizes.put(Size.EXTRALARGE, 40);
  13. System.out.println("EnumMap: " + sizes);
  14. // Using the get() Method
  15. int value = sizes.get(Size.MEDIUM);
  16. System.out.println("Value of MEDIUM: " + value);
  17. }
  18. }

输出

  1. EnumMap: {SMALL=28, MEDIUM=32, LARGE=36, EXTRALARGE=40}
  2. Value of MEDIUM: 32

删除EnumMap元素

  • remove(key) - 返回并从映射中删除与指定键关联的条目
  • remove(key, value) - 仅当指定键映射到指定值并返回布尔值时,才从映射中删除条目

例如:

  1. import java.util.EnumMap;
  2. class Main {
  3. enum Size {
  4. SMALL, MEDIUM, LARGE, EXTRALARGE
  5. }
  6. public static void main(String[] args) {
  7. // Creating an EnumMap of the Size enum
  8. EnumMap<Size, Integer> sizes = new EnumMap<>(Size.class);
  9. sizes.put(Size.SMALL, 28);
  10. sizes.put(Size.MEDIUM, 32);
  11. sizes.put(Size.LARGE, 36);
  12. sizes.put(Size.EXTRALARGE, 40);
  13. System.out.println("EnumMap: " + sizes);
  14. // Using the remove() Method
  15. int value = sizes.remove(Size.MEDIUM);
  16. System.out.println("Removed Value: " + value);
  17. boolean result = sizes.remove(Size.SMALL, 28);
  18. System.out.println("Is the entry {SMALL=28} removed? " + result);
  19. System.out.println("Updated EnumMap: " + sizes);
  20. }
  21. }

输出

  1. EnumMap: {SMALL=28, MEDIUM=32, LARGE=36, EXTRALARGE=40}
  2. Removed Value: 32
  3. Is the entry {SMALL=28} removed? True
  4. Updated EnumMap: {LARGE=36, EXTRALARGE=40}

替换EnumMap元素

  • replace(key, value) - 用新的value替换与指定的key相关的值
  • replace(key, old, new) - 仅当old值已与指定的key关联时,才用new值替换old值。
  • replaceAll(function) - 用指定的function的结果替换映射的每个值
  1. import java.util.EnumMap;
  2. class Main {
  3. enum Size {
  4. SMALL, MEDIUM, LARGE, EXTRALARGE
  5. }
  6. public static void main(String[] args) {
  7. // Creating an EnumMap of the Size enum
  8. EnumMap<Size, Integer> sizes = new EnumMap<>(Size.class);
  9. sizes.put(Size.SMALL, 28);
  10. sizes.put(Size.MEDIUM, 32);
  11. sizes.put(Size.LARGE, 36);
  12. sizes.put(Size.EXTRALARGE, 40);
  13. System.out.println("EnumMap: " + sizes);
  14. // Using the replace() Method
  15. sizes.replace(Size.MEDIUM, 30);
  16. sizes.replace(Size.LARGE, 36, 34);
  17. System.out.println("EnumMap using replace(): " + sizes);
  18. // Using the replaceAll() Method
  19. sizes.replaceAll((key, oldValue) -> oldValue + 3);
  20. System.out.println("EnumMap using replaceAll(): " + sizes);
  21. }
  22. }

输出

  1. EnumMap: {SMALL=28, MEDIUM=32, LARGE=36, EXTRALARGE=40}
  2. EnumMap using replace(): {SMALL=28, MEDIUM=30, LARGE=34, EXTRALARGE=40}
  3. EnumMap using replaceAll(): {SMALL=31, MEDIUM=33, LARGE=37, EXTRALARGE=43}

在上面的程序中,请注意以下语句

  1. sizes.replaceAll((key, oldValue) -> oldValue + 3);

在此,该方法访问映射的所有条目。 然后,它将所有值替换为 lambda 表达式提供的新值。


其他方法

方法 描述
clone() 创建EnumMap的副本
containsKey() EnumMap中搜索指定的键,并返回布尔结果
containsValue() EnumMap中搜索指定的值并返回布尔结果
size() 返回EnumMap的大小
clear() EnumMap中删除所有条目

EnumSetEnumMap

EnumSetEnumMap类都提供用于存储枚举值的数据结构。 但是,它们之间存在一些主要差异。

  • 枚举集在内部以位序列表示,而枚举图在内部以数组表示。
  • 枚举集是使用其预定义方法(例如allOf()noneOf()of()等)创建的。但是,枚举映射是使用其构造器创建的。

CloneableSerializable接口

EnumMap类还实现CloneableSerializable接口。

Cloneable接口

它允许EnumMap类制作该类实例的副本。

Serializable接口

每当需要通过网络传输 Java 对象时,就需要将对象转换为位或字节。 这是因为 Java 对象无法通过网络传输。

Serializable接口允许对类进行序列化。 这意味着可以将实现Serializable的类的对象转换为位或字节。