Manufaturação industrial
Internet das coisas industrial | Materiais industriais | Manutenção e reparo de equipamentos | Programação industrial |
home  MfgRobots >> Manufaturação industrial >  >> Industrial programming >> Java

Java WeakHashMap

Java WeakHashMap


Neste tutorial, aprenderemos sobre o Java WeakHashMap e suas operações com a ajuda de exemplos. Também aprenderemos sobre as diferenças entre WeakHashMap e HashMap

O WeakHashMap A classe da estrutura de coleções Java fornece o recurso da estrutura de dados da tabela de hash.

Ele implementa a interface Map.



Observação :As chaves do hashmap fraco são do WeakReference modelo.

O objeto de um tipo de referência fraco pode ser coletado como lixo em Java se a referência não for mais usada no programa.

Vamos aprender a criar um mapa de hash fraco primeiro. Em seguida, aprenderemos como ele difere de um hashmap.

Criar um WeakHashMap


Para criar um hashmap fraco, devemos importar o java.util.WeakHashMap pacote primeiro. Depois de importar o pacote, veja como podemos criar hashmaps fracos em Java.
//WeakHashMap creation with capacity 8 and load factor 0.6
WeakHashMap<Key, Value> numbers = new WeakHashMap<>(8, 0.6);

No código acima, criamos um hashmap fraco chamado numbers .

Aqui,

Observe a parte new WeakHashMap<>(8, 0.6) . Aqui, o primeiro parâmetro é capacidade e o segundo parâmetro é loadFactor .

Capacidade e fator de carga padrão

É possível criar um hashmap fraco sem definir sua capacidade e fator de carga. Por exemplo,
// WeakHashMap with default capacity and load factor
WeakHashMap<Key, Value> numbers1 = new WeakHashMap<>();

Por padrão,

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<String, Integer> 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);
    }
}

Saída
WeakHashMap: {Four=4, Two=2}
WeakHashMap after garbage collection: {Four}

Como podemos ver, quando a chave dois de um hashmap fraco é definido como null e realizar a coleta de lixo, a chave é removida.

É porque, ao contrário dos hashmaps, as chaves dos hashmaps fracos são de referência fraca modelo. Isso significa que a entrada de um mapa será 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<String, Integer> 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);
    }
}



Saída
HashMap: {Four=4, Two=2}
HashMap after garbage collection: {Four=4, Two=2}

Aqui, quando a chave dois do hashmap está definido como null e realizar a coleta de lixo, a chave não é removida.

Isso ocorre porque, diferentemente dos hashmaps fracos, as chaves dos hashmaps são de referência forte modelo. Isso significa que a entrada de um mapa não é removida pelo coletor de lixo, mesmo que a chave dessa entrada não seja mais usada.

Observação :Todas as funcionalidades de hashmaps e hashmaps fracos são semelhantes, exceto que as chaves de um hashmap fraco são de referência fraca, enquanto as chaves de um hashmap são de referência forte.

Criando WeakHashMap a partir 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<String, Integer> 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<String, Integer> numbers = new WeakHashMap<>(evenNumbers);

        System.out.println("WeakHashMap: " + numbers);
    }
}


Saída
HashMap: {Two=2}
WeakHashMap: {Two=2}

Métodos de WeakHashMap


O WeakHashMap classe fornece métodos que nos permitem realizar várias operações no mapa.

Inserir elementos no WeakHashMap


Por exemplo,
import java.util.WeakHashMap;

class Main {
    public static void main(String[] args) {
        // Creating WeakHashMap of even numbers
        WeakHashMap<String, Integer> 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<String, Integer> 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);
    }
}

Saída
WeakHashMap of even numbers: {Four=4, Two=2}
WeakHashMap of numbers: {Two=2, Four=4, One=1}

Acessar elementos do WeakHashMap


1. Usando entrySet(), keySet() e values()

Por exemplo,
import java.util.WeakHashMap;

class Main {
    public static void main(String[] args) {
        // Creating WeakHashMap of even numbers
        WeakHashMap<String, Integer> 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());
    }
}

Saída
WeakHashMap: {Two=2, One=1}
Key/Value mappings: [Two=2, One=1]
Keys: [Two, One]
Values: [1, 2]

2. Usando get() e getOrDefault()

Por exemplo,
import java.util.WeakHashMap;

class Main {
    public static void main(String[] args) {
        // Creating WeakHashMap of even numbers
        WeakHashMap<String, Integer> 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);

    }
}

Saída
WeakHashMap: {Two=2, One=1}
Using get(): 2
Using getOrDefault(): 4

Remover elementos do WeakHashMap


Por exemplo,
import java.util.WeakHashMap;

class Main {
    public static void main(String[] args) {
        // Creating WeakHashMap of even numbers
        WeakHashMap<String, Integer> 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);
    }
}

Saída
WeakHashMap: {Two=2, One=1}
Removed value: 2
Is the entry {One=3} removed? False
Updated WeakHashMap: {One=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).

Java

  1. Operadores Java
  2. Comentários Java
  3. Java para cada loop
  4. Strings Java
  5. Interface Java
  6. Classe anônima Java
  7. Java try-with-resources
  8. Anotações Java
  9. Asserções Java
  10. Vetor Java