Sobes.tech
Junior

Czy miałeś do czynienia z LinkedHashMap?

sobes.tech AI

Odpowiedź od AI

Tak, mam doświadczenie. LinkedHashMap w Java i Kotlin jest implementacją interfejsu Map. Łączy właściwości HashMap (szybki dostęp po kluczu O(1) średnio) i LinkedList (zachowuje kolejność dodawania elementów).

Główne cechy:

  • Zachowanie kolejności: Iteracja po elementach odbywa się w kolejności, w jakiej zostały dodane.
  • Wydajność: Dodawanie, usuwanie i wyszukiwanie elementów odbywa się z amortyzowaną stałą złożonością (O(1)), jak w HashMap.
  • Pamięć: W porównaniu do HashMap, LinkedHashMap używa nieco więcej pamięci do przechowywania powiązań między elementami.
  • Tryb dostępu: Może być skonfigurowany do zachowania kolejności dostępu (ostatnio używane elementy są przenoszone na koniec listy), co jest przydatne do implementacji prostych pamięci podręcznych LRU (Least Recently Used).

Przykład użycia dla pamięci podręcznej LRU:

// Tworzymy pamięć podręczną o maksymalnym rozmiarze 5
// true w konstruktorze włącza tryb dostępu
LinkedHashMap<String, String> lruCache = new LinkedHashMap<>(5, 0.75f, true) {
    @Override
    protected boolean removeEldestEntry(Map.Entry<String, String> eldest) {
        // Usuwa najstarszy element, jeśli rozmiar przekracza 5
        return size() > 5;
    }
};

lruCache.put("key1", "value1");
lruCache.put("key2", "value2");
lruCache.put("key3", "value3");
System.out.println(lruCache.get("key1")); // Dostęp do key1, przenosi go na koniec
lruCache.put("key4", "value4");
lruCache.put("key5", "value5");
lruCache.put("key6", "value6"); // Przekracza rozmiar, usuwany jest najstarszy (key2, jeśli bez dostępu; key3, jeśli z dostępem do key1)

System.out.println(lruCache);
// Tworzymy pamięć podręczną z trybem dostępu (true)
val lruCache = object : LinkedHashMap<String, String>(5, 0.75f, true) {
    override fun removeEldestEntry(eldest: Map.Entry<String, String>?): Boolean {
        // Usuwa najstarszy element, jeśli rozmiar przekracza 5
        return size > 5
    }
}

lruCache["key1"] = "value1"
lruCache["key2"] = "value2"
lruCache["key3"] = "value3"
println(lruCache["key1"]) // Dostęp do key1, przenosi go na koniec
lruCache["key4"] = "value4"
lruCache["key5"] = "value5"
lruCache["key6"] = "value6" // Przekracza rozmiar, usuwany jest najstarszy

println(lruCache)

LinkedHashMap jest przydatny, gdy kolejność iteracji elementów jest ważna, a także do implementacji prostych pamięci podręcznych LRU.