WeakHashMap — a Map where keys are weak references; entries are automatically removed when the key is garbage collected. IdentityHashMap — a Map that uses reference equality (==) instead of object equality (equals()) for key comparison.
WeakHashMap — Detailed:
1// WeakHashMap — keys auto-removed when GC'd2WeakHashMap<Object, String> metadata = new WeakHashMap<>();34Object key1 = new Object();5metadata.put(key1, "data for key1");6key1 = null; // Key eligible for GC78System.gc();9Thread.sleep(100); // Give GC time1011// Entry may be removed — key was GC'd12System.out.println(metadata.size()); // May be 01314// Practical use: metadata cache15WeakHashMap<Class<?>, String> classNameCache = new WeakHashMap<>();1617public String getClassName(Class<?> clazz) {18 return classNameCache.computeIfAbsent(clazz,19 c -> c.getSimpleName() + "@" + System.identityHashCode(c));20}21// Cache entries removed when Class objects are unloaded
IdentityHashMap — Detailed:
== for key comparison — not equals().equals() are different keys if they're different references.1// IdentityHashMap — uses == for keys2Map<Object, String> map = new IdentityHashMap<>();34String key1 = new String("hello");5String key2 = new String("hello");67map.put(key1, "first");8map.put(key2, "second");910// key1 == key2 is FALSE (different objects)11// Two entries! key1.equals(key2) is TRUE, but == is FALSE12System.out.println(map.size()); // 21314// Object graph traversal15public void traverseGraph(Object root) {16 Map<Object, String> visited = new IdentityHashMap<>();17 Deque<Object> stack = new ArrayDeque<>();18 stack.push(root);1920 while (!stack.isEmpty()) {21 Object obj = stack.pop();22 if (visited.containsKey(obj)) continue;23 visited.put(obj, "visited");24 // Process object...25 }26}27// IdentityHashMap prevents revisiting the same object instance
Key Differences:
== for keys, good for graph traversal.Common Pitfalls:
new String().equals() not used. Fix: only use when identity semantics are needed.