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, строка создается в обычной куче памяти.

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

Любой новый строковый литерал, созданный с тем же содержимым, будет указывать на объект в пуле строк.
String newLiteral = "Alex";Assertions.assertTrue(strLiteral == newLiteral);
Как правило, любые две строки s1 и s2, s1.intern() == s2.intern() является истинным тогда и только тогда, когда s1.equals(s2) является истинным.
4. Заключение
В этом уроке Java мы узнали, как интернировать строку и чем строковые литералы отличаются от строковых объектов. String.intern() — это изначально реализованный метод, который обеспечивает очень высокую производительность.
Ссылки: String Java Doc