Sunday, August 8, 2021

What is EnumMap in Java – Example Tutorial

What is EnumMap in Java
EnumMap in Java is added on JDK  5 release along with other important features like  Autoboxing, varargs, and Generics. EnumMap is a specialized Map implementation designed and optimized for using Java Enum as key. Since enum can represent a type (like class or interface)  in Java and it can also override equals() and hashCode(), It can be used inside HashMap or any other collection but using  EnumMap brings implementation-specific benefits which are done for enum keys, In short EnumMap is optimized Map implementation exclusively for enum keys. As per Javadoc Enum is implemented using Arrays and common operations result in constant time.

So if you are thinking of a high-performance Map, EnumMap could be a decent choice for enumeration data. We have already seen many examples of Java enum in our article 10 Examples of enum in Java and using Enum as thread-safe Singleton. In this Java tutorial, we will see simple examples of using EnumMap in Java. 

On a related note Difference between EnumMap and HashMap is also getting popular as one of the advanced Java collection interview questions and most Java IDE like Eclipse and Netbeans will also suggest using EnumMap if you use Enum keys along with HashMap as part of their code improvement suggestion.


Important points of EnumMap in Java:

What is EnumMap in Java with ExampleHere is a few important points to remember about EnumMap in Java which is also useful while using EnumMap in code to avoid any compile-time or logical errors :



1. All keys used in EnumMap must be from the same Enum type which is specified while creating EnumMap in Java. For example, if you can not use different enum instances from two different enums.

2. EnumMap is ordered collection and they are maintained in the natural order of their keys(the natural order of keys means the order on which enum constants are declared inside enum type ). you can verify this while Iterating over an EnumMap in Java.

3. Iterators of EnumMap are fail-fast Iterator, much like ConcurrentHashMap, and don't throw ConcurrentModificationException and may not show the effect of any modification on EnumMap during the Iteration process.

4. You can not insert null keys inside EnumMap in Java.  EnumMap doesn't allow null key and throws NullPointerException, at the same time null values are permitted.

5. EnumMap is not synchronized and it has to be synchronized manually before using it in a concurrent or multi-threaded environment. like synchronized Map in Java you can also make EnumMap synchronized by using Collections.synchronizedMap() method and as per Javadoc this should be done while creating EnumMap in java to avoid accidental non synchronized access.

6. EnumMap likely gives better performance than HashMap in Java. So prefer EnumMap if you are going to use enum keys.



How to use EnumMap in Java – EnumMap Example

In this section we will see How to use EnumMap in Java with simple examples like creating EnumMap, putting objects into EnumMap, getting objects from EnumMap,  finding the size of EnumMap, Iterating over EnumMap, printing EnumMap in console, checking if EnumMap contains a particular key and value or not, etc. 

All of these operations are similar to other Map implementations like HashMap and don’t require special knowledge but It’s good to remember all points specific to EnumMap as discussed in the previous section to avoid any error.


import java.util.EnumMap;
import java.util.Iterator;

/**
 * Java program to demonstrate How to use EnumMap in Java
 * If Key Object is Enum than it’s best to EnumMap to get better performance.
 * Most of IDE like Netbeans and Eclipse suggest you to use EnumMap instead of HashMap
 * or any other Map implementation when key object is Enum.
 *
 * @author Javarevisited
 */


public class EnumMapExample{
 
    public enum STATE{
        NEW, RUNNING, WAITING, FINISHED;
    }

    public static void main(String args[]) {
     
        // Java EnumMap Example 1: creating EnumMap in java with key as enum type STATE
        EnumMap<STATE, String> stateMap = new EnumMap<STATE, String>(STATE.class);
     
        // Java EnumMap Example 2:
        //putting values inside EnumMap in Java
        //we are inserting Enum keys on different order than their natural order
        stateMap.put(STATE.RUNNING, "Program is running");
        stateMap.put(STATE.WAITING, "Program is waiting");
        stateMap.put(STATE.NEW, "Program has just created");
        stateMap.put(STATE.FINISHED, "Program has finished");
     
        // Java EnumMap Example 3:
        //printing size of EnumMap in java
        System.out.println("Size of EnumMap in java: " + stateMap.size());
     
        // Java EnumMap Example 5:
        //printing Java EnumMap , should print EnumMap in natural order
        //of enum keys (order on which they are declared)
        System.out.println("EnumMap: " + stateMap);
     
        // Java EnumMap Example 5:
        //retrieving value from EnumMap in java
        System.out.println("EnumMap key : " + STATE.NEW +" value: " + stateMap.get(STATE.NEW));
     
        // Java EnumMap Example 6:
        //Iterating over Java EnumMap
        Iterator<STATE> enumKeySet = stateMap.keySet().iterator();
        while(enumKeySet.hasNext()){
            STATE currentState = enumKeySet.next();
            System.out.println("key : " + currentState + " value : " + stateMap.get(currentState));
        }
     
        //Java EnumMap Example 7: checking if EnumMap contains a particular key
        System.out.println("Does stateMap has :" + STATE.NEW + " : "
                            +  stateMap.containsKey(STATE.NEW));
     
        //Java EnumMap Example 8: checking if EnumMap contains a particular value
        System.out.println("Does stateMap has :" + STATE.NEW + " : " + stateMap.containsValue(null));

    }
 
}

Output:
Size of EnumMap in java: 4
EnumMap: {NEW=Program has just created, RUNNING=Program is running, WAITING=Program is waiting, FINISHED=Program has finished}

EnumMap key : NEW value: Program has just created
key : NEW value : Program has just created
key : RUNNING value : Program is running
key : WAITING value : Program is waiting
key : FINISHED value : Program has finished
Does stateMap has :NEW : true
Does stateMap has :NEW : false


In summary, if you are using enum keys or can use enum keys prefer EnumMap over HashMap or any other Map implementation because EnumMap is a specialized Map implementation for enum and provides better performance than a general map. In this Java tutorial, we have seen What is EnumMap in Java, important points about EnumMap in Java, and How to use EnumMap with some how-to type of examples.


Other Java collection tutorials from Javarevisited blog.

4 comments:

  1. I think, point 3 has mistake. EnumMap has fail-save iterator, because it doesn't throw ConcurrentModificationException.

    ReplyDelete
  2. I agree with Dmitriy, Itertor of EnumMap should be fail-safe, I see you even talked about fail-safe iterator, I say just a typo, but worth correcting it.

    ReplyDelete
  3. Yeah, It seems to be typo, Iterators of EnumMap are fail-safe Iterator for sure.

    ReplyDelete
  4. Thanks for the article.

    Since enum can represent a type (like class or interface) in Java and "it can also override equals() and hashCode()" , It can be used inside HashMap. I think the above point related to equals and hashcode of. we can't override equals & hashCode() of enum since these declared as final in java.lang.Enum

    ReplyDelete