Sobes.tech
Junior

Találkozott már a LinkedHashMap-kel?

sobes.tech MI

Válasz az MI-től

Igen, van tapasztalatom. A LinkedHashMap Java-ban és Kotlinban egy Map interfész megvalósítása. Összevonja a HashMap (gyors hozzáférés kulcs szerint O(1) átlagosan) és a LinkedList (megőrzi az elemek beszúrási sorrendjét) tulajdonságait.

Fő jellemzők:

  • Sorrend megőrzése: Az elemek közötti iteráció a hozzáadás sorrendjében történik.
  • Teljesítmény: Az elemek hozzáadása, törlése és keresése amortizált állandó komplexitással (O(1)) történik, mint a HashMap-nál.
  • Memória: A HashMap-hoz képest a LinkedHashMap valamivel több memóriát használ az elemek közötti kapcsolatok tárolására.
  • Hozzáférési mód: Beállítható úgy, hogy megőrizze a hozzáférési sorrendet (a legutóbb használt elemeket a lista végére mozgatja), ami hasznos egyszerű LRU (Least Recently Used) cache-ek megvalósításához.

Példa egy LRU cache használatára:

// Létrehozunk egy cache-t maximális mérettel 5
// A konstruktorban a true aktiválja a hozzáférési módot
LinkedHashMap<String, String> lruCache = new LinkedHashMap<>(5, 0.75f, true) {
    @Override
    protected boolean removeEldestEntry(Map.Entry<String, String> eldest) {
        // A legrégebbi elem eltávolítása, ha a méret meghaladja az 5-öt
        return size() > 5;
    }
};

lruCache.put("key1", "value1");
lruCache.put("key2", "value2");
lruCache.put("key3", "value3");
System.out.println(lruCache.get("key1")); // Hozzáférés a key1-hez, az a végére kerül
lruCache.put("key4", "value4");
lruCache.put("key5", "value5");
lruCache.put("key6", "value6"); // A cache meghaladja a méretet, a legrégebbi (key2 vagy key3, hozzáférés nélkül; key3, ha hozzáférés van a key1-hez)

System.out.println(lruCache);
// Hozzáférési móddal rendelkező cache létrehozása (true)
val lruCache = object : LinkedHashMap<String, String>(5, 0.75f, true) {
    override fun removeEldestEntry(eldest: Map.Entry<String, String>?): Boolean {
        // A legrégebbi elem eltávolítása, ha a méret meghaladja az 5-öt
        return size > 5
    }
}

lruCache["key1"] = "value1"
lruCache["key2"] = "value2"
lruCache["key3"] = "value3"
println(lruCache["key1"]) // Hozzáférés a key1-hez, az a végére kerül
lruCache["key4"] = "value4"
lruCache["key5"] = "value5"
lruCache["key6"] = "value6" // A cache meghaladja a méretet, a legrégebbi eltávolításra kerül

println(lruCache)

A LinkedHashMap akkor hasznos, ha az elemek iterálási sorrendje fontos, valamint egyszerű LRU cache-ek megvalósítására.