Договорились с другими о том, что не следует использовать String.intern (): как только вы поместите туда строку, она никогда не исчезнет. Посмотрите на ранние версии Xerces, почему это плохая идея.
Лучшим решением является использование WeakHashMap, заключая значение в WeakReference:
private Map<String,WeakReference<String>> _map
= new WeakHashMap<String,WeakReference<String>>();
public synchronized String intern(String str)
{
WeakReference<String> ref = _map.get(str);
String s2 = (ref != null) ? ref.get() : null;
if (s2 != null)
return s2;
str = new String(str);
_map.put(str, new WeakReference(str));
return str;
}
Этот код взят из статьи, которую я написал о ссылочных объектах Java. Вы найдете объяснение там.
РЕДАКТИРОВАТЬ: необходимо создать новую строку здесь (и я обновлю статью), потому что оригинал может быть подстрокой из гораздо большего массива символов. Я думал, что это было исправлено в JDK 1.3, но, видимо, нет (по крайней мере, в 1.5).