//: containers/CanonicalMapping.java // ©2015 MindView LLC: see Copyright.txt // Demonstrates WeakHashMap. import java.util.*; class Element { private String ident; public Element(String id) { ident = id; } @Override public String toString() { return ident; } @Override public int hashCode() { return ident.hashCode(); } @Override public boolean equals(Object r) { return r instanceof Element && ident.equals(((Element)r).ident); } @Override protected void finalize() { System.out.println("Finalizing " + getClass().getSimpleName() + " " + ident); } } class Key extends Element { public Key(String id) { super(id); } } class Value extends Element { public Value(String id) { super(id); } } public class CanonicalMapping { public static void main(String[] args) { int size = 1000; // Or, choose size via the command line: if(args.length > 0) size = new Integer(args[0]); Key[] keys = new Key[size]; WeakHashMap map = new WeakHashMap<>(); for(int i = 0; i < size; i++) { Key k = new Key(Integer.toString(i)); Value v = new Value(Integer.toString(i)); if(i % 3 == 0) keys[i] = k; // Save as "real" references map.put(k, v); } System.gc(); } } /* (Execute to see output) *///:~