0Pricing
Java Academy · Lección

EnumMap

Mapas eficientes con claves enum

EnumMap es una lección gratuita de Java Academy en CoddyKit. Esta es la lección 4 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de Java Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de Java Academy incluye 4 lecciones en total.

¿Qué es EnumMap?

EnumMap es una implementación especializada de Map cuyas claves son constantes de un único tipo enumeración.

Internamente se basa en un arreglo simple indexado mediante el ordinal de la constante. Esto hace que las búsquedas y las inserciones sean extremadamente rápidas, sin hashing.

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

public class Main {
    enum Day { MON, TUE, WED }
    public static void main(String[] args) {
        Map<Day, String> plan = new EnumMap<>(Day.class);
        plan.put(Day.MON, "Gym");
        plan.put(Day.WED, "Swim");
        System.out.println(plan);
    }
}

La construcción necesita la clase

EnumMap debe conocer de antemano el tipo de clave, por lo que el constructor recibe el objeto Class: new EnumMap<>(Day.class).

Así puede dimensionar su arreglo interno según el número de constantes.

import java.util.EnumMap;

public class Main {
    enum Priority { LOW, MEDIUM, HIGH }
    public static void main(String[] args) {
        EnumMap<Priority, Integer> counts = new EnumMap<>(Priority.class);
        counts.put(Priority.HIGH, 5);
        System.out.println(counts.get(Priority.HIGH));
    }
}

Velocidad basada en arreglos

Como las claves se almacenan en array[ordinal], get y put son accesos directos al arreglo, más rápidos que el hashing y el recorrido de cubetas de HashMap.

No se encaja la clave ni se llama a hashCode.

import java.util.EnumMap;

public class Main {
    enum Slot { A, B, C, D }
    public static void main(String[] args) {
        EnumMap<Slot, Integer> m = new EnumMap<>(Slot.class);
        for (Slot s : Slot.values()) m.put(s, s.ordinal() * 10);
        System.out.println(m.get(Slot.C));
    }
}

Iteración en el orden de las claves

EnumMap itera las entradas en el orden natural de las claves, que es su orden de declaración.

Esto proporciona una salida estable y predecible, a diferencia de HashMap.

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

public class Main {
    enum Phase { PLAN, BUILD, SHIP }
    public static void main(String[] args) {
        Map<Phase, Integer> hours = new EnumMap<>(Phase.class);
        hours.put(Phase.SHIP, 3);
        hours.put(Phase.PLAN, 8);
        hours.put(Phase.BUILD, 20);
        for (Map.Entry<Phase, Integer> e : hours.entrySet()) {
            System.out.println(e.getKey() + " = " + e.getValue());
        }
    }
}

Las claves null no están permitidas

EnumMap no permite claves null; una clave null lanza NullPointerException.

Los valores null sí están permitidos, igual que en otros mapas.

import java.util.EnumMap;

public class Main {
    enum K { A, B }
    public static void main(String[] args) {
        EnumMap<K, String> m = new EnumMap<>(K.class);
        m.put(K.A, null); // null value is fine
        System.out.println("A -> " + m.get(K.A));
        System.out.println("contains A: " + m.containsKey(K.A));
    }
}

Agrupar con EnumMap

Un uso habitual es contar o agrupar por una categoría de enumeración. merge hace que el recuento sea conciso.

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

public class Main {
    enum Type { FRUIT, VEG, MEAT }
    record Item(String name, Type type) {}
    public static void main(String[] args) {
        List<Item> items = List.of(new Item("apple", Type.FRUIT), new Item("pear", Type.FRUIT), new Item("beef", Type.MEAT));
        Map<Type, Integer> counts = new EnumMap<>(Type.class);
        for (Item i : items) counts.merge(i.type(), 1, Integer::sum);
        System.out.println(counts);
    }
}

getOrDefault y computeIfAbsent

Todos los métodos predeterminados estándar de Map funcionan. getOrDefault evita comprobaciones de null y computeIfAbsent construye los valores de forma diferida.

import java.util.ArrayList;
import java.util.EnumMap;
import java.util.List;
import java.util.Map;

public class Main {
    enum Group { A, B }
    public static void main(String[] args) {
        Map<Group, List<String>> m = new EnumMap<>(Group.class);
        m.computeIfAbsent(Group.A, k -> new ArrayList<>()).add("first");
        System.out.println(m);
        System.out.println(m.getOrDefault(Group.B, List.of()));
    }
}

Constructor de copia

EnumMap tiene un constructor de copia que acepta otro Map. Si el origen es un EnumMap, el tipo de clave se infiere a partir de él.

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

public class Main {
    enum K { X, Y }
    public static void main(String[] args) {
        EnumMap<K, Integer> a = new EnumMap<>(K.class);
        a.put(K.X, 1);
        EnumMap<K, Integer> b = new EnumMap<>(a);
        b.put(K.Y, 2);
        System.out.println("copy: " + b);
    }
}

EnumMap frente a arreglos indexados por ordinal

Antes de EnumMap, se utilizaban arreglos sin tipo indexados mediante ordinal(). Esto resulta frágil e inseguro.

EnumMap ofrece la misma velocidad de los arreglos, con seguridad de tipos, seguridad de límites y una API de Map clara.

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

public class Main {
    enum Season { SPRING, SUMMER, FALL, WINTER }
    public static void main(String[] args) {
        Map<Season, String> mood = new EnumMap<>(Season.class);
        mood.put(Season.SUMMER, "sunny");
        // Safer and clearer than String[] indexed by ordinal
        System.out.println(mood.get(Season.SUMMER));
    }
}

EnumMaps anidados

Puede anidar EnumMaps para modelar una matriz cuyas claves sean dos enumeraciones, como una tabla de transiciones de estados.

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

public class Main {
    enum State { SOLID, LIQUID, GAS }
    enum Transition { MELT, FREEZE }
    public static void main(String[] args) {
        Map<State, Map<Transition, State>> table = new EnumMap<>(State.class);
        Map<Transition, State> solid = new EnumMap<>(Transition.class);
        solid.put(Transition.MELT, State.LIQUID);
        table.put(State.SOLID, solid);
        System.out.println(table.get(State.SOLID).get(Transition.MELT));
    }
}

Elegir el tipo adecuado

Regla general:

  • Si las claves son constantes de una enumeración y necesita un mapa, use EnumMap.
  • Si necesita un conjunto de enumeraciones, use EnumSet.
  • Si las claves son objetos arbitrarios, use HashMap.
import java.util.EnumMap;
import java.util.Map;

public class Main {
    enum Level { DEBUG, INFO, WARN, ERROR }
    public static void main(String[] args) {
        Map<Level, Integer> thresholds = new EnumMap<>(Level.class);
        for (Level l : Level.values()) thresholds.put(l, l.ordinal() * 100);
        System.out.println(thresholds);
    }
}

Comprobación rápida

Compruebe sus conocimientos sobre EnumMap.

Repaso

Ha aprendido sobre EnumMap:

  • Un Map basado en un arreglo cuyas claves son constantes de una enumeración.
  • El constructor recibe la Class de la clave; no se permiten claves null.
  • Itera en el orden de declaración.
  • Es el reemplazo seguro y rápido de los arreglos indexados por ordinal.

Ha completado el curso avanzado sobre enumeraciones.

import java.util.EnumMap;

public class Main {
    enum K { A }
    public static void main(String[] args) {
        EnumMap<K, String> m = new EnumMap<>(K.class);
        m.put(K.A, "done");
        System.out.println("EnumMap course complete: " + m.get(K.A));
    }
}

Preguntas frecuentes

¿La lección «EnumMap» es gratis?

Sí — el texto completo de «EnumMap» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de Java Academy, actualiza a CoddyKit PRO. El curso de Java Academy incluye 4 lecciones en total.

¿Qué aprenderé en «EnumMap»?

Mapas eficientes con claves enum Practicas Java Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.

¿Necesito experiencia previa para empezar Java Academy?

No se requiere experiencia previa. Java Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 4 de 4.

¿Cuánto tiempo toma la lección «EnumMap»?

La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.

¿Puedo escribir y ejecutar código en esta lección de Java Academy?

Sí. Cada lección de Java Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.

Todas las lecciones de este curso

  1. Enums con campos y métodos
  2. Métodos abstractos en enums
  3. EnumSet
  4. EnumMap
← Volver a Java Academy