Sobes.tech
Junior

Έχετε αντιμετωπίσει ποτέ το LinkedHashMap;

sobes.tech AI

Απάντηση από AI

Ναι, έχω εμπειρία. Το LinkedHashMap σε Java και Kotlin είναι μια υλοποίηση της διεπαφής Map. Συνδυάζει τις ιδιότητες του HashMap (γρήγορη πρόσβαση μέσω κλειδιού O(1) κατά μέσο όρο) και του LinkedList (διατηρεί τη σειρά εισαγωγής των στοιχείων).

Βασικά χαρακτηριστικά:

  • Διατήρηση σειράς: Η επανάληψη στα στοιχεία γίνεται με τη σειρά που προστέθηκαν.
  • Απόδοση: Η προσθήκη, διαγραφή και αναζήτηση στοιχείων πραγματοποιούνται με μια κατανεμημένη σταθερή πολυπλοκότητα (O(1)), όπως στο HashMap.
  • Μνήμη: Σε σύγκριση με το HashMap, το LinkedHashMap χρησιμοποιεί λίγο περισσότερο μνήμη για την αποθήκευση των συνδέσεων μεταξύ των στοιχείων.
  • Mode πρόσβασης: Μπορεί να διαμορφωθεί ώστε να διατηρεί τη σειρά πρόσβασης (τα πιο πρόσφατα χρησιμοποιημένα στοιχεία μετακινούνται στο τέλος της λίστας), κάτι που είναι χρήσιμο για την υλοποίηση απλών cache με πολιτική απομάκρυνσης των λιγότερο χρησιμοποιημένων (LRU - Least Recently Used).

Παράδειγμα χρήσης για ένα LRU cache:

// Δημιουργία cache με μέγιστο μέγεθος 5
// true στο κατασκευαστή ενεργοποιεί τη λειτουργία πρόσβασης
LinkedHashMap<String, String> lruCache = new LinkedHashMap<>(5, 0.75f, true) {
    @Override
    protected boolean removeEldestEntry(Map.Entry<String, String> eldest) {
        // Αφαιρεί το παλαιότερο στοιχείο αν το μέγεθος υπερβαίνει το 5
        return size() > 5;
    }
};

lruCache.put("key1", "value1");
lruCache.put("key2", "value2");
lruCache.put("key3", "value3");
System.out.println(lruCache.get("key1")); // Πρόσβαση στο key1, μετακινείται στο τέλος
lruCache.put("key4", "value4");
lruCache.put("key5", "value5");
lruCache.put("key6", "value6"); // Το cache υπερβαίνει το μέγεθος, αφαιρείται το παλαιότερο (key2, αν χωρίς πρόσβαση; key3, αν με πρόσβαση στο key1)

System.out.println(lruCache);
// Δημιουργία cache με mode πρόσβασης (true)
val lruCache = object : LinkedHashMap<String, String>(5, 0.75f, true) {
    override fun removeEldestEntry(eldest: Map.Entry<String, String>?): Boolean {
        // Αφαιρεί το παλαιότερο στοιχείο αν το μέγεθος υπερβαίνει το 5
        return size > 5
    }
}

lruCache["key1"] = "value1"
lruCache["key2"] = "value2"
lruCache["key3"] = "value3"
println(lruCache["key1"]) // Πρόσβαση στο key1, μετακινείται στο τέλος
lruCache["key4"] = "value4"
lruCache["key5"] = "value5"
lruCache["key6"] = "value6" // Το cache υπερβαίνει το μέγεθος, αφαιρείται το παλαιότερο

println(lruCache)

Το LinkedHashMap είναι χρήσιμο όταν η σειρά επανάληψης των στοιχείων είναι σημαντική, καθώς και για την υλοποίηση απλών cache τύπου LRU.