sclass CompactWeakHashSet extends AbstractSet { Set set = new CompactHashSet; ReferenceQueue queue = new ReferenceQueue(); sclass MyWeakReference extends WeakReference { int hash; *() {} *(O o) { super(o); hash = o.hashCode(); } public int hashCode() { ret hash; } public bool equals(O o) { ret o instanceof MyWeakReference && eq(get(), ((MyWeakReference) o).get()); } } void reap() { MyWeakReference ref; while (ref = (MyWeakReference) queue.poll()) != null) set.remove(ref); } public int size() { reap(); ret set.size(); } public Iterator iterator() { ret keys(map).iterator(); } public bool contains(O o) { reap(); ret set.contains(new MyWeakReference(o)); } public bool add(A a) { reap(); ret set.add(new MyWeakReference(a)); } public bool remove(O o) { ret set.remove(new MyWeakReference(o)); } }