Метод intern() в Java
Метод intern() используется для добавления строки во внутренний пул строк во время выполнения и возврата ссылки из пула строк.
Когда вызывается метод intern(), если пул строковых констант уже содержит эту строку, он возвращает ссылку из пула; если пул не содержит эту строку, он добавляет её в пул и возвращает ссылку на эту строку.
Метод intern() подчиняется следующим правилам:Для любых двух строк s и t выражение s.intern() == t.intern() истинно тогда и только тогда, когда s.equals(t) истинно.
String s1 = new String("Hello");
String s2 = "Hello";
String s3 = s1.intern();
System.out.println(s1 == s2); // false
System.out.println(s2 == s3); // true
Синтаксис
public String intern()
Parameters
Отсутствует
Возвращаемое значение
Возвращаемое значение метода intern() — это ссылка на строку в пуле строковых констант (String Pool).
Правила возвращаемого значения:
- Если пул строковых константуже содержитэту строку: вернуть ссылку на существующую строку в пуле.
- Если пул строковых константне содержитэту строку: сохранить ссылку на текущую строку в куче в пуле констант (вместо создания нового объекта) и вернуть эту ссылку.
Различия версий Java:
В JDK 6 и более ранних версиях пул строковых констант хранится в области методов (PermGen), которая имеет ограниченную ёмкость; чрезмерное использование intern() может привести к OutOfMemoryError.
В JDK 7 и более поздних версиях пул строковых констант был перемещён в кучу, что позволяет хранить больше данных.
Пример
В следующем примере демонстрируется применение метода intern():
Пример
public static void main(String args[]) {
// str1 напрямую присваивает строковый литерал "Example", который хранится в пуле строковых констант (String Pool)
String str1 = "Example";
// str2 создаётся с помощью ключевого слова new и хранится в куче
String str2 = new String("Example");
// str3 — это ссылка, полученная после вызова метода intern() у str2
// Метод intern() помещает "Example" в пул строковых констант и возвращает ссылку из пула
String str3 = str2.intern();
// Сравнить str1 и str2
// str1 указывает на "Example" в пуле констант, str2 указывает на объект в куче
// Поскольку их адреса различаются, результат — false
System.out.println(str1 == str2); // false
// Сравнить str1 и str3
// str3 — это ссылка, возвращённая после того, как str2 вызывает метод intern(), и она указывает на "Example" в пуле констант
// str1 также указывает на "Example" в пуле констант, поэтому их адреса совпадают, и результат — true
System.out.println(str1 == str3); // true
}
}
Пояснение к коду:
String str1 = "Example";
-
Прямое присваивание строкового литерала
"Example", он будетавтоматически сохранён в пуле строковых констант(String Pool).
String str2 = new String("Example");
-
Из-за использования
newключевого слова, онсоздаст новый строковый объект в куче, то есть,str2он не указывает на пул констант, а указывает на новый адрес в памяти.
String str3 = str2.intern();
-
intern()Метод проверяет, находится ли строка"Example"ужесуществует в пуле строковых констант:Если она существует, вернуть ссылку на эту строку;
Если она не существует, добавить её в пул констант и вернуть ссылку в пуле.
-
Поскольку
str1уже в пуле константв,str3иstr1указывает на тот же объект.
System.out.println(str1 == str2);
-
str1указывает на пул констант,str2указывает на объект в куче, поэтому==сравнение выполняется по разным адресам памяти, результатfalse。
System.out.println(str1 == str3);
-
str3Послеintern()этого,указывает на строку в пуле констант, и сstr1указывает на тот же объект, результатtrue。
Вывод вышеприведённой программы:
false true
Другие расширения
Класс String в Java