EnumMap
trong Java là gì?
EnumMap
là một Map implementation
được thiết kế để làm việc với kiểu dữ liệu Enum
trong Java. Trong bài viết này chúng ta sẽ cùng nhau tìm hiểu về nó, cũng như một số trường hợp sử dụng cơ bản, và khi nào thì nên sử dụng EnumMap
Tạo một EnumMap
trong Java
Để tạo EnumMap
, trước tiên chúng ta phải import gói java.util.EnumMap
. Khi chúng ta import
, sau đây là cách chúng ta có thể tạo EnumMap
trong Java.
java
enum Size {
SMALL, MEDIUM, LARGE, EXTRA_LARGE
}
EnumMap<Size, Integer> sizes = new EnumMap<>(Size.class);
Trong ví dụ trên, chúng ta đã tạo ra một EnumMap
có tên là sizes
. Ở đây:
Size
- cáckey
củaenum
liên kết với cácvalue
Integer
- cácvalue
củaEnumMap
liên kết với cáckey
tương ứng
Chèn các phần tử vào EnumMap
put()
– chèn cặpkey/value
được chỉ định (mục nhập) vàoEnumMap
putAll()
– chèn tất cả các mục của map được chỉ định vàomap
này
java
import java.util.EnumMap;
class Main {
enum Size {
SMALL, MEDIUM, LARGE, EXTRA_LARGE
}
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);
}
}
Kết quả
EnumMap1: {SMALL=28, MEDIUM=32}
EnumMap2: {SMALL=28, MEDIUM=32, LARGE=36}
Ở ví dụ trên, chúng ta đã sử dụng hàm putAll()
để chèn tất cả các phần tử của EnumMap sizes1
đến một EnumMap của sizes2
.
Nó cũng có thể chèn các phần tử từ các map khác như HashMap
, TreeMap
,... tới một EnumMap
bằng cách sử dụng hàm putAll()
. Tuy nhiên, tất cả các map nên cùng loại enum
.
Truy cập các phần tử EnumMap
entrySet()
– trả về một tập hợp tất cả các cặp key / value (mục nhập) của EnumMapkeySet()
– trả về một tập hợp tất cả các key của EnumMapvalues()
– trả về một tập hợp tất cả các value của EnumMap
java
import java.util.EnumMap;
class Main {
enum Size {
SMALL, MEDIUM, LARGE, EXTRA_LARGE
}
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.EXTRA_LARGE, 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());
}
}
Kết quả
EnumMap: {SMALL=28, MEDIUM=32, LARGE=36, EXTRA_LARGE=40}
Key/Value mappings: [SMALL=28, MEDIUM=32, LARGE=36, EXTRA_LARGE=40]
Keys: [SMALL, MEDIUM, LARGE, EXTRA_LARGE]
Values: [28, 32, 36, 40]
- Hàm
get()
trả vềvalue
liên kết với key chỉ định. Nó trả vềnull
nếu không tìm thấykey
được chỉ định
java
import java.util.EnumMap;
class Main {
enum Size {
SMALL, MEDIUM, LARGE, EXTRA_LARGE
}
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.EXTRA_LARGE, 40);
System.out.println("EnumMap: " + sizes);
// Using the get() Method
int value = sizes.get(Size.MEDIUM);
System.out.println("Value of MEDIUM: " + value);
}
}
Kết quả
EnumMap: {SMALL=28, MEDIUM=32, LARGE=36, EXTRA_LARGE=40}
Value of MEDIUM: 32
Xóa các phần tử khỏi EnumMap
remove(key)
– trả về và xóa mục nhập được liên kết với key được chỉ định khỏimap
remove(key, value)
– chỉ xóa mục nhập khỏimaps
nếu key được chỉ định liên kết vớivalue
đã chỉ định và trả về giá trịboolean
java
import java.util.EnumMap;
class Main {
enum Size {
SMALL, MEDIUM, LARGE, EXTRA_LARGE
}
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.EXTRA_LARGE, 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);
}
}
Kết quả
EnumMap: {SMALL=28, MEDIUM=32, LARGE=36, EXTRA_LARGE=40}
Removed Value: 32
Is the entry {SMALL=28} removed? True
Updated EnumMap: {LARGE=36, EXTRA_LARGE=40}
Thay thế các phần tử EnumMap
replace(key, value)
– thay thếvalue
liên kết vớikey
chỉ định bằngvalue
mớireplace(key, old, new)
– thay thế cũvalue
bằng value mới nếuvalue
cũ đã được liên kết vớikey
chỉ địnhreplaceAll(function)
– thay thế từngvalue
củamap
bằng kết quả của chức năng được chỉ định
java
import java.util.EnumMap;
class Main {
enum Size {
SMALL, MEDIUM, LARGE, EXTRA_LARGE
}
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.EXTRA_LARGE, 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);
}
}
Kết quả
EnumMap: {SMALL=28, MEDIUM=32, LARGE=36, EXTRA_LARGE=40}
EnumMap using replace(): {SMALL=28, MEDIUM=30, LARGE=34, EXTRA_LARGE=40}
EnumMap using replaceAll(): {SMALL=31, MEDIUM=33, LARGE=37, EXTRA_LARGE=43}
Trong chương trình trên, chú ý câu lệnh:
java
sizes.replaceAll((key, oldValue) -> oldValue + 3);
Ở đây, hàm này truy cập tất cả các mục của map
. Sau đó, nó thay thế tất cả các value
bằng các value
mới được cung cấp bởi các biểu thức lambda .
Các hàm trong EnumMap
Hàm | Mô tả |
---|---|
clone() |
Tạo một bản sao của EnumMap |
containsKey() |
Tìm kiếm key được chỉ định trong EnumMap và trả về kết quả boolean |
containsValue() |
Tìm kiếm value được chỉ định trong EnumMap và trả về kết quả boolean |
size() |
Trả về kích thước của EnumMap |
clear() |
Xóa tất cả các mục từ EnumMap |
So sánh EnumSet với EnumMap
Cả class EnumSet và EnumMap đều cung cấp cấu trúc dữ liệu để lưu trữ các value
enum
. Tuy nhiên, có một số khác biệt lớn giữa chúng.
EnumSet
được biểu diễn nội bộ dưới dạng một chuỗi các bit, trong khiEnumMap
được biểu diễn nội bộ dưới dạng mảng.EnumSet
được tạo ra bằng các hàm xác định trước của nó nhưallOf()
,noneOf()
,of()
,... Tuy nhiên, mộtEnumMap
được tạo bằngconstructor
của nó.