Neste tutorial, aprenderemos sobre Java WeakHashMap e suas operações com a ajuda de exemplos. Também aprenderemos sobre as diferenças entre WeakHashMap e HashMap
A WeakHashMap
classe do framework de coleções Java fornece o recurso da estrutura de dados da tabela hash …
Ele implementa a interface do Mapa.
Nota : As chaves do hashmap fraco são do tipo WeakReference .
O objeto de um tipo de referência fraca pode ser coletado como lixo em Java se a referência não for mais usada no programa.
Vamos aprender a criar um mapa hash fraco primeiro. Então, aprenderemos como ele difere de um hashmap.
Crie um WeakHashMap
Para criar um hashmap fraco, devemos importar o java.util.WeakHashMap
pacote primeiro. Depois de importar o pacote, aqui está como podemos criar hashmaps fracos em Java.
//WeakHashMap creation with capacity 8 and load factor 0.6 WeakHashMap numbers = new WeakHashMap(8, 0.6);
No código acima, criamos um hashmap fraco denominado números.
Aqui,
- Chave - um identificador único usado para associar cada elemento (valor) em um mapa
- Valor - elementos associados por chaves em um mapa
Observe a peça new WeakHashMap(8, 0.6)
. Aqui, o primeiro parâmetro é a capacidade e o segundo parâmetro é loadFactor .
- capacidade - A capacidade deste mapa é 8. Ou seja, ele pode armazenar 8 entradas.
- loadFactor - O fator de carga deste mapa é 0,6. Isso significa que sempre que nossa tabela hash é preenchida em 60%, as entradas são movidas para uma nova tabela hash com o dobro do tamanho da tabela original.
Capacidade padrão e fator de carga
É possível criar um hashmap fraco sem definir sua capacidade e fator de carga. Por exemplo,
// WeakHashMap with default capacity and load factor WeakHashMap numbers1 = new WeakHashMap();
Por padrão,
- a capacidade do mapa será de 16
- o fator de carga será 0,75
Diferenças entre HashMap e WeakHashMap
Vamos ver a implementação de um hashmap fraco em Java.
import java.util.WeakHashMap; class Main ( public static void main(String() args) ( // Creating WeakHashMap of numbers WeakHashMap numbers = new WeakHashMap(); String two = new String("Two"); Integer twoValue = 2; String four = new String("Four"); Integer fourValue = 4; // Inserting elements numbers.put(two, twoValue); numbers.put(four, fourValue); System.out.println("WeakHashMap: " + numbers); // Make the reference null two = null; // Perform garbage collection System.gc(); System.out.println("WeakHashMap after garbage collection: " + numbers); ) )
Resultado
WeakHashMap: (Quatro = 4, Dois = 2) WeakHashMap após a coleta de lixo: (Quatro)
Como podemos ver, quando a chave dois de um hashmap fraco é definida null
e executa a coleta de lixo, a chave é removida.
É porque, ao contrário dos hashmaps, as chaves dos hashmaps fracos são do tipo de referência fraca . Isso significa que a entrada de um mapa é removida pelo coletor de lixo se a chave para essa entrada não for mais usada. Isso é útil para economizar recursos.
Agora vamos ver a mesma implementação em um hashmap.
import java.util.HashMap; class Main ( public static void main(String() args) ( // Creating HashMap of even numbers HashMap numbers = new HashMap(); String two = new String("Two"); Integer twoValue = 2; String four = new String("Four"); Integer fourValue = 4; // Inserting elements numbers.put(two, twoValue); numbers.put(four, fourValue); System.out.println("HashMap: " + numbers); // Make the reference null two = null; // Perform garbage collection System.gc(); System.out.println("HashMap after garbage collection: " + numbers); ) )
Resultado
HashMap: (Quatro = 4, Dois = 2) HashMap após a coleta de lixo: (Quatro = 4, Dois = 2)
Aqui, quando a chave dois do hashmap é definida null
e executa a coleta de lixo, a chave não é removida.
Isso ocorre porque, ao contrário dos hashmaps fracos, as chaves dos hashmaps são do tipo de referência forte . Isso significa que a entrada de um mapa não é removida pelo coletor de lixo, embora a chave para essa entrada não seja mais usada.
Nota : Todas as funcionalidades de hashmaps e hashmaps fracos são semelhantes, exceto as chaves de um hashmap fraco são de referência fraca, enquanto as chaves de um hashmap são de referência forte.
Criação de WeakHashMap de outros mapas
Aqui está como podemos criar um hashmap fraco de outros mapas.
import java.util.HashMap; import java.util.WeakHashMap; class Main ( public static void main(String() args) ( // Creating a hashmap of even numbers HashMap evenNumbers = new HashMap(); String two = new String("Two"); Integer twoValue = 2; evenNumbers.put(two, twoValue); System.out.println("HashMap: " + evenNumbers); // Creating a weak hash map from other hashmap WeakHashMap numbers = new WeakHashMap(evenNumbers); System.out.println("WeakHashMap: " + numbers); ) )
Resultado
HashMap: (Dois = 2) WeakHashMap: (Dois = 2)
Métodos de WeakHashMap
A WeakHashMap
classe fornece métodos que nos permitem realizar várias operações no mapa.
Inserir elementos no WeakHashMap
put()
- insere o mapeamento de chave / valor especificado no mapaputAll()
- insere todas as entradas do mapa especificado neste mapaputIfAbsent()
- insere o mapeamento de chave / valor especificado no mapa se a chave especificada não estiver presente no mapa
Por exemplo,
import java.util.WeakHashMap; class Main ( public static void main(String() args) ( // Creating WeakHashMap of even numbers WeakHashMap evenNumbers = new WeakHashMap(); String two = new String("Two"); Integer twoValue = 2; // Using put() evenNumbers.put(two, twoValue); String four = new String("Four"); Integer fourValue = 4; // Using putIfAbsent() evenNumbers.putIfAbsent(four, fourValue); System.out.println("WeakHashMap of even numbers: " + evenNumbers); //Creating WeakHashMap of numbers WeakHashMap numbers = new WeakHashMap(); String one = new String("One"); Integer oneValue = 1; numbers.put(one, oneValue); // Using putAll() numbers.putAll(evenNumbers); System.out.println("WeakHashMap of numbers: " + numbers); ) )
Resultado
WeakHashMap de números pares: (Quatro = 4, Dois = 2) WeakHashMap de números: (Dois = 2, Quatro = 4, Um = 1)
Acessar elementos WeakHashMap
1. Using entrySet(), keySet() and values()
entrySet()
- returns a set of all the key/value mapping of the mapkeySet()
- returns a set of all the keys of the mapvalues()
- returns a set of all the values of the map
For example,
import java.util.WeakHashMap; class Main ( public static void main(String() args) ( // Creating WeakHashMap of even numbers WeakHashMap numbers = new WeakHashMap(); String one = new String("One"); Integer oneValue = 1; numbers.put(one, oneValue); String two = new String("Two"); Integer twoValue = 2; numbers.put(two, twoValue); System.out.println("WeakHashMap: " + numbers); // Using entrySet() System.out.println("Key/Value mappings: " + numbers.entrySet()); // Using keySet() System.out.println("Keys: " + numbers.keySet()); // Using values() System.out.println("Values: " + numbers.values()); ) )
Output
WeakHashMap: (Two=2, One=1) Key/Value mappings: (Two=2, One=1) Keys: (Two, One) Values: (1, 2)
2. Using get() and getOrDefault()
get()
- Returns the value associated with the specified key. Returnsnull
if the key is not found.getOrDefault()
- Returns the value associated with the specified key. Returns the specified default value if the key is not found.
For example,
import java.util.WeakHashMap; class Main ( public static void main(String() args) ( // Creating WeakHashMap of even numbers WeakHashMap numbers = new WeakHashMap(); String one = new String("One"); Integer oneValue = 1; numbers.put(one, oneValue); String two = new String("Two"); Integer twoValue = 2; numbers.put(two, twoValue); System.out.println("WeakHashMap: " + numbers); // Using get() int value1 = numbers.get("Two"); System.out.println("Using get(): " + value1); // Using getOrDefault() int value2 = numbers.getOrDefault("Four", 4); System.out.println("Using getOrDefault(): " + value2); ) )
Output
WeakHashMap: (Two=2, One=1) Using get(): 2 Using getOrDefault(): 4
Remove WeakHashMap Elements
remove(key)
- returns and removes the entry associated with the specified key from the mapremove(key, value)
- removes the entry from the map only if the specified key mapped to the specified value and return a boolean value
For example,
import java.util.WeakHashMap; class Main ( public static void main(String() args) ( // Creating WeakHashMap of even numbers WeakHashMap numbers = new WeakHashMap(); String one = new String("One"); Integer oneValue = 1; numbers.put(one, oneValue); String two = new String("Two"); Integer twoValue = 2; numbers.put(two, twoValue); System.out.println("WeakHashMap: " + numbers); // Using remove() with single parameter int value = numbers.remove("Two"); System.out.println("Removed value: " + value); // Using remove() with 2 parameters boolean result = numbers.remove("One", 3); System.out.println("Is the entry (One=3) removed? " + result); System.out.println("Updated WeakHashMap: " + numbers); ) )
Output
WeakHashMap: (Dois = 2, Um = 1) Valor removido: 2 A entrada (Um = 3) foi removida? WeakHashMap falso atualizado: (Um = 1)
Outros métodos de WeakHashMap
Método | Descrição |
---|---|
clear() | Remove todas as entradas do mapa |
containsKey() | Verifica se o mapa contém a chave especificada e retorna um valor booleano |
containsValue() | Verifica se o mapa contém o valor especificado e retorna um valor booleano |
size() | Retorna o tamanho do mapa |
isEmpty() | Verifica se o mapa está vazio e retorna um valor booleano |
Para saber mais, visite Java WeakHashMap (documentação oficial do Java).