Sobes.tech
Junior

Да ли сте икада радили са LinkedHashMap?

sobes.tech АИ

Одговор од АИ

Da, susretao sam se. LinkedHashMap u Javi i Kotlinu je implementacija interfejsa Map. Kombinuje osobine HashMap (brz pristup po ključevi O(1) u proseku) i LinkedList (čuva redosled umetanja elemenata).

Glavne osobine:

  • Čuvanje reda: Iteracija kroz elemente se vrši u redosledu u kojem su dodati.
  • Performanse: Dodavanje, brisanje i pretraživanje elemenata vrši se sa amortizovanom konstantnom složenošću (O(1)), kao kod HashMap.
  • Memorija: U poređenju sa HashMap, LinkedHashMap koristi malo više memorije za čuvanje veza između elemenata.
  • Režim pristupa: Može biti podešen na čuvanje reda pristupa (poslednji korišćeni elementi se pomeraju na kraj liste), što je korisno za implementaciju keševa sa politikom najređe korišćenih (LRU - Least Recently Used).

Primer korišćenja za LRU keš:

// Kreiramo keš sa maksimalnim brojem od 5
// true u konstruktoru uključuje režim pristupa
LinkedHashMap<String, String> lruCache = new LinkedHashMap<>(5, 0.75f, true) {
    @Override
    protected boolean removeEldestEntry(Map.Entry<String, String> eldest) {
        // Uklanjamo najstariji element ako je veličina veća od 5
        return size() > 5;
    }
};

lruCache.put("key1", "value1");
lruCache.put("key2", "value2");
lruCache.put("key3", "value3");
System.out.println(lruCache.get("key1")); // Pristup key1, on se pomera na kraj
lruCache.put("key4", "value4");
lruCache.put("key5", "value5");
lruCache.put("key6", "value6"); // Keš premašuje veličinu, uklanja se najstariji (key2, ako bez pristupa; key3, ako sa pristupom ka key1)

System.out.println(lruCache);
// Kreiramo keš sa režimom pristupa (true)
val lruCache = object : LinkedHashMap<String, String>(5, 0.75f, true) {
    override fun removeEldestEntry(eldest: Map.Entry<String, String>?): Boolean {
        // Uklanjamo najstariji element ako je veličina veća od 5
        return size > 5
    }
}

lruCache["key1"] = "value1"
lruCache["key2"] = "value2"
lruCache["key3"] = "value3"
println(lruCache["key1"]) // Pristup key1, on se pomera na kraj
lruCache["key4"] = "value4"
lruCache["key5"] = "value5"
lruCache["key6"] = "value6" // Keš premašuje veličinu, uklanja se najstariji

println(lruCache)

LinkedHashMap je korisna kada je važan redosled iteracije kroz elemente, kao i za implementaciju jednostavnih LRU keševa.