I Java är map datastrukturer som kopplar nycklar till värden och gör det möjligt att effektivt lagra, hämta, uppdatera och ta bort nyckel-värde-par. Till skillnad från samlingar, som endast lagrar element, upprätthåller map en mappningsrelation där varje nyckel är unik och pekar på exakt ett värde, även om flera nycklar kan ha samma värde.

Gränssnittet Map tillhandahåller mekanismer för att hämta värden med hjälp av unika (icke-duplicerade) nycklar. Det tillhandahåller också tre samlingsvyer som gör det möjligt att hantera innehållet i en map på olika sätt: som en mängd av nycklar, en samling av värden eller en mängd av mappningar mellan nycklar och värden. Det viktigaste gränssnittet som härstammar från Map är SortedMap, som representerar sorterade map, samt dess undergränssnitt NavigableMap. Map används i stor utsträckning av klasser i standardbiblioteket. De viktigaste klasserna som implementerar gränssnittet Map för icke-konkurrrenta map är HashMap, LinkedHashMap och TreeMap. För samtidiga map är ConcurrentHashMap och ConcurrentSkipListMap de viktigaste klasserna.

Nedan visas en del av definitionen av gränssnittet Map, med endast de viktigaste metoderna:

public interface Map<K,V>{
    // Query Operations
    int size();
    boolean isEmpty();
    boolean containsKey(Object key);
    boolean containsValue(Object value);
    V get(Object key);

    // Modification Operations
    V put(K key, V value);
    V remove(Object key);
    void putAll(Map<? extends K, ? extends V> m);
    void clear();

    // Views
    Set<K> keySet();
    Collection<V> values();
    Set<Map.Entry<K, V>> entrySet();

    // Definition of the Entry interface
    interface Entry<K, V> {
        // Body omitted
    }

    // (continues...)
}

Följande exempel visar en map med bilar där nycklarna är registreringsnummer och värdena är namnen på motsvarande bilmodeller. Med denna map kan vi till exempel kontrollera om ett visst element finns genom att använda nyckeln som argument till metoden containsKey. Dessutom returnerar metoden get det värde som är kopplat till nyckeln som skickas som argument, medan metoden remove tar bort posten från mappen:

void main() {
    Map<String, String> cars = new HashMap<>();
    cars.put("ABCD2935", "Tesla Model S");
    cars.put("YJKF9353", "Toyota Corolla");
    cars.put("WFLO1304", "Honda CRV");

    var key = "ABCD2935";

    if (cars.containsKey(key)){
        IO.println("Vehicle data:");
        IO.println(cars.get(key));
        IO.println("Removing the vehicle...");
        cars.remove(key);
    } else
        IO.println("Vehicle not found!");
}

Utöver de metoder som beskrivs ovan finns det också flera default-metoder som tillhandahåller ytterligare funktionalitet.

Gränssnittet tillhandahåller dessutom metoder för att skapa oföränderliga map från angivna värden (of och ofEntries, tillsammans med hjälpfunktionen entry) eller från en befintlig map (copyOf).

Figur 1 visar gränssnittet Map och dess viktigaste undergränssnitt. De direkta undergränssnitten till Map är SequencedMap, Bindings och ConcurrentMap. Indirekt härstammar även SortedMap, NavigableMap och ConcurrentNavigableMap från Map (det sistnämnda är dessutom ett undergränssnitt till ConcurrentMap).

Map-gränssnittet och dess undergränssnitt

Bland de viktigaste efterföljarna till Map finns gränssnitten SortedMap och NavigableMap.

Gränssnittet SortedMap är en utvidgning av gränssnittet SequencedMap och representerar map som håller sina nycklar i en viss ordning, enligt nycklarnas naturliga ordning eller en viss Comparator som anges när mappen skapas. Dess enda direkta undergränssnitt inom Collections Framework, NavigableMap, lägger till metoder för mer avancerade navigeringsoperationer, till exempel för att hitta den nyckel som ligger närmast ett visst värde eller för att gå igenom mappen i stigande eller fallande ordning.

I praktiken använder vi ofta NavigableMap i stället för SortedMap, eftersom båda klasserna som implementerar SortedMap i Collections Framework gör det indirekt (TreeMap implementerar NavigableMap och ConcurrentSkipListMap implementerar ConcurrentNavigableMap). NavigableMap erbjuder något mer funktionalitet och tillhandahåller särskilda metoder för navigering genom mappen, på liknande sätt som NavigableSet för mängder.


Den här artikeln är en bearbetning av innehåll från boken Orientação a Objetos com Java av Eduardo Kessler Piveta