Java - a classe WeakHashMap

WeakHashMap é uma implementação da interface Map que armazena apenas referências fracas para suas chaves. Armazenar apenas referências fracas permite que um par de valor-chave seja coletado como lixo quando sua chave não é mais referenciada fora do WeakHashMap.

Esta classe fornece a maneira mais fácil de aproveitar o poder das referências fracas. É útil para implementar estruturas de dados "semelhantes ao registro", em que a utilidade de uma entrada desaparece quando sua chave não pode mais ser alcançada por qualquer thread.

O WeakHashMap funciona de forma idêntica ao HashMap com uma exceção muito importante: se o gerenciador de memória Java não tiver mais uma referência forte ao objeto especificado como uma chave, a entrada no mapa será removida.

Weak Reference- Se as únicas referências a um objeto forem referências fracas, o coletor de lixo pode recuperar a memória do objeto a qualquer momento. Ele não precisa esperar até que o sistema fique sem memória. Normalmente, ele será liberado na próxima vez que o coletor de lixo for executado.

A seguir está a lista de construtores suportados pela classe WeakHashMap.

Sr. Não. Construtor e descrição
1

WeakHashMap()

Este construtor constrói um novo WeakHashMap vazio com a capacidade inicial padrão (16) e o fator de carga padrão (0,75).

2

WeakHashMap(int initialCapacity)

Este construtor constrói um novo WeakHashMap vazio com a capacidade inicial fornecida e o fator de carga padrão, que é 0,75.

3

WeakHashMap(int initialCapacity, float loadFactor)

Este construtor constrói um novo WeakHashMap vazio com a capacidade inicial fornecida e o fator de carga fornecido.

4

WeakHashMap(Map t)

Este construtor constrói um novo WeakHashMap com os mesmos mapeamentos do Mapa especificado.

Além dos métodos herdados de suas classes pai, TreeMap define os seguintes métodos -

Sr. Não. Método e Descrição
1

void clear()

Remove todos os mapeamentos deste mapa.

2

boolean containsKey(Object key)

Retorna verdadeiro se este mapa contém um mapeamento para a chave especificada.

3

boolean containsValue(Object value)

Retorna verdadeiro se este mapa mapeia uma ou mais chaves para o valor especificado.

4

Set entrySet()

Retorna uma visualização de coleção dos mapeamentos contidos neste mapa.

5

Object get(Object key)

Retorna o valor para o qual a chave especificada é mapeada neste mapa hash fraco ou nulo se o mapa não contém mapeamento para esta chave.

6

boolean isEmpty()

Retorna verdadeiro se este mapa não contém mapeamentos de valores-chave.

7

Set keySet()

Retorna uma visualização definida das chaves contidas neste mapa.

8

Object put(Object key, Object value)

Associa o valor especificado com a chave especificada neste mapa.

9

void putAll(Map m)

Copia todos os mapeamentos do mapa especificado para este mapa. Esses mapeamentos substituirão quaisquer mapeamentos que este mapa tinha para qualquer uma das chaves atualmente no mapa especificado.

10

Object remove(Object key)

Remove o mapeamento para esta chave deste mapa, se presente.

11

int size()

Retorna o número de mapeamentos de valores-chave neste mapa.

12

Collection values()

Retorna uma visualização de coleção dos valores contidos neste mapa.

Exemplo

O programa a seguir ilustra vários dos métodos suportados por esta coleção -

import java.util.*;
public class WeakHashMap_Demo {

   private static Map map;
   public static void main (String args[]) {
      map = new WeakHashMap();
      map.put(new String("Maine"), "Augusta");
      
      Runnable runner = new Runnable() {
         public void run() {
            while (map.containsKey("Maine")) {
               try {
                  Thread.sleep(500);
               } catch (InterruptedException ignored) {
               }
               System.out.println("Thread waiting");
               System.gc();
            }
         }
      };
      Thread t = new Thread(runner);
      t.start();
      System.out.println("Main waiting");
      try {
         t.join();
      } catch (InterruptedException ignored) {
      }
   }
}

Isso produzirá o seguinte resultado -

Resultado

Main waiting
Thread waiting

Se você não incluir a chamada para System.gc (), o sistema nunca pode executar o coletor de lixo, pois o programa não usa muita memória. Para um programa mais ativo, a chamada seria desnecessária.