package ar.com.javacuriosities.references; import java.util.Map; import java.util.WeakHashMap; import ar.com.javacuriosities.references.util.Foo; /* * La clase java.util.WeakHashMap es una version especial HashMap, la cual * usa WeakReferences para las key y Strong para los values, por lo tanto * cuando un objeto no es objeto que es key no es mas referenciado este desaparece * del Map. * * A veces podemos usar los Map para simular campos adicionales y una buena estrategia * puede ser usar este tipo de Map. * WeakHashMap no es concurrente. * La comparaciĆ³n de keys es por medio de equals */ public class Step6WeakHashMap { public static void main(String[] args) { try { // Creamos una referencia a un objeto Foo del tipo Strong Reference Foo foo = new Foo(); // Creamos el Map y agregamos el objeto como Key Map<Foo, String> weakHashMap = new WeakHashMap<Foo, String>(); weakHashMap.put(foo, "Testing WeakHashMap"); System.out.println("Suggesting GC invocation"); // Sugerimos al GC correr System.gc(); Thread.sleep(1000); System.out.println("Is it size equal to 1? " + (weakHashMap.size() == 1)); System.out.println("Assigning NULL"); // Hacemos al objeto elegible por el GC foo = null; System.out.println("Suggesting GC invocation"); // Sugerimos al GC correr System.gc(); Thread.sleep(1000); System.out.println("Is it size equal to 1? " + (weakHashMap.size() == 1)); } catch (InterruptedException e) { // Log and Handle exception e.printStackTrace(); } } }