Hướng dẫn sử dụng EnumSet trong Java

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>

EnumSetinJava

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() 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. 

0 0 votes
Article Rating
Subscribe
Notify of
guest
0 Comments
Inline Feedbacks
View all comments
0
Would love your thoughts, please comment.x
()
x