// first version, might run out of memory public class String { private Map m = new HashMap(); public String intern() { String entry = m.get(this); if (entry == null) { m.put(this,this); entry = this; } return entry; } // ... more methods, etc. } // second version, safe against out of memory situations // but is eager to clear cache, recommended when // recomputation is cheap, uses WeakReference public class String { private WeakHashMap> m = new WeakHashMap>(); public String intern() { WeakReference entry = m.get(this); if ((entry == null) || (entry.get() == null)) { entry = new WeakReference(this); m.put(this,entry); } return entry.get(); } // ... more methods, etc. } // recomputation is expensive, use SoftReference public class String { private WeakHashMap> m = new WeakHashMap>(); public String intern() { SoftReference entry = m.get(this); if ((entry == null) || (entry.get() == null)) { entry = new SoftReference(this); m.put(this,entry); } return entry.get(); } // ... more methods, etc. }