Существует способ проверить, был ли конкретный объект String
уже интернирован, но он вставляет содержимое в пул строк, если оно еще не было интернировано.Создайте новый String
объект с тем же содержимым, интернируйте его и сравните с исходным объектом:
new String(s).intern() == s
Это работает из-за того, что new String(s) != s
.Рассмотрим каждую возможную ситуацию:
s
интернирован в пул строк.new String(s)
имеет то же содержимое, что и s
, поэтому вызываемый intern()
вернет s
.Результат выражения: true
. s
не интернирован в пуле строк, но другой равный String
объект - давайте назовем его s2
.intern()
вернет s2
, поэтому результат выражения будет false
. s
не интернирован в пул строк, и ни один из них не равен String
.В этом случае new String(s)
будет встроен в пул строк, который, к сожалению, изменяет пул строк.Поскольку это не тот же объект String
, что и s
, результатом выражения будет false
.
Таким образом, приведенное выше выражение будет правильно проверять, интернировано ли s
в пуле строкне.Следующий тест демонстрирует это:
public static void main(String[] args) {
String interned = new String(new char[] { 'i', 'n', 't' }).intern();
String notInterned = new String(new char[] { 'n', 'o', 't' });
System.out.println("Case 1: " + wasInterned(interned));
System.out.println("Case 2: " + wasInterned(new String(interned)));
System.out.println("Case 3: " + wasInterned(notInterned));
}
public static boolean wasInterned(String s) {
return new String(s).intern() == s;
}
При запуске вывод:
Case 1: true
Case 2: false
Case 3: false