在本教程中,我們將借助示例學習Java EnumMap類及其操作。
Java集合框架的EnumMap類為枚舉的元素提供了映射實現(xiàn)。
在EnumMap中,枚舉元素用作鍵。它實現(xiàn)了Map接口。
在學習之前EnumMap,請確保了解Java枚舉。
為了創(chuàng)建一個枚舉映射,我們必須首先導入java.util.EnumMap包。導入包后,就可以使用Java創(chuàng)建枚舉映射。
enum Size { SMALL, MEDIUM, LARGE, EXTRALARGE } EnumMap<Size, Integer> sizes = new EnumMap<>(Size.class);
在上面的示例中,我們創(chuàng)建了一個名為sizes的枚舉映射。
這里,
Size - 映射到值的枚舉的鍵
Integer- 與相應鍵相關聯(lián)的枚舉映射的值
EnumMap類提供了一些方法,允許我們對枚舉映射執(zhí)行各種元素。
put() - 將指定的鍵/值映射(條目)插入到枚舉映射中
putAll() - 將指定映射的所有條目插入此映射
例如,
import java.util.EnumMap; class Main { enum Size { SMALL, MEDIUM, LARGE, EXTRALARGE } public static void main(String[] args) { //創(chuàng)建一個為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等)中的元素插入到枚舉映射中。但是,所有的映射應該具有相同的枚舉類型。
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) { // 創(chuàng)建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()方法返回與指定鍵關聯(lián)的值。如果找不到指定的鍵,則返回null。
例如,
import java.util.EnumMap; class Main { enum Size { SMALL, MEDIUM, LARGE, EXTRALARGE } public static void main(String[] args) { // 創(chuàng)建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
remove(key) - 返回并從映射中刪除與指定鍵關聯(lián)的條目
remove(key, value) - 僅當指定鍵映射到指定值并返回布爾值時,才從映射中刪除條目
例如,
import java.util.EnumMap; class Main { enum Size { SMALL, MEDIUM, LARGE, EXTRALARGE } public static void main(String[] args) { // 創(chuàng)建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}
replace(key, value) - 將鍵key關聯(lián)的值替換為value
replace(key, old, new) - 僅當old值已與指定鍵key關聯(lián)時,才用new值替換old值
replaceAll(function) - 用指定函數(shù)的結果替換映射的每個值
import java.util.EnumMap; class Main { enum Size { SMALL, MEDIUM, LARGE, EXTRALARGE } public static void main(String[] args) { // 創(chuàng)建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() | 創(chuàng)建副本 EnumMap |
containsKey() | 搜索EnumMap指定的鍵,并返回布爾結果 |
containsValue() | 在中搜索EnumMap指定的值并返回布爾結果 |
size() | 返回的大小 EnumMap |
clear() | 從中刪除所有條目 EnumMap |
EnumSet和EnumMap類都提供了存儲枚舉值的數(shù)據(jù)結構。然而,它們之間存在著一些主要的區(qū)別。
枚舉集合在內(nèi)部以位序列表示,而枚舉映射在內(nèi)部以數(shù)組表示。
Enum集合是使用預定義的方法創(chuàng)建的,如allOf()、noneOf()、of()等。但是,枚舉映射是使用其構造函數(shù)創(chuàng)建的。
EnumMap類還實現(xiàn)了Cloneable和Serializable接口。
Cloneable 克隆接口
它允許EnumMap類復制類的實例。
Serializable 可序列化的接口
每當需要通過網(wǎng)絡傳輸Java對象時,就需要將對象轉(zhuǎn)換為位或字節(jié)。這是因為Java對象無法通過網(wǎng)絡傳輸。
Serializable接口允許類被序列化。這意味著Serializable可以將實現(xiàn)的類的對象轉(zhuǎn)換為位或字節(jié)。