Java EnumMap

EnumMap 是一个特殊的 Map 类型,它的键必须是枚举类型的。在本教程中,我们将通过示例学习 Java EnumMap 类及其用法。

在本教程中,我们将通过示例学习 Java EnumMap 类及其用法。

EnumMap 是一个特殊的 Map 类型,它的键必须是枚举类型的。 EnumMap 实现了 Map 接口

在我们了解 EnumMap 之前,请务必了解 Java 枚举

创建 EnumMap

我们导入 java.util.EnumMap 类后,就可以通过构造方法创建 EnumMap 对象了。例如:

enum Size {
    SMALL, MEDIUM, LARGE, EXTRALARGE
}

EnumMap<Size, Integer> sizes = new EnumMap<>(Size.class);

在上面的例子中,我们创建了一个名为 sizes 的 EnumMap 对象。

这里,

  • Size - Map 中的类型是枚举类型 Size
  • Integer - Map 中的类型是 Integer

EnumMap 的方法

EnumMap 类提供了操作 EnumMap 元素的各种方法。

将元素插入到 EnumMap

  • put() - 将指定的键值对条目插入到 Map 中
  • putAll() - 将指定 Map 中的所有条目插入到 Map 中
  • putIfAbsent() - 如果 Map 中不存在指定的键,则将指定的键值对条目插入到 Map 中

例如,

import java.util.EnumMap;

public class Main {
  enum Size {
    SMALL, MEDIUM, LARGE, EXTRALARGE
  }

  public static void main(String[] args) {
    EnumMap<Size, Integer> sizes1 = new EnumMap<>(Size.class);

    // 添加元素
    sizes1.put(Size.SMALL, 28);
    sizes1.put(Size.MEDIUM, 32);
    System.out.println("EnumMap1: " + sizes1);

    EnumMap<Size, Integer> sizes2 = new EnumMap<>(Size.class);

    // 添加多个元素
    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()sizes1 中的元素全部插入到 sizes2 中。

另外,也可以使用 putAll() 插入来自其他类型的 Map 对象到 EnumMap 中,如 HashMapTreeMap 等,。但是,所有 Map 的键的类型都和目标 EnumMap 的键的类型一样。

entrySet()、keySet() 和 values()

  • entrySet() - 返回 EnumMap 的所有键值对条目的 Set 集合
  • keySet() - 返回 EnumMap 的所有键组成的 Set 集合
  • values() - 返回 EnumMap 的所有值组成的集合

例如,

import java.util.EnumMap;

public class Main {
  enum Size {
    SMALL, MEDIUM, LARGE, EXTRALARGE
  }

  public static void main(String[] args) {
    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);

    System.out.println("Key/Value mappings: " + sizes.entrySet());
    System.out.println("Keys: " + sizes.keySet());
    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]

get() 方法

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

例如,

import java.util.EnumMap;

public class Main {
  enum Size {
    SMALL, MEDIUM, LARGE, EXTRALARGE
  }

  public static void main(String[] args) {
    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);

    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) - 删除与指定键和指定值匹配的条目,成功返回 true,否则返回 false

例如,

import java.util.EnumMap;

public class Main {
  enum Size {
    SMALL, MEDIUM, LARGE, EXTRALARGE
  }

  public static void main(String[] args) {
    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);

    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;

public class Main {
  enum Size {
    SMALL, MEDIUM, LARGE, EXTRALARGE
  }

  public static void main(String[] args) {
    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);

    // replace()
    sizes.replace(Size.MEDIUM, 30);
    sizes.replace(Size.LARGE, 36, 34);
    System.out.println("EnumMap using replace(): " + sizes);

    // replaceAll()
    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 表达式作为参数。

EnumMap 的其他方法

  • clear(): 从 EnumMap 中删除所有条目
  • containsKey(): 检查 EnumMap 是否包含指定的键
  • containsValue(): 检查 EnumMap 是否包含指定的值
  • size(): 返回 EnumMap 的大小
  • isEmpty(): 检查 EnumMap 是否为空