Java String интерн()

String.intern() в Java возвращает ссылку на эквивалентный строковый литерал, присутствующий в пуле строк. Если в пуле строк есть существующий строковый литерал, то возвращается его ссылка. В противном случае создается новая строка с тем же содержимым, и возвращается ссылка на новую строку.

Обратите внимание, что внутренне равенство строк проверяется с помощью метода String.equals().

1. Что такое пул строк?

Пул строк — это зарезервированная область памяти в куче, которую Java использует для хранения строковых констант. Обратите внимание, что строки Java по умолчанию неизменяемы.

Java хранит одну и только одну копию каждого отдельного строкового значения в пуле строк. Это помогает повторно использовать строки для экономии памяти во время выполнения программы. В работающей программе может быть много ссылок на строку, но внутри пула строк будет только одна копия строки.

2. Строковые литералы и объекты

В Java мы можем создавать строки двумя способами. Первый способ — создать строковый литерал, а второй способ — создать объект String с использованием ключевого слова new.

String str1 = "hello world"; //String literalString str2 = new String("hello world"); //String object
  • Когда мы создаем строку с использованием литерала(это также рекомендуется), строковые литералы всегда создаются непосредственно в пуле строк.
  • Когда мы создаем строку с ключевым словом new, строка создается в обычной куче памяти.
Java String интерн()0

3. Метод String.intern()

String.intern() — это собственный метод, который возвращает ссылку на эквивалентный строковый литерал, присутствующий в пуле строк. Обратите внимание, что все строковые литералы автоматически создаются в пуле строк, поэтому метод intern() полезен для объектов String, созданных с помощью ключевого слова new.

Следующая программа, name variable содержит ссылку на объект String в куче. Когда мы вызываем intern(), в пуле строк создается новый строковый литерал с содержимым «Alex». Переменная str содержит ссылку на строковый литерал, созданный в пуле.

String strObject = new String("Alex");String strLiteral = strObject.intern();Assertions.assertFalse(strObject == strLiteral); //Points to different objectsAssertions.assertTrue(strObject.equals(strLiteral)); //Same content
Java String интерн()1

Любой новый строковый литерал, созданный с тем же содержимым, будет указывать на объект в пуле строк.

String newLiteral = "Alex";Assertions.assertTrue(strLiteral == newLiteral);

Как правило, любые две строки s1 и s2, s1.intern() == s2.intern() является истинным тогда и только тогда, когда s1.equals(s2) является истинным.

4. Заключение

В этом уроке Java мы узнали, как интернировать строку и чем строковые литералы отличаются от строковых объектов. String.intern() — это изначально реализованный метод, который обеспечивает очень высокую производительность.

Ссылки: String Java Doc

Прокрутить вверх