Trong bài này, chúng ta sẽ tìm hiểu về class EnumMap trong Java và các thao tác của nó với sự trợ giúp của các ví dụ.

Class EnumMap của collections framework trong Java triển khai map cho các phần tử của một enum.

Trong EnumMap, các phần tử enum được sử dụng làm key. Nó triển khai map interface.

Trước khi chúng ta tìm hiểu về EnumMap, hãy chắc chắn rằng bạn đã biết về Enums trong Java .

1. Tạo một EnumMap

Để 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.

enum Size {
    SMALL, MEDIUM, LARGE, EXTRALARGE
}

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ác key của enum liên kết với các value
  • Integer- các value của EnumMap liên kết với các key tương ứng

2. Các hàm của EnumMap

Class EnumMap cung cấp hàm cho phép chúng ta thực hiện các toán tử khác nhau trên EnumMap.

3. Chèn các phần tử vào EnumMap

  • put() – chèn cặp key / value được chỉ định (mục nhập) vào EnumMap
  • putAll() – chèn tất cả các mục của map được chỉ định vào map này

Ví dụ,




/*
Cafedev.vn - Kênh thông tin IT hàng đầu Việt Nam
@author cafedevn
Contact: cafedevn@gmail.com
Fanpage: https://www.facebook.com/cafedevn
Instagram: https://instagram.com/cafedevn
Twitter: https://twitter.com/CafedeVn
Linkedin: https://www.linkedin.com/in/cafe-dev-407054199/
*/

import java.util.EnumMap;

class Main {

    enum Size {
        SMALL, MEDIUM, LARGE, EXTRALARGE
    }
    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}

Trong 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, v.v tớimộ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.

4. Truy cập các phần tử EnumMap

1. Sử dụng entryset (), keyset () và value ()

  • entrySet() – trả về một tập hợp tất cả các cặp key / value (mục nhập) của EnumMap
  • keySet() – trả về một tập hợp tất cả các key của EnumMap
  • values() – trả về một tập hợp tất cả các value của EnumMap

Ví dụ,

/*
Cafedev.vn - Kênh thông tin IT hàng đầu Việt Nam
@author cafedevn
Contact: cafedevn@gmail.com
Fanpage: https://www.facebook.com/cafedevn
Instagram: https://instagram.com/cafedevn
Twitter: https://twitter.com/CafedeVn
Linkedin: https://www.linkedin.com/in/cafe-dev-407054199/
*/

import java.util.EnumMap;

class Main {

    enum Size {
        SMALL, MEDIUM, LARGE, EXTRALARGE
    }
    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.EXTRALARGE, 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, EXTRALARGE=40}
Key/Value mappings: [SMALL=28, MEDIUM=32, LARGE=36, EXTRALARGE=40]
Keys: [SMALL, MEDIUM, LARGE, EXTRALARGE]
Values: [28, 32, 36, 40]

2. Sử dụng hàm get ()

Các get()hàm trả về value liên kết với key chỉ định. Nó trả về null nếu không tìm thấy key được chỉ định.

Ví dụ,

/*
Cafedev.vn - Kênh thông tin IT hàng đầu Việt Nam
@author cafedevn
Contact: cafedevn@gmail.com
Fanpage: https://www.facebook.com/cafedevn
Instagram: https://instagram.com/cafedevn
Twitter: https://twitter.com/CafedeVn
Linkedin: https://www.linkedin.com/in/cafe-dev-407054199/
*/

import java.util.EnumMap;

class Main {

    enum Size {
        SMALL, MEDIUM, LARGE, EXTRALARGE
    }
    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.EXTRALARGE, 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, EXTRALARGE=40}
Value of MEDIUM: 32

5. 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ỏi map
  • remove(key, value) – chỉ xóa mục nhập khỏi maps nếu key được chỉ định liên kết với value đã chỉ định và trả về giá trị boolean

Ví dụ,

/*
Cafedev.vn - Kênh thông tin IT hàng đầu Việt Nam
@author cafedevn
Contact: cafedevn@gmail.com
Fanpage: https://www.facebook.com/cafedevn
Instagram: https://instagram.com/cafedevn
Twitter: https://twitter.com/CafedeVn
Linkedin: https://www.linkedin.com/in/cafe-dev-407054199/
*/

import java.util.EnumMap;

class Main {

    enum Size {
        SMALL, MEDIUM, LARGE, EXTRALARGE
    }
    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.EXTRALARGE, 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, EXTRALARGE=40}
Removed Value: 32
Is the entry {SMALL=28} removed? True
Updated EnumMap: {LARGE=36, EXTRALARGE=40}

6. Thay thế các phần tử EnumMap

  • replace(key, value) – thay thế value liên kết với key chỉ định bằng value mới 
  • replace(key, old, new) – thay thế cũ value bằng value mới nếu value cũ đã được liên kết với key chỉ định 
  • replaceAll(function) – thay thế từng value của map bằng kết quả của chức năng được chỉ định 
/*
Cafedev.vn - Kênh thông tin IT hàng đầu Việt Nam
@author cafedevn
Contact: cafedevn@gmail.com
Fanpage: https://www.facebook.com/cafedevn
Instagram: https://instagram.com/cafedevn
Twitter: https://twitter.com/CafedeVn
Linkedin: https://www.linkedin.com/in/cafe-dev-407054199/
*/

import java.util.EnumMap;

class Main {

    enum Size {
        SMALL, MEDIUM, LARGE, EXTRALARGE
    }
    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.EXTRALARGE, 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, EXTRALARGE=40}
EnumMap using replace(): {SMALL=28, MEDIUM=30, LARGE=34, EXTRALARGE=40}
EnumMap using replaceAll(): {SMALL=31, MEDIUM=33, LARGE=37, EXTRALARGE=43}

Trong chương trình trên, chú ý câu lệnh

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 khác

hàmMô 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

7. Enumset Vs. EnumMap

Cả class  EnumsetEnumMap đề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 khi EnumMap đượ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(), v.v Tuy nhiên, một EnumMap được tạo bằng constructor của nó.

8. Cloneable Interface  và serializable interface 

Class EnumMap cũng triển khai Cloneable Interface và Serializable Interface.

Cloneable Interface

Nó cho phép class EnumMap tạo một bản sao các instance của class.




Serializable Interface

Bất cứ khi nào các đối tượng trong Java cần được truyền qua mạng, các đối tượng cần được chuyển đổi thành bit hoặc byte. Bởi lẽ các đối tượng trong Java không thể được truyền qua mạng.

Serializable Interface cho phép các class được sắp xếp. Điều này có nghĩa là các đối tượng của các class triển khai Serializable interface có thể được chuyển đổi thành bit hoặc byte.