EnumSet trong Java là gì?
Class EnumSet của collections framework trong Java triển khai tập hợp các phần tử của một enum đơn. Trước khi bạn tìm hiểu về EnumSet, hãy chắc chắn rằng bạn đã biết về Enums trong Java.
EnumSet giúp ta lưu trữ các giá trị enum một cách hiệu quả so các set khác (như HashSet, TreeSet).
Một EnumSet chỉ lưu trữ các giá trị enum của một enum cụ thể. Do đó, JVM sẽ biết tất cả các giá trị có thể có của set. Đây là lý do tại sao các EnumSet được triển khai nội bộ như một chuỗi các bit. Các bit xác định xem các phần tử có trong EnumSet hay không.

Tạo EnumSet trong Java
Để tạo một EnumSet, trước tiên chúng ta phải import gói java.util.EnumSet. Khác với việc triển khai set, EnumSet không có các constructor công khai. Chúng ta phải sử dụng các hàm được xác định trước để tạo ra một EnumSet.
Sử dụng hàm allOf(Size)
Hàm allof() tạo ra một EnumSet có chứa tất cả các giá trị của enum kiểu Size đã chỉ định.
java
import java.util.EnumSet;
class Main {
// an enum named Size
enum Size {
SMALL, MEDIUM, LARGE, EXTRA_LARGE
}
public static void main(String[] args) {
// Creating an EnumSet using allOf()
EnumSet<Size> sizes = EnumSet.allOf(Size.class);
System.out.println("EnumSet: " + sizes);
}
}
Kết quả
EnumSet: [SMALL, MEDIUM, LARGE, EXTRA_LARGE]
Lưu ý câu lệnh
java
EnumSet<Size> sizes = EnumSet.allOf(Size.class);
Ở đây, Size.Class biểu diễn enum có tên Size mà chúng ta đã tạo ra.
Sử dụng noneOf(Size)
Hàm noneOf() tạo ra một EnumSet trống.
java
import java.util.EnumSet;
class Main {
// an enum type Size
enum Size {
SMALL, MEDIUM, LARGE, EXTRA_LARGE
}
public static void main(String[] args) {
// Creating an EnumSet using noneOf()
EnumSet<Size> sizes = EnumSet.noneOf(Size.class);
System.out.println("Empty EnumSet: " + sizes);
}
}
Kết quả
Empty EnumSet : []
Ở đây, chúng ta đã tạo ra một enum trống có tên là Size. Lưu ý chúng ta chỉ có thể chèn các phần tử của kiểu enum Size trong chương trình trên. Bởi vì chúng ta đã tạo ra EnumSet trống bằng cách sử dụng enum Size.
Sử dụng hàm range(e1, e2)
Hàm range() tạo ra một EnumSet chứa tất cả các giá trị của một enum giữa 2 giá trị e1 và e2 bao gồm cả hai giá trị này.
java
import java.util.EnumSet;
class Main {
enum Size {
SMALL, MEDIUM, LARGE, EXTRA_LARGE
}
public static void main(String[] args) {
// Creating an EnumSet using range()
EnumSet<Size> sizes = EnumSet.range(Size.MEDIUM, Size.EXTRA_LARGE);
System.out.println("EnumSet: " + sizes);
}
}
Kết quả
EnumSet: [MEDIUM, LARGE, EXTRA_LARGE]
Sử dụng hàm of()
Hàm of() tạo ra một EnumSet có chứa các phần tử đã chỉ định.
java
import java.util.EnumSet;
class Main {
enum Size {
SMALL, MEDIUM, LARGE, EXTRA_LARGE
}
public static void main(String[] args) {
// Using of() with a single parameter
EnumSet<Size> sizes1 = EnumSet.of(Size.MEDIUM);
System.out.println("EnumSet1: " + sizes1);
EnumSet<Size> sizes2 = EnumSet.of(Size.SMALL, Size.LARGE);
System.out.println("EnumSet2: " + sizes2);
}
}
Kết quả
EnumSet1: [MEDIUM]
EnumSet2: [SMALL, LARGE]
Chèn các phần tử vào EnumSet trong Java
add()– chèn các giá trị enum được chỉ định vàoEnumSetaddAll()chèn tất cả các phần tử củacollectionđã chỉ định vàoset
java
import java.util.EnumSet;
class Main {
enum Size {
SMALL, MEDIUM, LARGE, EXTRA_LARGE
}
public static void main(String[] args) {
// Creating an EnumSet using allOf()
EnumSet<Size> sizes1 = EnumSet.allOf(Size.class);
// Creating an EnumSet using noneOf()
EnumSet<Size> sizes2 = EnumSet.noneOf(Size.class);
// Using add method
sizes2.add(Size.MEDIUM);
System.out.println("EnumSet Using add(): " + sizes2);
// Using addAll() method
sizes2.addAll(sizes1);
System.out.println("EnumSet Using addAll(): " + sizes2);
}
}
Kết quả
EnumSet using add(): [MEDIUM]
EnumSet using addAll(): [SMALL, MEDIUM, LARGE, EXTRA_LARGE]
Trong ví dụ trên, chúng ta đã sử dụng hàm addAll() để chèn tất cả các phần tử của EnumSet Size1 đến EnumSet Size2. Ta cũng có thể chèn các phần tử từ các collection khác như ArrayList, LinkedList,... để một EnumSetbằng cách sử dụng hàmaddAll(). Tuy nhiên, tất cả các collectionnên thuộc cùng loạienum`.
Truy cập các phần tử của EnumSet
Để truy cập các phần tử của EnumSet, chúng ta có thể sử dụng hàm iterator(). Để sử dụng hàm này, chúng ta phải import gói java.util.Iterator.
java
import java.util.EnumSet;
import java.util.Iterator;
class Main {
enum Size {
SMALL, MEDIUM, LARGE, EXTRA_LARGE
}
public static void main(String[] args) {
// Creating an EnumSet using allOf()
EnumSet<Size> sizes = EnumSet.allOf(Size.class);
Iterator<Size> iterate = sizes.iterator();
System.out.print("EnumSet: ");
while(iterate.hasNext()) {
System.out.print(iterate.next());
System.out.print(", ");
}
}
}
Kết quả
EnumSet: SMALL, MEDIUM, LARGE, EXTRA_LARGE,
Lưu ý:
hasNext()trả vềtruenếu có phần tử tiếp theo trongEnumSetnext()trả về phần tử tiếp theo trongEnumSet
Xóa bỏ các phần tử khỏi EnumSet
remove()– xóa phần tử đã chỉ định khỏiEnumSetremoveAll()– loại bỏ tất cả các phần tử khỏiEnumSet
java
import java.util.EnumSet;
class Main {
enum Size {
SMALL, MEDIUM, LARGE, EXTRA_LARGE
}
public static void main(String[] args) {
// Creating EnumSet using allOf()
EnumSet<Size> sizes = EnumSet.allOf(Size.class);
System.out.println("EnumSet: " + sizes);
// Using remove()
boolean value1 = sizes.remove(Size.MEDIUM);
System.out.println("Is MEDIUM removed? " + value1);
// Using removeAll()
boolean value2 = sizes.removeAll(sizes);
System.out.println("Are all elements removed? " + value2);
}
}
Kết quả
EnumSet: [SMALL, MEDIUM, LARGE, EXTRA_LARGE]
Is MEDIUM removed? true
Are all elements removed? true
Một số hàm trong EnumSet
| Hàm | Mô tả |
|---|---|
copyOf() |
Tạo một bản sao của EnumSet |
contains() |
Tìm kiếm phần tử đã chỉ định trong EnumSet và trả về kết quả boolean |
isEmpty() |
Kiểm tra xem EnumSet có trống hay không |
size() |
Trả về kích thước của EnumSet |
clear() |
Loại bỏ tất cả các phần tử khỏi EnumSet |