Sobes.tech
Junior

Setkali jste se s LinkedHashMap?

sobes.tech AI

Odpověď od AI

Ano, mám s tím zkušenosti. LinkedHashMap v Java a Kotlinu je implementace rozhraní Map. Kombinuje vlastnosti HashMap (rychlý přístup přes klíč O(1) v průměru) a LinkedList (uchovává pořadí vložení prvků).

Hlavní vlastnosti:

  • Uchovávání pořadí: Iterace přes prvky probíhá v pořadí, ve kterém byly přidány.
  • Výkon: Přidání, odstranění a hledání prvků se provádí s amortizovanou konstantní složitostí (O(1)), stejně jako u HashMap.
  • Paměť: Ve srovnání s HashMap LinkedHashMap používá trochu více paměti na uložení vazeb mezi prvky.
  • Režim přístupu: Může být nakonfigurována tak, aby zachovala pořadí přístupu (poslední použití prvků se přesune na konec seznamu), což je užitečné pro implementaci jednoduchých cache s politikou odstraňování nejméně používaných (LRU - Least Recently Used).

Příklad použití pro LRU cache:

// Vytvoříme cache s maximální velikostí 5
// true v konstruktoru aktivuje režim přístupu
LinkedHashMap<String, String> lruCache = new LinkedHashMap<>(5, 0.75f, true) {
    @Override
    protected boolean removeEldestEntry(Map.Entry<String, String> eldest) {
        // Odstraní nejstarší prvek, pokud velikost přesáhne 5
        return size() > 5;
    }
};

lruCache.put("key1", "value1");
lruCache.put("key2", "value2");
lruCache.put("key3", "value3");
System.out.println(lruCache.get("key1")); // Přístup k key1, přesune se na konec
lruCache.put("key4", "value4");
lruCache.put("key5", "value5");
lruCache.put("key6", "value6"); // Překročí velikost, odstraní se nejstarší (key2 nebo key3, podle přístupu)

System.out.println(lruCache);
// Vytvoření cache s režimem přístupu (true)
val lruCache = object : LinkedHashMap<String, String>(5, 0.75f, true) {
    override fun removeEldestEntry(eldest: Map.Entry<String, String>?): Boolean {
        // Odstraní nejstarší prvek, pokud velikost přesáhne 5
        return size > 5
    }
}

lruCache["key1"] = "value1"
lruCache["key2"] = "value2"
lruCache["key3"] = "value3"
println(lruCache["key1"]) // Přístup k key1, přesune se na konec
lruCache["key4"] = "value4"
lruCache["key5"] = "value5"
lruCache["key6"] = "value6" // Překročí velikost, odstraní se nejstarší

println(lruCache)

LinkedHashMap je užitečná, když je důležitý pořadí iterace přes prvky, stejně jako pro implementaci jednoduchých LRU cache.