📜  Java EnumMap

📅  最后修改于: 2020-09-26 14:26:42             🧑  作者: Mango

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

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

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

Java 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() -将指定映射的所有条目插入此映射

例如,

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()方法来插入一个枚举映射尺寸1sizes2的枚举映射的所有元素。

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


访问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) -仅当指定键映射到指定值并返回布尔值时,才从映射中删除条目

例如,

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);
    }
}

输出

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类还实现了CloneableSerializable接口。

克隆界面

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

可序列化的接口

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

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