Manufactura industrial
Internet industrial de las cosas | Materiales industriales | Mantenimiento y reparación de equipos | Programación industrial |
home  MfgRobots >> Manufactura industrial >  >> Industrial programming >> Java

Java WeakHashMap: Entendimiento, Uso y Diferencias Clave

Java WeakHashMap

Guía completa de WeakHashMap de Java, cubriendo su creación, diferencias clave con HashMap, ejemplos prácticos y métodos esenciales.

La clase WeakHashMap es parte del Framework de Colecciones de Java e implementa la interfaz Map. Se comporta como una tabla hash normal pero almacena claves como referencias débiles, permitiendo que sean reclamadas por el recolector de basura cuando ya no están en uso.

Java WeakHashMap: Entendimiento, Uso y Diferencias Clave

Nota: Las claves en un WeakHashMap se envuelven en objetos WeakReference.

Una referencia débil puede ser recolectada por el garbage collector si el programa ya no mantiene una referencia fuerte al objeto clave.


Creando un WeakHashMap

Primero, importa java.util.WeakHashMap:

import java.util.WeakHashMap;

Luego instáncialo, opcionalmente especificando capacidad inicial y factor de carga:

// WeakHashMap con capacidad 8 y factor de carga 0.6
WeakHashMap<Clave, Valor> numeros = new WeakHashMap<>(8, 0.6);

Parámetros:

Cuando no se suministran parámetros, se aplican los valores por defecto:

WeakHashMap<Clave, Valor> numeros = new WeakHashMap<>();

HashMap vs. WeakHashMap

Ambos implementan Map, pero la distinción clave radica en la fuerza de referencia:

Ejemplo demostrando el comportamiento:

import java.util.WeakHashMap;
class Main {
    public static void main(String[] args) {
        WeakHashMap<String, Integer> numeros = new WeakHashMap<>();
        String dos = new String("Dos");
        Integer dosValor = 2;
        String cuatro = new String("Cuatro");
        Integer cuatroValor = 4;
        numeros.put(dos, dosValor);
        numeros.put(cuatro, cuatroValor);
        System.out.println("WeakHashMap: " + numeros);
        // Anular la referencia a la clave dos
        dos = null;
        System.gc();
        System.out.println("WeakHashMap después de GC: " + numeros);
    }
}

Salida:

WeakHashMap: {Cuatro=4, Dos=2} WeakHashMap después de GC: {Cuatro=4}

La entrada para "Dos" desaparece porque su clave ya no es fuertemente alcanzable. En contraste, un HashMap retendría la entrada:

import java.util.HashMap;
class Main {
    public static void main(String[] args) {
        HashMap<String, Integer> numeros = new HashMap<>();
        String dos = new String("Dos");
        Integer dosValor = 2;
        String cuatro = new String("Cuatro");
        Integer cuatroValor = 4;
        numeros.put(dos, dosValor);
        numeros.put(cuatro, cuatroValor);
        System.out.println("HashMap: " + numeros);
        dos = null;
        System.gc();
        System.out.println("HashMap después de GC: " + numeros);
    }
}

Salida:

HashMap: {Cuatro=4, Dos=2} HashMap después de GC: {Cuatro=4, Dos=2}

Por tanto, WeakHashMap es ideal cuando quieres que el mapa libere automáticamente memoria vinculada a claves no usadas.


Conversión desde Otro Mapa

Instancia un WeakHashMap desde un mapa existente para copiar sus entradas:

import java.util.HashMap;
import java.util.WeakHashMap;
class Main {
    public static void main(String[] args) {
        HashMap<String, Integer> numerosPares = new HashMap<>();
        String dos = new String("Dos");
        numerosPares.put(dos, 2);
        System.out.println("HashMap: " + numerosPares);
        WeakHashMap<String, Integer> numeros = new WeakHashMap<>(numerosPares);
        System.out.println("WeakHashMap: " + numeros);
    }
}

Salida:

HashMap: {Dos=2} WeakHashMap: {Dos=2}

Métodos Clave de WeakHashMap

A continuación, una selección de las operaciones más usadas.

Insertando Entradas

Ejemplo:

import java.util.WeakHashMap;
class Main {
    public static void main(String[] args) {
        WeakHashMap<String, Integer> numerosPares = new WeakHashMap<>();
        numerosPares.put(new String("Dos"), 2);
        numerosPares.putIfAbsent(new String("Cuatro"), 4);
        System.out.println("Números pares: " + numerosPares);
        WeakHashMap<String, Integer> numeros = new WeakHashMap<>();
        numeros.put(new String("Uno"), 1);
        numeros.putAll(numerosPares);
        System.out.println("Todos los números: " + numeros);
    }
}

Salida:

Números pares: {Cuatro=4, Dos=2} Todos los números: {Dos=2, Cuatro=4, Uno=1}

Accediendo a Entradas

Recupera datos vía:

Ejemplo:

import java.util.WeakHashMap;
class Main {
    public static void main(String[] args) {
        WeakHashMap<String, Integer> numeros = new WeakHashMap<>();
        numeros.put(new String("Uno"), 1);
        numeros.put(new String("Dos"), 2);
        System.out.println("Mapa: " + numeros);
        System.out.println("Conjunto de entradas: " + numeros.entrySet());
        System.out.println("Claves: " + numeros.keySet());
        System.out.println("Valores: " + numeros.values());
        System.out.println("Get Dos: " + numeros.get("Dos"));
        System.out.println("GetOrDefault Cuatro: " + numeros.getOrDefault("Cuatro", 4));
    }
}

Salida:

Mapa: {Dos=2, Uno=1} Conjunto de entradas: [Dos=2, Uno=1] Claves: [Dos, Uno] Valores: [1, 2] Get Dos: 2 GetOrDefault Cuatro: 4

Eliminando Entradas

Ejemplo:

import java.util.WeakHashMap;
class Main {
    public static void main(String[] args) {
        WeakHashMap<String, Integer> numeros = new WeakHashMap<>();
        numeros.put(new String("Uno"), 1);
        numeros.put(new String("Dos"), 2);
        System.out.println("Mapa: " + numeros);
        int eliminado = numeros.remove("Dos");
        System.out.println("Valor eliminado: " + eliminado);
        boolean eliminadoSi = numeros.remove("Uno", 3);
        System.out.println("¿Eliminado {Uno=3}? " + eliminadoSi);
        System.out.println("Después de eliminación: " + numeros);
    }
}

Salida:

Mapa: {Dos=2, Uno=1} Valor eliminado: 2 ¿Eliminado {Uno=3}? false Después de eliminación: {Uno=1}

Utilidades Adicionales

MétodoDescripción
clear()Elimina todas las entradas.
containsKey(clave)Verifica si la clave existe.
containsValue(valor)Verifica si un valor está presente.
size()Devuelve el número de entradas.
isEmpty()Devuelve true si el mapa no tiene entradas.

Para un análisis más profundo, consulta la documentación oficial de Java WeakHashMap.

Java

  1. Dominar Operadores en Java: Tipos, Sintaxis y Ejemplos Prácticos
  2. Comentarios en Java: Tipos, Uso y Mejores Prácticas
  3. Dominar if…else en Java: Control de Flujo Explicado
  4. Dominar el Bucle for Mejorado en Java: Sintaxis, Ejemplos y Mejores Prácticas
  5. Dominar Strings en Java: Creación, Métodos y Mejores Prácticas
  6. Dominando interfaces en Java: Conceptos, implementación y mejores prácticas
  7. Dominando las clases internas anónimas en Java: Definición, sintaxis y ejemplos prácticos
  8. Dominando Try‑with‑Resources en Java: Gestión automática de recursos explicada
  9. Anotaciones en Java explicadas: Tipos, ubicación y ejemplos prácticos
  10. Aserciones en Java: Guía práctica para detectar bugs y asegurar fiabilidad del código
  11. Entendiendo Java Vector: Uso, Características y Comparación con ArrayList