Java EnumMap

Java collections framework 的 EnumMap 类提供了一个用于枚举元素实现的映射。

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

Java EnumMap implements the Map interface.

在学习 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()HashMapTreeMap 等其他 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

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

  • Enum set 在内部表示为位序列,而 enum map 在内部表示为数组
  • Enum set 是使用其预定义方法(如 allOf()noneOf()of() 等)创建的。然而,enum map 是使用其构造函数创建的。

Clonable 和 Serializable 接口

EnumMap 类还实现了 CloneableSerializable 接口。

Cloneable 接口

它允许 EnumMap 类创建类的实例副本。

Serializable 接口

当 Java 对象需要通过网络传输时,对象需要被转换为比特或字节。这是因为 Java 对象无法在网络上传输。

Serializable 接口允许类被序列化。这意味着实现 Serializable 的类的对象可以被转换为比特或字节。

你觉得这篇文章有帮助吗?

我们的高级学习平台,凭借十多年的经验和数千条反馈创建。

以前所未有的方式学习和提高您的编程技能。

试用 Programiz PRO
  • 交互式课程
  • 证书
  • AI 帮助
  • 2000+ 挑战