Mục lục
EnumSet là một abstract class, implement Set interface, được sử dụng để lưu trữ một tập hợp các phần tử kiểu Enum trong Java. Là một trong những thành phần cơ bản của collection framework, EnumSet có một số đặc điểm nổi bật sau:
- EnumSet thừa kế AbstractSet và Set interface.
- Có hiệu suất cao, thường sẽ nhanh hơn HashSet.
- Tất cả các phần tử EnumSet đều phải thuộc một kiểu enum định trước.
- Không chấp nhận các phần tử null, và ném NullPointerException khi thêm một phần tử null vào EnumSet.
- EnumSet sử dụng fail-safe iterator, vì vậy nó sẽ không ném ConcurrentModificationException khi một EnumSet bị sữa đổi trong quá trình duyệt.
Sơ đồ hướng đối tượng
java.lang.Object ↳ java.util.AbstractCollection<E> ↳ java.util.AbstractSet<E> ↳ java.util.EnumSet<E>
Ví dụ làm quen với EnumSet
import java.util.EnumSet; enum Gfg { CODE, LEARN, CONTRIBUTE, QUIZ, MCQ }; public class EnumSetExample { // Main Method public static void main(String[] args) { // Creating a set EnumSet<Gfg> set1, set2, set3, set4; // Adding elements set1 = EnumSet.of(Gfg.QUIZ, Gfg.CONTRIBUTE, Gfg.LEARN, Gfg.CODE); set2 = EnumSet.complementOf(set1); set3 = EnumSet.allOf(Gfg.class); set4 = EnumSet.range(Gfg.CODE, Gfg.CONTRIBUTE); System.out.println("Set 1: " + set1); System.out.println("Set 2: " + set2); System.out.println("Set 3: " + set3); System.out.println("Set 4: " + set4); } }
Output
Set 1: [CODE, LEARN, CONTRIBUTE, QUIZ] Set 2: [MCQ] Set 3: [CODE, LEARN, CONTRIBUTE, QUIZ, MCQ] Set 4: [CODE, LEARN, CONTRIBUTE]
Khởi tạo EnumSet
EnumSet là một abstract class vì vậy chúng ta không thể khởi tạo một EnumSet object trực tiếp mà phải thông qua các class kế thừa từ nó:
- RegularEnumSet
- JumboEnumSet
RegularEnumSet sử dụng một phần tử long để lưu trữ các phần tử của EnumSet. Mỗi bit của phần tử long đại diện cho một giá trị của Enum. Bởi vì kích thước của long là 64bit nên RegularEnumSet có thể lưu trữ tối 64 phần tử khác nhau.
JumboEnumSet sử dụng một mảng của phần tử long để lưu các phần tử của EnumSet. Vì JumboEnumSet sử dụng mảng long để lưu nên nó có thể lưu nhiều hơn 64 phần tử với mỗi phần tử trong mảng có sức chứa tối đa 64.
EnumSet không cung cấp bất kỳ một constructor mà chỉ cho phép chúng ta khởi tạo đối tượng thông qua các factory method.
- allOf(size)
- noneOf(size)
- range(e1, e2)
- of()
import java.util.*; class CreateEnumSet { enum Game { CRICKET, HOCKEY, TENNIS } public static void main(String[] args) { // Creating an EnumSet using allOf() EnumSet<Game> games = EnumSet.allOf(Game.class); // printing EnumSet elements to the console System.out.println("EnumSet: " + games); } }
Output
EnumSet: [CRICKET, HOCKEY, TENNIS]
Thêm phần tử vào EnumSet
Chúng ta có thể sử dụng add() và addAll() method để thêm một hoặc nhiều phần tử cùng lúc vào EnumSet.
import java.util.EnumSet; class AddElementsToEnumSet { enum Game { CRICKET, HOCKEY, TENNIS } public static void main(String[] args) { // Creating an EnumSet using allOf() EnumSet<Game> games1 = EnumSet.allOf(Game.class); // Creating an EnumSet using noneOf() EnumSet<Game> games2 = EnumSet.noneOf(Game.class); // Using add method games2.add(Game.HOCKEY); // printing the elements to the console System.out.println("EnumSet Using add(): " + games2); // Using addAll() method games2.addAll(games1); // printing the elements to the console System.out.println("EnumSet Using addAll(): " + games2); } }
Output
EnumSet Using add(): [HOCKEY] EnumSet Using addAll(): [CRICKET, HOCKEY, TENNIS]
Truy xuất phần tử trong EnumSet
Sử dụng iterator() method để truy xuất lần lượt các phần tử trong EnumSet.
import java.util.EnumSet; import java.util.Iterator; class AccessingElementsOfEnumSet { enum Game { CRICKET, HOCKEY, TENNIS } public static void main(String[] args) { // Creating an EnumSet using allOf() EnumSet<Game> games = EnumSet.allOf(Game.class); // create an iterator on games Iterator<Game> iterate = games.iterator(); // Iterate and print elements to // the console System.out.print("EnumSet: "); while (iterate.hasNext()) { System.out.print(iterate.next()); System.out.print(", "); } } }
Output
EnumSet: CRICKET, HOCKEY, TENNIS,
Xoá phần tử trong EnumSet
Sử dụng remove() hoặc removeAll() để xoá các phần tử trong EnumSet.
import java.util.EnumSet; class RemovingElementsOfEnumSet { enum Game { CRICKET, HOCKEY, TENNIS } public static void main(String[] args) { // Creating EnumSet using allOf() EnumSet<Game> games = EnumSet.allOf(Game.class); System.out.println("EnumSet: " + games); // Using remove() boolean value1 = games.remove(Game.CRICKET); // printing elements to the console System.out.println("Is CRICKET removed? " + value1); // Using removeAll() boolean value2 = games.removeAll(games); // printing elements to the console System.out.println("Are all elements removed? " + value2); } }
Output
EnumSet: [CRICKET, HOCKEY, TENNIS] Is CRICKET removed? true Are all elements removed? true
Tóm lược
Qua bài viết chúng ta đã tìm hiểu được thêm một thành phần trong collection framework, EnumSet sử dụng với kiểu dữ liệu Enum trong Java cho hiệu xuất tốt hơn so với HashSet.
Nguồn tham khảo