String.intern()
управляет внутренним, встроенным пулом, который имеет некоторые специальные функции, связанные с GC. Это старый код, но если бы он был реализован заново, он использовал бы java.util.WeakHashMap
. Слабые ссылки - это способ сохранить указатель на объект, не предотвращая его сбор. Как раз то, что нужно для объединяющего пула, такого как интернированные строки.
То, что интернированные строки являются сборщиком мусора, можно продемонстрировать с помощью следующего кода Java:
public class InternedStringsAreCollected {
public static void main(String[] args)
{
for (int i = 0; i < 30; i ++) {
foo();
System.gc();
}
}
private static void foo()
{
char[] tc = new char[10];
for (int i = 0; i < tc.length; i ++)
tc[i] = (char)(i * 136757);
String s = new String(tc).intern();
System.out.println(System.identityHashCode(s));
}
}
Этот код создает 30 раз одну и ту же строку, каждый раз интернируя ее. Кроме того, он использует System.identityHashCode()
, чтобы показать, какой хэш-код Object.hashCode()
вернулся бы в этой интернированной строке. При запуске этот код выводит различные целочисленные значения, что означает, что вы не получаете один и тот же экземпляр каждый раз.
В любом случае, использование String.intern()
несколько не рекомендуется. Это общий статический пул, что означает, что он легко превращается в узкое место в многоядерных системах. Используйте String.equals()
для сравнения строк, и вы будете жить дольше и счастливее.