java - Ejemplo de WeakHashMap
(6)
Creo un WeakHashMap como
WeakHashMap<Employee,String> map = new WeakHashMap<Employee,String>();
map.put(emp,"hello");
donde emp es un objeto Employee. Ahora bien, si hago emp = null o digo que emp ya no hace referencia al objeto, entonces, ¿se eliminará la entrada de WeakHashMap, es decir, el tamaño del Mapa será cero?
¿Y será viceversa en caso de HashMap?
¿Mi comprensión de WeakHashMap es correcta?
* ¿se eliminará la entrada de WeakHashMap? es decir, ¿el tamaño del mapa será cero? *
Si emp
contenía la última referencia para que el Empleado sea fácilmente accesible, entonces se puede eliminar la entrada en el mapa.
Los documentos de Java lo resumen bastante bien:
Una implementación de mapa basada en tabla hash con claves débiles. Una entrada en un WeakHashMap se eliminará automáticamente cuando su clave ya no esté en uso ordinario. Más precisamente, la presencia de un mapeo para una clave dada no evitará que la llave sea descartada por el recolector de basura [...]. Cuando una clave se ha descartado, su entrada se elimina efectivamente del mapa, por lo que esta clase se comporta de manera diferente a otras implementaciones del Mapa.
¿Y será viceversa en caso de HashMap?
Eliminar la entrada del WeakHashMap no afectará ninguna otra referencia en el programa.
Ejemplo de WeakHashMap:
Map map = new WeakHashMap();
Foo foo = new Foo();
map.put(foo, "bar");
foo=null; // strong refrence is removed and object is available for garbage collection.
Ejemplo de HashMap:
Map map = new HashMap();
Foo foo = new Foo();
map.put(foo, "bar");
foo=null; // even though the reference is nullified object will not garbage collected because map is having Strong refrence.
En otras implementaciones de mapas como un HashMap, las teclas son muy accesibles. Por ejemplo, si un HashMap tiene claves como clase de Persona como se muestra a continuación y si el objeto Persona se establece en nulo, incluso después de esto haremos map.get (Persona) obtendremos el valor de la memoria ya que las claves son fuertemente referenciadas en un HashMap.
wm.put(person, person.getFirstName());
person = null;
System.gc();
System.out.println("Hash Map :" + wm.toString());
Salida: Hash Map: {test.Person@12dacd1=John}
Comparado con HashMap, WeakHashMap es el que eliminará sus entradas tan pronto como las claves no tengan ninguna referencia en la memoria. Por ejemplo, si un WeakHashMap tiene claves como clase de persona como se muestra a continuación y si el objeto Person se establece en nulo, ahora si map.get (Person) obtendremos nulo porque la clave no tiene ninguna referencia (o más bien débilmente). accesible).
wm.put(person, person.getFirstName());
person = null;
System.gc();
System.out.println("Weak Hash Map :" + wm.toString());
Salida: mapa de hash débil: {}
Las referencias en java son direcciones de memoria donde los objetos creados apuntan en la memoria. En un WeakHashMap, se utiliza el concepto de referencia débil.
Tan pronto como creas un objeto en java y lo asignas a alguna variable, se vuelve muy accesible.
El objeto de referencia débil puede ser algo similar al objeto que no tiene referencias de memoria, es decir, puede ser recolectado como basura ahora.
Un ejemplo muy simple, para iluminar lo que ya se ha dicho:
import java.util.WeakHashMap;
public class WeakHashMapDemo {
public static void main(String[] args) {
// -- Fill a weak hash map with one entry
WeakHashMap<Data, String> map = new WeakHashMap<Data, String>();
Data someDataObject = new Data("foo");
map.put(someDataObject, someDataObject.value);
System.out.println("map contains someDataObject ? " + map.containsKey(someDataObject));
// -- now make someDataObject elligible for garbage collection...
someDataObject = null;
for (int i = 0; i < 10000; i++) {
if (map.size() != 0) {
System.out.println("At iteration " + i + " the map still holds the reference on someDataObject");
} else {
System.out.println("somDataObject has finally been garbage collected at iteration " + i + ", hence the map is now empty");
break;
}
}
}
static class Data {
String value;
Data(String value) {
this.value = value;
}
}
}
Salida:
map contains someDataObject ? true
...
At iteration 6216 the map still holds the reference on someDataObject
At iteration 6217 the map still holds the reference on someDataObject
At iteration 6218 the map still holds the reference on someDataObject
somDataObject has finally been garbage collected at iteration 6219, hence the map is now empty
WeakHashMap
el código de ejemplo para entender la diferencia entre HashMap
y WeakHashMap
Map hashMap= new HashMap();
Map weakHashMap = new WeakHashMap();
String keyHashMap = new String("keyHashMap");
String keyWeakHashMap = new String("keyWeakHashMap");
hashMap.put(keyHashMap, "helloHash");
weakHashMap.put(keyWeakHashMap, "helloWeakHash");
System.out.println("Before: hash map value:"+hashMap.get("keyHashMap")+" and weak hash map value:"+weakHashMap.get("keyWeakHashMap"));
keyHashMap = null;
keyWeakHashMap = null;
System.gc();
System.out.println("After: hash map value:"+hashMap.get("keyHashMap")+" and weak hash map value:"+weakHashMap.get("keyWeakHashMap"));
La salida será:
Before: hash map value:helloHash and weak hash map value:helloWeakHash
After: hash map value:helloHash and weak hash map value:null