Sobes.tech
Junior

Avez-vous déjà rencontré LinkedHashMap?

sobes.tech IA

Réponse de l'IA

Oui, j'ai déjà rencontré cela. LinkedHashMap en Java et Kotlin est une implémentation de l'interface Map. Elle combine les propriétés de HashMap (accès rapide par clé O(1) en moyenne) et LinkedList (qui conserve l'ordre d'insertion des éléments).

Principales caractéristiques :

  • Conservation de l'ordre : L'itération sur les éléments se fait dans l'ordre dans lequel ils ont été ajoutés.
  • Performance : L'ajout, la suppression et la recherche d'éléments se font avec une complexité amortie constante (O(1)), comme dans HashMap.
  • Mémoire : Par rapport à HashMap, LinkedHashMap utilise un peu plus de mémoire pour stocker les liens entre les éléments.
  • Mode d'accès : Peut être configuré pour maintenir l'ordre d'accès (les éléments récemment utilisés sont déplacés à la fin de la liste), ce qui est utile pour implémenter des caches avec une politique d'éviction des moins utilisés (LRU - Least Recently Used).

Exemple d'utilisation pour un cache LRU :

// Création d'un cache avec une taille maximale de 5
// true dans le constructeur active le mode d'accès
LinkedHashMap<String, String> lruCache = new LinkedHashMap<>(5, 0.75f, true) {
    @Override
    protected boolean removeEldestEntry(Map.Entry<String, String> eldest) {
        // Supprime l'élément le plus ancien si la taille dépasse 5
        return size() > 5;
    }
};

lruCache.put("key1", "value1");
lruCache.put("key2", "value2");
lruCache.put("key3", "value3");
System.out.println(lruCache.get("key1")); // Accès à key1, il est déplacé à la fin
lruCache.put("key4", "value4");
lruCache.put("key5", "value5");
lruCache.put("key6", "value6"); // La taille du cache dépasse 5, le plus ancien est supprimé (key2, si sans accès ; key3, si avec accès à key1)

System.out.println(lruCache);
// Création d'un cache avec mode d'accès (true)
val lruCache = object : LinkedHashMap<String, String>(5, 0.75f, true) {
    override fun removeEldestEntry(eldest: Map.Entry<String, String>?): Boolean {
        // Supprime l'élément le plus ancien si la taille dépasse 5
        return size > 5
    }
}

lruCache["key1"] = "value1"
lruCache["key2"] = "value2"
lruCache["key3"] = "value3"
println(lruCache["key1"]) // Accès à key1, il est déplacé à la fin
lruCache["key4"] = "value4"
lruCache["key5"] = "value5"
lruCache["key6"] = "value6" // La taille du cache dépasse 5, le plus ancien est supprimé

println(lruCache)

LinkedHashMap est utile lorsque l'ordre d'itération sur les éléments est important, ainsi que pour implémenter des caches LRU simples.