Java 基础教程

Java 流程控制

Java 数组

Java 面向对象(I)

Java 面向对象(II)

Java 面向对象(III)

Java 异常处理

Java 列表(List)

Java Queue(队列)

Java Map集合

Java Set集合

Java 输入输出(I/O)

Java Reader/Writer

Java 其他主题

Java EnumMap

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

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

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

Java EnumMap实现Map接口。

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

创建一个EnumMap

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

enum Size {
    SMALL, MEDIUM, LARGE, EXTRALARGE
}

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

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

这里,

  • Size - 映射到值的枚举的

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

EnumMap的方法

EnumMap类提供了一些方法,允许我们对枚举映射执行各种元素。

将元素插入EnumMap

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

  • putAll() - 将指定映射的所有条目插入此映射

例如,

import java.util.EnumMap;

class Main {

    enum Size {
        SMALL, MEDIUM, LARGE, EXTRALARGE
    }
    public static void main(String[] args) {

        //创建一个为size枚举的EnumMap
        EnumMap<Size, Integer> sizes1 = new EnumMap<>(Size.class);

        // 使用 put() 方法
        sizes1.put(Size.SMALL, 28);
        sizes1.put(Size.MEDIUM, 32);
        System.out.println("EnumMap1: " + sizes1);

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

        // 使用 putAll() 方法
        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()方法将枚举映射size1的所有元素插入到size2的枚举映射中。

还可以使用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) {

        // 创建Size枚举的EnumMap
        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);

        // 使用 entrySet() 方法
        System.out.println("Key/Value 映射: " + sizes.entrySet());

        // 使用 keySet() 方法
        System.out.println("Keys: " + sizes.keySet());

        // 使用 values() 方法
        System.out.println("Values: " + sizes.values());
    }
}

输出结果

EnumMap: {SMALL=28, MEDIUM=32, LARGE=36, EXTRALARGE=40}
Key/Value 映射: [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) {

        // 创建Size枚举的EnumMap
        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);

        // 使用 get() 方法
        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) {

        // 创建Size枚举的EnumMap
        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);

        // 使用 remove() 方法
        int value = sizes.remove(Size.MEDIUM);
        System.out.println("删除值: " + value);

        boolean result = sizes.remove(Size.SMALL, 28);
        System.out.println("条目 {SMALL=28} 被删除? " + result);

        System.out.println("更新后的EnumMap: " + sizes);
    }
}

输出结果

EnumMap: {SMALL=28, MEDIUM=32, LARGE=36, EXTRALARGE=40}
删除值: 32
条目 {SMALL=28} 被删除? True
更新后的EnumMap: {LARGE=36, EXTRALARGE=40}

替换 EnumMap 元素

  • replace(key, value) - 将键key关联的值替换为value

  • replace(key, old, new) -  仅当old值已与指定键key关联时,才用new值替换old值

  • replaceAll(function) - 用指定函数的结果替换映射的每个值

import java.util.EnumMap;

class Main {

    enum Size {
        SMALL, MEDIUM, LARGE, EXTRALARGE
    }
    public static void main(String[] args) {

        // 创建Size枚举的EnumMap
        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 使用方法 replace(): " + sizes);

        // 使用 replaceAll() 方法
        sizes.replaceAll((key, oldValue) -> oldValue + 3);
        System.out.println("EnumMap 使用方法 replaceAll(): " + sizes);
    }
}

输出结果

EnumMap: {SMALL=28, MEDIUM=32, LARGE=36, EXTRALARGE=40}
EnumMap 使用方法 replace(): {SMALL=28, MEDIUM=30, LARGE=34, EXTRALARGE=40}
EnumMap 使用方法 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集合是使用预定义的方法创建的,如allOf()、noneOf()、of()等。但是,枚举映射是使用其构造函数创建的。

Cloneable 和 Serializable的接口

EnumMap类还实现了Cloneable和Serializable接口。

Cloneable 克隆接口

它允许EnumMap类复制类的实例。

Serializable 可序列化的接口

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

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