Sobes.tech
Junior

Ai mai lucrat cu LinkedHashMap?

sobes.tech AI

Răspuns de la AI

Da, am experiență. LinkedHashMap în Java și Kotlin este o implementare a interfeței Map. Combină proprietățile HashMap (accès rapid după cheie O(1) în medie) și LinkedList (menține ordinea de inserare a elementelor).

Caracteristici principale:

  • Păstrarea ordinii: Iterarea asupra elementelor se face în ordinea în care au fost adăugate.
  • Performanță: Adăugarea, eliminarea și căutarea elementelor se realizează cu o complexitate amortizată constantă (O(1)), ca în HashMap.
  • Memorie: Comparativ cu HashMap, LinkedHashMap folosește puțină memorie în plus pentru a stoca legăturile între elemente.
  • Mod de acces: Poate fi configurat pentru a păstra ordinea de acces (elementele utilizate cel mai recent sunt mutate în finalul listei), ceea ce este util pentru implementarea cache-urilor simple LRU (Least Recently Used).

Exemplu de utilizare pentru un cache LRU:

// Creăm un cache cu dimensiunea maximă de 5
// true în constructor activează modul de acces
LinkedHashMap<String, String> lruCache = new LinkedHashMap<>(5, 0.75f, true) {
    @Override
    protected boolean removeEldestEntry(Map.Entry<String, String> eldest) {
        // Elimină cel mai vechi element dacă dimensiunea depășește 5
        return size() > 5;
    }
};

lruCache.put("key1", "value1");
lruCache.put("key2", "value2");
lruCache.put("key3", "value3");
System.out.println(lruCache.get("key1")); // Acces la key1, se mută în final
lruCache.put("key4", "value4");
lruCache.put("key5", "value5");
lruCache.put("key6", "value6"); // Cache-ul depășește dimensiunea, se elimină cel mai vechi (key2, dacă fără acces; key3, dacă cu acces la key1)

System.out.println(lruCache);
// Creăm un cache cu modul de acces (true)
val lruCache = object : LinkedHashMap<String, String>(5, 0.75f, true) {
    override fun removeEldestEntry(eldest: Map.Entry<String, String>?): Boolean {
        // Elimină cel mai vechi element dacă dimensiunea depășește 5
        return size > 5
    }
}

lruCache["key1"] = "value1"
lruCache["key2"] = "value2"
lruCache["key3"] = "value3"
println(lruCache["key1"]) // Acces la key1, se mută în final
lruCache["key4"] = "value4"
lruCache["key5"] = "value5"
lruCache["key6"] = "value6" // Cache-ul depășește dimensiunea, se elimină cel mai vechi

println(lruCache)

LinkedHashMap este util atunci când ordinea de iterare a elementelor este importantă, precum și pentru implementarea cache-urilor LRU simple.