Метод intern() в Java

Java String类Класс String в 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 class ExampleTest {
    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

Java String类Класс String в Java

Другие расширения