Sobes.tech
Junior

Stretli ste sa s LinkedHashMap?

sobes.tech AI

Odpoveď od AI

Áno, stretol som sa tým. LinkedHashMap v Jave a Kotlin je implementácia rozhrania Map. Kombinuje vlastnosti HashMap (rýchly prístup podľa kľúča O(1) v priemere) a LinkedList (uchováva poradie vloženia prvkov).

Hlavné vlastnosti:

  • Uchovávanie poradia: Iterácia cez prvky prebieha v poradí, v akom boli pridané.
  • Výkon: Pridanie, odstránenie a vyhľadávanie prvkov sa vykonáva s amortizovanou konštantnou zložitostí (O(1)), ako pri HashMap.
  • Pamäť: V porovnaní s HashMap LinkedHashMap používa trochu viac pamäte na uloženie väzieb medzi prvkami.
  • Režim prístupu: Môže byť nastavená na uchovávanie poradia prístupu (posledne použité prvky sa presúvajú na koniec zoznamu), čo je užitočné pre implementáciu cache s politikou najmenej používaných (LRU - Least Recently Used).

Príklad použitia pre LRU cache:

// Vytvárame cache s maximálnou veľkosťou 5
// true v konštruktore zapína režim prístupu
LinkedHashMap<String, String> lruCache = new LinkedHashMap<>(5, 0.75f, true) {
    @Override
    protected boolean removeEldestEntry(Map.Entry<String, String> eldest) {
        // Odstraňujeme najstarší prvok, ak veľkosť presahuje 5
        return size() > 5;
    }
};

lruCache.put("key1", "value1");
lruCache.put("key2", "value2");
lruCache.put("key3", "value3");
System.out.println(lruCache.get("key1")); // Prístup k key1, presunie sa na koniec
lruCache.put("key4", "value4");
lruCache.put("key5", "value5");
lruCache.put("key6", "value6"); // Cache presahuje veľkosť, odstraňuje najstarší (key2, ak bez prístupu; key3, ak s prístupom k key1)

System.out.println(lruCache);
// Vytvárame cache s režimom prístupu (true)
val lruCache = object : LinkedHashMap<String, String>(5, 0.75f, true) {
    override fun removeEldestEntry(eldest: Map.Entry<String, String>?): Boolean {
        // Odstraňujeme najstarší prvok, ak veľkosť presahuje 5
        return size > 5
    }
}

lruCache["key1"] = "value1"
lruCache["key2"] = "value2"
lruCache["key3"] = "value3"
println(lruCache["key1"]) // Prístup k key1, presunie sa na koniec
lruCache["key4"] = "value4"
lruCache["key5"] = "value5"
lruCache["key6"] = "value6" // Cache presahuje veľkosť, odstraňuje sa najstarší

println(lruCache)

LinkedHashMap je užitočná, keď je dôležitý poradie iterácie cez prvky, ako aj pre implementáciu jednoduchých LRU cache.