Hero Image
- Mihai Surdeanu

EnumMap vs HashMap

Astăzi vom analiza comparativ două implementări de map-uri în Java și anume: EnumMap și HashMap.

Vom face o analiză comparativă a lor, pentru a vedea în ce situație putem folosi fiecare implementare în parte. Despre HashMap am vorbit deja acum câteva luni. Găsiți aici articolul în care am descris modul de funcționare.

În ceea ce privește EnumMap, aceasta este o implementare mai puțin cunoscută publicului larg, fiind disponibilă în Java Collection Framework începând cu Java 5. Dacă alocăm puțin timp pentru a citi documentația oficială a implementării, disponibilă aici vom sumariza următoarele lucruri:

  • Această implementare este specializată în a accepta doar chei de tip Enum. Asta se traduce în faptul că avem un număr finit de chei și anume elementele acelui Enum.
  • Reprezentarea internă a anul map de acest gen, nu este o listă de liste, ci o listă simplă. Din acest motiv, reprezentarea este extrem de compactă și eficientă.
  • Reprezentarea fiind o listă, ordinea elementelor în această listă este dată de ordinea naturală a cheilor din Enum. Asta înseamnă că dacă vom alege să obținem un Iterator pentru a naviga prin tot mapul, vom obține elementele în ordinea naturală a cheilor.
  • Dacă tot am ajuns la iterarea peste un EnumMap, este important de menționat și faptul că nu vom vedea excepții de genul ConcurrentModificationException atunci când vom lucra cu o implementare de genul.
  • Valoarea null pentru cheie nu e permisă, dar e permisă în schimb pentru valoare. Good to know :)
  • Last but not least, EnumMap nu este o implementare sincronizată. Trebuie să implementăm un mecanism extern de sincronizare dacă folosim această implementare într-un mediu multithreading.

Acestea fiind spuse, când folosim o implementare de tipul EnumMap în detrimentul uneia de tipul HashMap? Răspunsul este foarte simplu. Atunci când avem de-a face cu un număr finit și prestabilit de chei și foarte important de același tip.

Iată și un exemplu:

import java.time.Instant;
import java.util.EnumMap;

public class EnumMapExample {

    public static void main(String[] args) {
        final EnumMap<LogKey, Object> logMap = new EnumMap<>(LogKey.class);

        logMap.put(LogKey.TIMESTAMP, Instant.now());
        logMap.put(LogKey.DURATION_MS, 10);
        logMap.put(LogKey.EVENT_TYPE, "simple-log");

        System.out.println(logMap);
    }

    public enum LogKey {
        TIMESTAMP("@timestamp"),
        DURATION_MS("duration-ms"),
        ERROR("error"),
        EVENT_TYPE("event-type");

        private final String label;

        LogKey(String label) {
            this.label = label;
        }

        @Override
        public String toString() {
            return label;
        }
    }
}

Un exemplu de output printat la consolă:

{@timestamp=2023-01-01T09:51:14.027371400Z, duration-ms=10, event-type=simple-log}

Happy coding!

Other Related Posts:

Microbenchmarking with Java

Microbenchmarking with Java

Hello guys,

Today, we are going to continue the series of articles about Java ecosystem. More specific, today, we are going to talk about JMH (Java Microbenchmark Harness).

2nd Apr 2022 - Mihai Surdeanu