EnumMap is a specialized Map implementation for use with enum type keys. It’s part of the java.util package. Being both compact and efficient, the performance of EnumMap surpasses HashMap when the key is an enum type.

Key Points:

Optimized for Enums: All keys in an EnumMap must come from a single enum type.

Order: Keys are maintained in their natural order (the order in which the enum constants are declared).

Nulls: While EnumMap does not allow null keys (because the key is an enum type), it does permit null values.

Not Thread-Safe: EnumMap itself is not thread-safe. External synchronization is required if multiple threads modify an enum map concurrently and at least one of the threads modifies it.

Common Operations with EnumMap in Java

import java.util.EnumMap;

// Define an enumeration for colors
enum Color {
    RED, GREEN, BLUE
}

public class EnumMapDemo {
    public static void main(String[] args) {
        // 1. Initializing an empty EnumMap
        EnumMap<Color, String> colorMap = new EnumMap<>(Color.class);

        // 2. Putting values into EnumMap
        colorMap.put(Color.RED, "Apple");
        colorMap.put(Color.GREEN, "Leaf");
        colorMap.put(Color.BLUE, "Sky");
        System.out.println("Color map: " + colorMap);

        // 3. Retrieving a value
        String blueItem = colorMap.get(Color.BLUE);
        System.out.println("Item associated with BLUE: " + blueItem);

        // 4. Checking if a specific key is present
        boolean hasRed = colorMap.containsKey(Color.RED);
        System.out.println("Map contains RED key: " + hasRed);

        // 5. Checking if a specific value is present
        boolean hasApple = colorMap.containsValue("Apple");
        System.out.println("Map contains &apos;Apple&apos; value: " + hasApple);

        // 6. Removing a key-value pair
        colorMap.remove(Color.GREEN);
        System.out.println("After removing GREEN key: " + colorMap);

        // 7. Getting the size of the map
        int size = colorMap.size();
        System.out.println("Size of color map: " + size);
    }
}

Output:

Color map: {RED=Apple, GREEN=Leaf, BLUE=Sky}
Item associated with BLUE: Sky
Map contains RED key: true
Map contains 'Apple' value: true
After removing GREEN key: {RED=Apple, BLUE=Sky}
Size of color map: 2

Explanation:

1. Initializing an empty EnumMap that will have Color enum keys.

2. put: Adding key-value pairs to the map using the put method.

3. get: Retrieving the value associated with a specific key.

4. containsKey: Checking if a specific key is present in the map.

5. containsValue: Checking if a specific value is present in the map.

6. remove: Removing a specific key-value pair based on the key.

7. size: Getting the number of key-value pairs present in the map.

EnumMap is a specialized map implementation for use with enumeration type keys. It's compact and efficient, ensuring operations like get or put are faster than their HashMap counterparts when using enum keys.

Real-World Use Case: Tracking Employee Status with EnumMap

import java.util.EnumMap;

// Define an enumeration for employee status
enum Status {
    ONLINE, OFFLINE, ON_LEAVE, IN_MEETING
}

public class EmployeeStatusTracker {
    public static void main(String[] args) {
        // 1. Initializing an EnumMap to track employee status
        EnumMap<Status, String> employeeStatus = new EnumMap<>(Status.class);

        // 2. Assigning employees to their respective statuses
        employeeStatus.put(Status.ONLINE, "Ramesh");
        employeeStatus.put(Status.OFFLINE, "Sunita");
        employeeStatus.put(Status.ON_LEAVE, "Anil");
        employeeStatus.put(Status.IN_MEETING, "Deepa");

        // 3. Displaying the employees based on their status
        for (Status status : Status.values()) {
            System.out.println(status + ": " + employeeStatus.get(status));
        }

        // 4. Changing the status of an employee
        employeeStatus.put(Status.ON_LEAVE, "Ramesh");
        System.out.println("\nAfter updating status:");
        for (Status status : Status.values()) {
            System.out.println(status + ": " + employeeStatus.get(status));
        }
    }
}

Output:

ONLINE: Ramesh
OFFLINE: Sunita
ON_LEAVE: Anil
IN_MEETING: Deepa

After updating status:
ONLINE: null
OFFLINE: Sunita
ON_LEAVE: Ramesh
IN_MEETING: Deepa

Explanation:

1. The Status enum represents different statuses an employee can have.

2. We create an EnumMap named employeeStatus that maps each status to an employee's name. EnumMap is efficient for enums as keys.

3. Initially, employees are assigned to their respective statuses and the map is displayed.

4. Later, Ramesh's status is updated from ONLINE to ON_LEAVE, and the updated map is displayed.

In this use case, EnumMap provides a clear and efficient way to represent and manage the statuses of employees. Enum keys ensure that there's a fixed set of possible statuses, making the system robust against invalid values.