Class EnumMap<K,V>

EnumMap là một lớp đặc biệt trong Java được thiết kế để sử dụng với các khóa là kiểu enum. Tất cả các khóa trong EnumMap phải thuộc về một kiểu enum duy nhất, được chỉ định khi tạo bản đồ.

Cấu trúc dữ liệu: EnumMap được đại diện nội bộ dưới dạng các mảng, làm cho nó rất tiết kiệm và hiệu quả về mặt bộ nhớ. Điều này giúp các hoạt động cơ bản thực hiện trong thời gian hằng số.

Một số đặc điểm nổi bật của Class EnumSet<K,V>

↳ Thứ tự: Các phần tử trong EnumMap được duy trì theo thứ tự tự nhiên của các khóa enum, tức là thứ tự trong đó các hằng số enum được khai báo. Điều này được phản ánh trong các iterator trả về bởi các phương thức như keySet(), entrySet(), và values().

↳ Thao tác đồng bộ: EnumMap không đồng bộ. Nếu nhiều luồng truy cập vào một EnumMap đồng thời và ít nhất một luồng sửa đổi bản đồ, nó cần phải được đồng bộ hóa bên ngoài. Điều này thường được thực hiện bằng cách đồng bộ hóa trên một đối tượng bao encapsulates bản đồ, hoặc "bọc" bản đồ bằng phương thức Collections.synchronizedMap().

↳ Khóa và giá trị null: Không được phép sử dụng khóa null và cho phép giá trị null. Việc cố gắng chèn khóa null sẽ gây ra NullPointerException.

↳ Tính nhất quán: Các iterator trả về bởi các phương thức view của collection là nhất quán yếu. Chúng không bao giờ ném ConcurrentModificationException và có thể hoặc không phản ánh các thay đổi xảy ra trong khi việc lặp lại đang tiến hành.

↳ Hiệu suất: Tất cả các thao tác cơ bản đều thực hiện trong thời gian hằng số và có thể nhanh hơn (mặc dù không được đảm bảo) so với các thao tác của HashMap.

Khai báo Class EnumMap<K,V> trong Java

Để sử dụng Class EnumMap, bạn cần import gói java.util vào đầu file Java của mình.

Cú pháp câu lệnh import:

Cú pháp

import java.util.EnumMap;

Cú pháp khai báo Class EnumMap:

Cú pháp

public class EnumMap<K extends Enum<K>,V>
extends AbstractMap<K,V>
implements Serializable, Cloneable

Dưới đây là giải thích chi tiết về cú pháp khai báo này:

↳ public: Lớp EnumMap có thể được truy cập từ bất kỳ đâu trong chương trình.

↳ class EnumMap<K,V>: là tên của lớp. Nó là một lớp bản đồ (map) đặc biệt trong Java dành riêng cho các khóa kiểu enum.

↳ K extends Enum<K>: K là kiểu khóa của bản đồ. K extends Enum<K> cho biết rằng kiểu K phải là một kiểu enum, tức là kiểu khóa phải là một kiểu enum trong Java. Điều này đảm bảo rằng tất cả các khóa trong EnumMap phải thuộc về cùng một kiểu enum. V là kiểu giá trị của bản đồ, có thể là bất kỳ kiểu dữ liệu nào.

↳ extends AbstractMap<K,V>: EnumMap kế thừa từ AbstractMap, là một lớp trừu tượng cung cấp một số phương thức mặc định cho các bản đồ (map). Điều này giúp EnumMap kế thừa các tính năng cơ bản của một bản đồ mà không cần phải triển khai tất cả các phương thức của giao diện Map.

↳ implements Serializable: EnumMap triển khai giao diện Serializable, có nghĩa là các đối tượng của lớp này có thể được tuần tự hóa (serialization). Tuần tự hóa cho phép bạn lưu trữ trạng thái của đối tượng hoặc truyền đối tượng qua mạng.

↳ implements Cloneable: EnumMap cũng triển khai giao diện Cloneable, có nghĩa là đối tượng của lớp này có thể được sao chép (cloned). Khi một đối tượng EnumMap được sao chép, nó tạo ra một bản sao của đối tượng đó.

Các constructor của lớp EnumMap

Lớp EnumMap cung cấp các constructor để tạo một bản đồ được tối ưu hóa cho các khóa enum. Bạn có thể tạo một bản đồ rỗng hoặc một bản đồ được khởi tạo từ một bản đồ khác. Dưới đây là ba constructor của EnumMap:

↳ EnumMap(Class<K> keyType): Tạo một enum map rỗng với kiểu khóa được chỉ định.

↳ EnumMap(EnumMap<K,? extends V> m): Tạo một enum map mới với cùng kiểu khóa như enum map được chỉ định, ban đầu chứa các ánh xạ giống nhau (nếu có).

↳ EnumMap(Map<K,? extends V> m): Tạo một enum map được khởi tạo từ bản đồ được chỉ định.

Ví dụ

// Tạo EnumMap rỗng với khóa là Color
EnumMap<Color, String> colorMap1 = new EnumMap<>(Color.class);

// Tạo EnumMap từ một EnumMap khác
EnumMap<Color, String> colorMap2 = new EnumMap<>(colorMap1);

// Tạo EnumMap từ một HashMap
Map<Color, String> map = new HashMap<>();
EnumMap<Color, String> colorMap3 = new EnumMap<>(map);

Các phương thức chính trong lớp EnumMap

Lớp EnumMap cung cấp các phương thức để thao tác với các cặp khóa-giá trị trong một bản đồ được tối ưu hóa cho các khóa enum. Bạn có thể sử dụng các phương thức này để thêm, xóa, lấy, kiểm tra và duyệt qua các mục nhập trong bản đồ. Dưới đây là danh sách tất cả các phương thức của lớp EnumMap<K,V> trong Java:

↳ void clear(): Xóa tất cả các ánh xạ khỏi bản đồ này.

↳ EnumMap<K,V>clone(): Trả về một bản sao nông của enum map này.

↳ boolean containsKey(Object key): Trả về true nếu bản đồ này chứa một ánh xạ cho khóa đã cho.

↳ boolean containsValue(Object value): Trả về true nếu bản đồ này ánh xạ một hoặc nhiều khóa đến giá trị đã cho.

↳ Set<Map.Entry<K,V>> entrySet(): Trả về một view Set của các ánh xạ có trong bản đồ này.

↳ boolean equals(Object o): So sánh đối tượng đã cho với bản đồ này để kiểm tra xem chúng có bằng nhau hay không.

↳ V get(Object key): Trả về giá trị mà khóa đã cho được ánh xạ đến, hoặc null nếu bản đồ này không chứa ánh xạ nào cho khóa.

↳ int hashCode(): Trả về giá trị mã băm cho bản đồ này.

↳ Set<K> keySet(): Trả về một view Set của các khóa có trong bản đồ này.

↳ V put(K key, V value): Liên kết giá trị đã cho với khóa đã cho trong bản đồ này.

↳ Void putAll(Map<? extends K, ? extends V> m): Sao chép tất cả các ánh xạ từ bản đồ đã cho vào bản đồ này.

↳ V remove(Object key): Xóa ánh xạ cho khóa đã cho khỏi bản đồ này nếu có.

↳ int size(): Trả về số lượng ánh xạ khóa-giá trị trong bản đồ này.

↳ Collection<V> values(): Trả về một view Collection của các giá trị có trong bản đồ này

Dưới đây là một ví dụ đơn giản về cách sử dụng EnumMap

Ví dụ: Example.java

import java.util.EnumMap;
import java.util.Map;

// Định nghĩa enum
enum Day {
    MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY
}

public class Example {
    public static void main(String[] args) {
        // Tạo một EnumMap với Day enum làm khóa
        EnumMap<Day, String> schedule = new EnumMap<>(Day.class);

        // Thêm các mục vào EnumMap
        schedule.put(Day.MONDAY, "Tập Gym");
        schedule.put(Day.WEDNESDAY, "Cuộc họp");
        schedule.put(Day.FRIDAY, "Làm việc tại nhà");

        // Truy cập và in các giá trị
        for (Map.Entry<Day, String> entry : schedule.entrySet()) {
            System.out.println(entry.getKey() + ": " + entry.getValue());
        }
    }
}

Kết quả của chương trình là:

MONDAY: Tập Gym
WEDNESDAY: Cuộc họp
FRIDAY: Làm việc tại nhà

Ví dụ về cách sử dụng EnumMap trong Java với các lớp do người dùng tự định nghĩa

Dưới đây là ví dụ về cách sử dụng EnumMap trong Java với các lớp do người dùng tự định nghĩa. Trong ví dụ này, chúng ta sẽ sử dụng một enum để định nghĩa các trạng thái khác nhau và lưu trữ các đối tượng của lớp Person tương ứng với từng trạng thái trong EnumMap.

Ví dụ: Example.java

import java.util.EnumMap;
import java.util.Map;

// Enum định nghĩa các trạng thái
enum Status {
    ACTIVE,
    INACTIVE,
    PENDING
}

// Lớp Person để lưu trữ thông tin cá nhân
class Person {
    private String name;
    private int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }

    @Override
    public String toString() {
        return name + " (" + age + " tuổi)";
    }
}

public class Example {
    public static void main(String[] args) {
        // Tạo EnumMap với Status làm khóa và Person làm giá trị
        EnumMap<Status, Person> enumMap = new EnumMap<>(Status.class);

        // Thêm các phần tử vào EnumMap
        enumMap.put(Status.ACTIVE, new Person("Alice", 30));
        enumMap.put(Status.INACTIVE, new Person("Bob", 25));
        enumMap.put(Status.PENDING, new Person("Charlie", 35));

        // Duyệt qua các phần tử của EnumMap
        System.out.println("Danh sách trạng thái và người:");
        for (Map.Entry<Status, Person> entry : enumMap.entrySet()) {
            Status status = entry.getKey();
            Person person = entry.getValue();
            System.out.println("Trạng thái: " + status + ", Người: " + person);
        }

        // Tìm kiếm và hiển thị thông tin của một trạng thái
        Status searchKey = Status.ACTIVE;
        Person person = enumMap.get(searchKey);
        if (person != null) {
            System.out.println("\nThông tin của trạng thái " + searchKey + ":");
            System.out.println("Người: " + person);
        } else {
            System.out.println("\nKhông tìm thấy thông tin cho trạng thái " + searchKey + ".");
        }
    }
}

Kết quả của chương trình là:

Danh sách trạng thái và người:
Trạng thái: ACTIVE, Người: Alice (30 tuổi)
Trạng thái: INACTIVE, Người: Bob (25 tuổi)
Trạng thái: PENDING, Người: Charlie (35 tuổi)

Thông tin của trạng thái ACTIVE:
Người: Alice (30 tuổi)

Như vậy, chúng ta đã tìm hiểu các phương thức chính của lớp EnumMap. Đây là một triển khai Map hiệu quả và đặc biệt an toàn về kiểu (type-safe) khi bạn cần lưu trữ dữ liệu dưới dạng các cặp khóa-giá trị mà khóa là các giá trị enum. EnumMap được tối ưu hóa cho các khóa enum, giúp nó có hiệu suất vượt trội so với HashMap trong cùng trường hợp. Nắm vững EnumMap sẽ giúp bạn quản lý các bản đồ enum một cách gọn gàng và hiệu quả nhất trong Java.

Câu Nói Truyền Cảm Hứng

“Bắt đầu ở đâu không quan trọng, quan trọng là bạn sẵn sàng bắt đầu.” – W. Clement Stone

Không Gian Tích Cực

“Chúc bạn luôn giữ vững niềm tin và sức mạnh để vượt qua mọi thử thách trong cuộc sống.”