LinkedHashMap în Java

HashMap care ține minte ordinea în care au fost adăugate cheile; parcurgerea și afișarea respectă această ordine.

Sintaxă
new LinkedHashMap<>()
new LinkedHashMap<>(Map<? extends K, ? extends V> m)
new LinkedHashMap<>(int capacitate, float factor, boolean ordineAcces)

protected boolean removeEldestEntry(Map.Entry<K, V> eldest)

Ce face LinkedHashMap

LinkedHashMap este un HashMap care leagă în plus perechile într-o listă, în ordinea adăugării. Parcurgerea dă cheile în ordinea în care au intrat prima dată. Dacă pui din nou o cheie existentă, valoarea se schimbă, dar poziția rămâne aceeași.

Cu constructorul cu trei argumente și ordineAcces = true, ordinea devine cea a ultimei folosiri: fiecare get sau put mută cheia la final. Împreună cu metoda removeEldestEntry, suprascrisă, obții un cache LRU (care șterge elementul folosit cel mai demult).

Viteza este aproape aceeași ca la HashMap. Folosește-l când ordinea contează pentru afișare: un meniu, pașii unui formular, coloanele unui raport.

Parametri

Parametru Descriere
m Map din care se copiază perechile, în ordinea lui.
ordineAcces false (implicit): ordinea adăugării. true: ordinea ultimei accesări.

Ce returnează

Un dicționar ordonat, modificabil.

Exemple

Exemplul 1: Pașii unei comenzi, în ordine

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

public class Main {
    public static void main(String[] args) {
        Map<String, String> pasi = new LinkedHashMap<>();
        pasi.put("coș", "gata");
        pasi.put("adresă", "gata");
        pasi.put("plată", "în lucru");
        pasi.put("confirmare", "în așteptare");
        pasi.put("coș", "modificat");   // valoare nouă, aceeași poziție
        pasi.forEach((pas, stare) -> System.out.println(pas + ": " + stare));
    }
}

Rezultat

coș: modificat
adresă: gata
plată: în lucru
confirmare: în așteptare

Exemplul 2: Cache cu ultimele 3 orașe căutate

Clasa anonimă suprascrie removeEldestEntry; când sunt mai mult de 3 perechi, cea folosită cel mai demult dispare. serial cere un serialVersionUID pentru clasele serializabile.

import java.io.Serial;
import java.util.LinkedHashMap;
import java.util.Map;

public class Main {
    public static void main(String[] args) {
        Map<String, Integer> cache = new LinkedHashMap<>(16, 0.75f, true) {
            @Serial
            private static final long serialVersionUID = 1L;

            @Override
            protected boolean removeEldestEntry(Map.Entry<String, Integer> cea) {
                return size() > 3;
            }
        };
        cache.put("Iași", 290_000);
        cache.put("Cluj", 286_000);
        cache.put("Arad", 145_000);
        cache.get("Iași");                 // Iași devine cel mai recent
        cache.put("Sibiu", 134_000);       // iese Cluj
        System.out.println(cache.keySet());
    }
}

Rezultat

[Arad, Iași, Sibiu]

Greșeli frecvente

  • Te aștepți ca o cheie pusă din nou să treacă la final. În modul implicit își păstrează poziția; ca să o muți, întâi remove, apoi put.
  • Crezi că LinkedHashMap sortează cheile. Păstrează ordinea adăugării; pentru sortare folosește TreeMap.

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”.
  • Map: Interfața pentru dicționare: perechi cheie → valoare, în care găsești rapid valoarea după cheie. Cheile sunt unice.
  • HashSet: Mulțimea cea mai rapidă: add, remove și contains în timp aproape constant, dar fără o ordine garantată a elementelor.
  • Map.forEach: Parcurge toate perechile unui map și apelează o funcție cu cheia și valoarea fiecăreia: map.forEach((k, v) -> …).