Map în Java

Interfața pentru dicționare: perechi cheie → valoare, în care găsești rapid valoarea după cheie. Cheile sunt unice.

Sintaxă
import java.util.Map;
import java.util.HashMap;

Map<K, V> nume = new HashMap<>();
Map<K, V> nume = new TreeMap<>();
Map<K, V> nume = Map.of(k1, v1, k2, v2);

Ce face Map

Un Map (dicționar, tabel asociativ) leagă fiecare cheie de o valoare: „Iași” → 290 000 locuitori, „Ana” → nota 9. Cheile sunt unice: dacă pui din nou o cheie existentă, valoarea veche este înlocuită. Valorile se pot repeta.

Operațiile de bază: put(cheie, valoare) adaugă sau înlocuiește, get(cheie) citește (sau null dacă nu există), containsKey verifică, remove șterge. Parcurgi perechile cu entrySet() sau forEach((k, v) -> ...).

Implementări: HashMap (cea mai rapidă, ordine nespecificată), LinkedHashMap (ordinea adăugării) și TreeMap (chei sortate). Map nu extinde Collection, dar îți dă colecții prin keySet(), values() și entrySet().

Parametri

Parametru Descriere
K Tipul cheilor (de obicei String, Integer, un enum sau un record).
V Tipul valorilor.

Ce returnează

Un obiect care implementează Map.

Exemple

Exemplul 1: Populația orașelor

import java.util.Map;
import java.util.TreeMap;

public class Main {
    public static void main(String[] args) {
        Map<String, Integer> populatie = new TreeMap<>();
        populatie.put("Iași", 290_000);
        populatie.put("Cluj-Napoca", 286_000);
        populatie.put("Timișoara", 250_000);

        System.out.println(populatie);
        System.out.println("Iași: " + populatie.get("Iași"));
        System.out.println("Brașov: " + populatie.get("Brașov"));
        System.out.println("Orașe: " + populatie.size());
    }
}

Rezultat

{Cluj-Napoca=286000, Iași=290000, Timișoara=250000}
Iași: 290000
Brașov: null
Orașe: 3

Exemplul 2: Numărarea aparițiilor

Pentru fiecare cuvânt, merge pune 1 sau adună 1 la valoarea existentă.

import java.util.Map;
import java.util.TreeMap;

public class Main {
    public static void main(String[] args) {
        String[] voturi = {"Ana", "Radu", "Ana", "Elena", "Ana", "Radu"};
        Map<String, Integer> numar = new TreeMap<>();
        for (String v : voturi) {
            numar.merge(v, 1, Integer::sum);
        }
        numar.forEach((nume, n) -> System.out.println(nume + ": " + n + (n == 1 ? " vot" : " voturi")));
    }
}

Rezultat

Ana: 3 voturi
Elena: 1 vot
Radu: 2 voturi

Exemplul 3: Cheile sunt unice

import java.util.LinkedHashMap;
import java.util.Map;

public class Main {
    public static void main(String[] args) {
        Map<String, Integer> note = new LinkedHashMap<>();
        note.put("Ana", 7);
        note.put("Mihai", 9);
        Integer veche = note.put("Ana", 10);
        System.out.println("Valoarea înlocuită: " + veche);
        System.out.println(note);
    }
}

Rezultat

Valoarea înlocuită: 7
{Ana=10, Mihai=9}

Greșeli frecvente

  • Scrii new Map<>(). Map este o interfață; folosește new HashMap<>() sau new TreeMap<>().
  • Folosești get și apoi faci calcule cu rezultatul fără să verifici null: int n = map.get("x"); aruncă NullPointerException dacă cheia lipsește. Folosește getOrDefault.
  • Te bazezi pe ordinea afișării unui HashMap. Nu este garantată; folosește TreeMap sau LinkedHashMap.

Comenzi înrudite

  • HashMap: Dicționarul cel mai rapid: put, get și remove în timp aproape constant, dar fără ordine garantată a cheilor.
  • TreeMap: Dicționar care ține cheile mereu sortate și oferă căutări de tip „prima cheie”, „cea mai apropiată cheie”, „intervalul de chei”.
  • LinkedHashMap: HashMap care ține minte ordinea în care au fost adăugate cheile; parcurgerea și afișarea respectă această ordine.
  • Map.put: put adaugă o pereche cheie → valoare sau înlocuiește valoarea unei chei existente; putAll copiază toate perechile altui map.
  • Map.get: get returnează valoarea unei chei sau null dacă lipsește; getOrDefault returnează o valoare de rezervă în loc de null.
  • Map.entrySet: entrySet() dă perechile cheie-valoare ale unui map, ca obiecte Map.Entry; Map.entry(k, v) creează o astfel de pereche.
  • Map.merge: Pune valoarea dacă cheia lipsește; dacă există, combină valoarea veche cu cea nouă (de exemplu le adună). Ideal pentru numărători și totaluri.
  • Set: Interfața pentru mulțimi: colecții fără duplicate, în care întrebi rapid dacă un element există.