Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Java

Khác biệt giữa EnumMap và HashMap trong Java

EnumMap giới thiệu trong JDK 5. Được thiết kế dùng Enum làm key trong Map. Cũng là triển khai của Map interface. Tất cả key trong EnumMap phải cùng enum type. Trong EnumMap, key không thể null và sẽ ném NullPointerException.

Theo Java Docs: EnumMap nội bộ dùng mảng (arrays), biểu diễn này cực kỳ compact và hiệu quả.

HashMap cũng là triển khai Map interface. Dùng lưu dữ liệu dạng Key-Value. Có thể chứa một null key và nhiều null values. Trong HashMap, key không thể là kiểu primitive. Java HashMap cung cấp hiệu suất constant-time cho các operation cơ bản (get, put), giả sử hash function phân phối đúng cách phần tử vào buckets.

STT Tiêu chí EnumMap HashMap
1 Cơ bản Map triển khai chuyên biệt cho enum type keys Triển khai Map interface chung
2 Null Key Không thể có null key Có thể có 1 null key và nhiều null values
3 Performance Tất cả operation constant time, nhanh hơn HashMap Chậm hơn EnumMap
4 Internal Implementation Dùng Array nội bộ Dùng Hashtable nội bộ (bucket array + linked list/tree)
5 Ordering Lưu key theo thứ tự tự nhiên (natural order) của key Không có thứ tự (unordered)

Ví dụ EnumMap

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

public class EnumMapExample {
    public enum LaptopEnum { HCL, DELL, IBM }
    public static void main(String[] args) {
        EnumMap<LaptopEnum, String> map = new EnumMap<>(LaptopEnum.class);
        map.put(LaptopEnum.HCL, "100");
        map.put(LaptopEnum.DELL, "200");
        map.put(LaptopEnum.IBM, "300");
        for (Map.Entry<LaptopEnum, String> m : map.entrySet()) {
            System.out.println(m.getKey() + " " + m.getValue());
        }
    }
}

Ví dụ HashMap

import java.util.HashMap;
import java.util.Map;

public class HashMapExample {
    public static void main(String[] args) {
        Map<String, String> map = new HashMap<>();
        map.put("HCL", "100");
        map.put("DELL", "200");
        map.put("IBM", "300");
        for (Map.Entry<String, String> m : map.entrySet()) {
            System.out.println(m.getKey() + " " + m.getValue());
        }
    }
}