Sobes.tech
Junior

Haben Sie schon einmal mit LinkedHashMap gearbeitet?

sobes.tech KI

Antwort von AI

Ja, ich habe Erfahrung damit. LinkedHashMap in Java und Kotlin ist eine Implementierung des Map-Interfaces. Es kombiniert die Eigenschaften von HashMap (schneller Zugriff nach Schlüssel O(1) im Durchschnitt) und LinkedList (bewahrt die Einfügereihenfolge der Elemente).

Hauptmerkmale:

  • Reihenfolge beibehalten: Die Iteration erfolgt in der Reihenfolge, in der die Elemente hinzugefügt wurden.
  • Leistung: Das Hinzufügen, Entfernen und Suchen von Elementen erfolgt mit amortisiert konstanter Komplexität (O(1)), wie bei HashMap.
  • Speicher: Im Vergleich zu HashMap verwendet LinkedHashMap etwas mehr Speicher, um die Verbindungen zwischen den Elementen zu speichern.
  • Zugriffsmodus: Kann so konfiguriert werden, dass die Zugriffsreihenfolge beibehalten wird (zuletzt verwendete Elemente werden ans Ende verschoben), was nützlich ist, um einfache LRU-Caches (Least Recently Used) zu implementieren.

Beispiel für die Verwendung in einem LRU-Cache:

// Erstellen eines Caches mit maximaler Größe 5
// true im Konstruktor aktiviert den Zugriffsmodus
LinkedHashMap<String, String> lruCache = new LinkedHashMap<>(5, 0.75f, true) {
    @Override
    protected boolean removeEldestEntry(Map.Entry<String, String> eldest) {
        // Entfernt das älteste Element, wenn die Größe 5 überschreitet
        return size() > 5;
    }
};

lruCache.put("key1", "value1");
lruCache.put("key2", "value2");
lruCache.put("key3", "value3");
System.out.println(lruCache.get("key1")); // Zugriff auf key1, verschiebt es ans Ende
lruCache.put("key4", "value4");
lruCache.put("key5", "value5");
lruCache.put("key6", "value6"); // Der Cache überschreitet die Größe, das älteste Element wird entfernt (key2, wenn kein Zugriff; key3, wenn Zugriff auf key1)

System.out.println(lruCache);
// Erstellen eines Caches mit Zugriffsmodus (true)
val lruCache = object : LinkedHashMap<String, String>(5, 0.75f, true) {
    override fun removeEldestEntry(eldest: Map.Entry<String, String>?): Boolean {
        // Entfernt das älteste Element, wenn die Größe 5 überschreitet
        return size > 5
    }
}

lruCache["key1"] = "value1"
lruCache["key2"] = "value2"
lruCache["key3"] = "value3"
println(lruCache["key1"]) // Zugriff auf key1, verschiebt es ans Ende
lruCache["key4"] = "value4"
lruCache["key5"] = "value5"
lruCache["key6"] = "value6" // Der Cache überschreitet die Größe, das älteste Element wird entfernt

println(lruCache)

LinkedHashMap ist nützlich, wenn die Iterationsreihenfolge der Elemente wichtig ist, sowie für die Implementierung einfacher LRU-Caches.