Junior
Hai mai lavorato con LinkedHashMap?
sobes.tech AI
Risposta dell'AI
Sì, ho esperienza. LinkedHashMap in Java e Kotlin è un'implementazione dell'interfaccia Map. Combina le proprietà di HashMap (accesso rapido tramite chiave O(1) in media) e LinkedList (mantiene l'ordine di inserimento degli elementi).
Caratteristiche principali:
- Mantenimento dell'ordine: L'iterazione sugli elementi avviene nell'ordine in cui sono stati aggiunti.
- Prestazioni: L'aggiunta, la rimozione e la ricerca di elementi avvengono con una complessità amortizzata costante (O(1)), come in
HashMap. - Memoria: Rispetto a
HashMap,LinkedHashMaputilizza un po' più di memoria per memorizzare i collegamenti tra gli elementi. - Modalità di accesso: Può essere configurata per mantenere l'ordine di accesso (gli elementi più recentemente usati vengono spostati alla fine della lista), utile per implementare cache con politica di sostituzione dei meno usati (LRU - Least Recently Used).
Esempio di utilizzo per una cache LRU:
// Creiamo una cache con dimensione massima di 5
// true nel costruttore attiva la modalità di accesso
LinkedHashMap<String, String> lruCache = new LinkedHashMap<>(5, 0.75f, true) {
@Override
protected boolean removeEldestEntry(Map.Entry<String, String> eldest) {
// Rimuove l'elemento più vecchio se la dimensione supera 5
return size() > 5;
}
};
lruCache.put("key1", "value1");
lruCache.put("key2", "value2");
lruCache.put("key3", "value3");
System.out.println(lruCache.get("key1")); // Accesso a key1, si sposta alla fine
lruCache.put("key4", "value4");
lruCache.put("key5", "value5");
lruCache.put("key6", "value6"); // La cache supera la dimensione, viene rimosso il più vecchio (key2, se senza accesso; key3, se con accesso a key1)
System.out.println(lruCache);
// Creiamo una cache con modalità di accesso (true)
val lruCache = object : LinkedHashMap<String, String>(5, 0.75f, true) {
override fun removeEldestEntry(eldest: Map.Entry<String, String>?): Boolean {
// Rimuove l'elemento più vecchio se la dimensione supera 5
return size > 5
}
}
lruCache["key1"] = "value1"
lruCache["key2"] = "value2"
lruCache["key3"] = "value3"
println(lruCache["key1"]) // Accesso a key1, si sposta alla fine
lruCache["key4"] = "value4"
lruCache["key5"] = "value5"
lruCache["key6"] = "value6" // La cache supera la dimensione, viene rimosso il più vecchio
println(lruCache)
LinkedHashMap è utile quando l'ordine di iterazione sugli elementi è importante, così come per implementare cache LRU semplici.