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.