Sobes.tech
Junior

Já trabalhou com LinkedHashMap?

sobes.tech IA

Resposta da IA

Sim, já tive experiência. LinkedHashMap em Java e Kotlin é uma implementação da interface Map. Combina as propriedades de HashMap (acesso rápido por chave O(1) em média) e LinkedList (mantém a ordem de inserção dos elementos).

Principais características:

  • Manutenção da ordem: A iteração sobre os elementos ocorre na ordem em que foram adicionados.
  • Desempenho: A adição, remoção e busca de elementos são feitas com uma complexidade amortizada constante (O(1)), como no HashMap.
  • Memória: Em comparação com o HashMap, o LinkedHashMap usa um pouco mais de memória para armazenar as ligações entre os elementos.
  • Modo de acesso: Pode ser configurado para manter a ordem de acesso (os elementos mais recentemente utilizados são movidos para o final da lista), o que é útil para implementar caches com política de substituição dos menos utilizados (LRU - Least Recently Used).

Exemplo de uso para um cache LRU:

// Criar um cache com tamanho máximo de 5
// true no construtor ativa o modo de acesso
LinkedHashMap<String, String> lruCache = new LinkedHashMap<>(5, 0.75f, true) {
    @Override
    protected boolean removeEldestEntry(Map.Entry<String, String> eldest) {
        // Remove o elemento mais antigo se o tamanho exceder 5
        return size() > 5;
    }
};

lruCache.put("key1", "value1");
lruCache.put("key2", "value2");
lruCache.put("key3", "value3");
System.out.println(lruCache.get("key1")); // Acesso a key1, ela é movida para o final
lruCache.put("key4", "value4");
lruCache.put("key5", "value5");
lruCache.put("key6", "value6"); // O cache excede o tamanho, o elemento mais antigo é removido (key2, se sem acesso; key3, se com acesso a key1)

System.out.println(lruCache);
// Criar um cache com modo de acesso (true)
val lruCache = object : LinkedHashMap<String, String>(5, 0.75f, true) {
    override fun removeEldestEntry(eldest: Map.Entry<String, String>?): Boolean {
        // Remove o elemento mais antigo se o tamanho exceder 5
        return size > 5
    }
}

lruCache["key1"] = "value1"
lruCache["key2"] = "value2"
lruCache["key3"] = "value3"
println(lruCache["key1"]) // Acesso a key1, ela é movida para o final
lruCache["key4"] = "value4"
lruCache["key5"] = "value5"
lruCache["key6"] = "value6" // O cache excede o tamanho, o elemento mais antigo é removido

println(lruCache)

LinkedHashMap é útil quando a ordem de iteração sobre os elementos é importante, assim como para implementar caches LRU simples.