Java: la clase WeakHashMap
WeakHashMap es una implementación de la interfaz Map que almacena solo referencias débiles a sus claves. Almacenar solo referencias débiles permite que un par clave-valor sea recolectado como basura cuando su clave ya no se hace referencia fuera de WeakHashMap.
Esta clase proporciona la forma más sencilla de aprovechar el poder de las referencias débiles. Es útil para implementar estructuras de datos "similares a registros", donde la utilidad de una entrada desaparece cuando ningún hilo ya no puede acceder a su clave.
El WeakHashMap funciona de manera idéntica al HashMap con una excepción muy importante: si el administrador de memoria de Java ya no tiene una fuerte referencia al objeto especificado como clave, entonces se eliminará la entrada en el mapa.
Weak Reference- Si las únicas referencias a un objeto son referencias débiles, el recolector de basura puede reclamar la memoria del objeto en cualquier momento. No tiene que esperar hasta que el sistema se quede sin memoria. Por lo general, se liberará la próxima vez que se ejecute el recolector de basura.
A continuación se muestra la lista de constructores admitidos por la clase WeakHashMap.
No Señor. | Constructor y descripción |
---|---|
1 | WeakHashMap() Este constructor construye un WeakHashMap nuevo y vacío con la capacidad inicial predeterminada (16) y el factor de carga predeterminado (0,75). |
2 | WeakHashMap(int initialCapacity) Este constructor construye un WeakHashMap nuevo y vacío con la capacidad inicial dada y el factor de carga predeterminado, que es 0,75. |
3 | WeakHashMap(int initialCapacity, float loadFactor) Este constructor construye un WeakHashMap nuevo y vacío con la capacidad inicial y el factor de carga dados. |
4 | WeakHashMap(Map t) Este constructor construye un nuevo WeakHashMap con las mismas asignaciones que el mapa especificado. |
Además de los métodos heredados de sus clases principales, TreeMap define los siguientes métodos:
No Señor. | Método y descripción |
---|---|
1 | void clear() Elimina todas las asignaciones de este mapa. |
2 | boolean containsKey(Object key) Devuelve verdadero si este mapa contiene un mapeo para la clave especificada. |
3 | boolean containsValue(Object value) Devuelve verdadero si este mapa asigna una o más claves al valor especificado. |
4 | Set entrySet() Devuelve una vista de colección de las asignaciones contenidas en este mapa. |
5 | Object get(Object key) Devuelve el valor al que se asigna la clave especificada en este mapa hash débil, o nulo si el mapa no contiene ninguna asignación para esta clave. |
6 | boolean isEmpty() Devuelve verdadero si este mapa no contiene asignaciones de clave-valor. |
7 | Set keySet() Devuelve una vista de conjunto de las claves contenidas en este mapa. |
8 | Object put(Object key, Object value) Asocia el valor especificado con la clave especificada en este mapa. |
9 | void putAll(Map m) Copia todas las asignaciones del mapa especificado a este mapa. Estas asignaciones reemplazarán las asignaciones que este mapa tenía para cualquiera de las claves que se encuentran actualmente en el mapa especificado. |
10 | Object remove(Object key) Elimina el mapeo para esta clave de este mapa si está presente. |
11 | int size() Devuelve el número de asignaciones de clave-valor en este mapa. |
12 | Collection values() Devuelve una vista de colección de los valores contenidos en este mapa. |
Ejemplo
El siguiente programa ilustra varios de los métodos admitidos por esta colección:
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) {
}
}
}
Esto producirá el siguiente resultado:
Salida
Main waiting
Thread waiting
Si no incluye la llamada a System.gc (), es posible que el sistema nunca ejecute el recolector de basura ya que el programa no utiliza mucha memoria. Para un programa más activo, la llamada sería innecesaria.