Пул строк в Java создается и управляется JVM для оптимизации использования памяти и повышения производительности при работе со строками. Пул строк представляет собой специальную область памяти, где хранятся строковые литералы и строки, созданные с помощью метода
String.intern().🚩Инициализация пула строк
🟠Во время загрузки класса
Когда JVM загружает класс, она также загружает все строковые литералы, использованные в этом классе, и добавляет их в пул строк. Каждый раз, когда строковый литерал встречается в коде, JVM проверяет, существует ли он уже в пуле строк. Если да, используется существующая строка; если нет, строка добавляется в пул.
🟠Метод `String.intern()`
Метод
String.intern() можно использовать для добавления строки в пул строк вручную. Если строка уже существует в пуле, возвращается ссылка на существующую строку; если нет, строка добавляется в пул и возвращается ссылка на нее.public class StringPoolExample {
public static void main(String[] args) {
// Строковые литералы автоматически добавляются в пул строк
String str1 = "Hello";
String str2 = "Hello";
// Проверка, что str1 и str2 ссылаются на один и тот же объект
System.out.println(str1 == str2); // true
// Создание новой строки (не литерала)
String str3 = new String("Hello");
// Проверка, что str3 и str1 ссылаются на разные объекты
System.out.println(str1 == str3); // false
// Использование метода intern()
String str4 = str3.intern();
// Проверка, что str4 и str1 теперь ссылаются на один и тот же объект
System.out.println(str1 == str4); // true
}
}🚩Подробное описание процесса
🟠Загрузка класса и добавление литералов в пул строк
При загрузке класса JVM анализирует все строковые литералы и добавляет их в пул строк, если их там еще нет.
public class Example {
String str = "Hello"; // Литерал добавляется в пул строк при загрузке класса
} 🟠Использование метода `intern()`
Метод
intern() позволяет явно добавить строку в пул строк или получить существующую строку из пула. Это полезно, когда строки создаются динамически и нужно обеспечить, чтобы они находились в пуле строк. String dynamicStr = new String("Dynamic");
String pooledStr = dynamicStr.intern(); // Добавляет строку в пул, если её там еще нет 🚩Внутренние механизмы
🟠Метод `intern()`
Метод
intern() проверяет, находится ли строка в пуле строк. Если да, он возвращает ссылку на существующую строку. Если нет, строка добавляется в пул строк, и возвращается ссылка на неё.String s1 = new String("Java");
String s2 = s1.intern(); // s2 теперь указывает на строку в пуле строк 🟠Оптимизация памяти
Пул строк помогает избежать создания дубликатов строк в памяти, что экономит память и повышает производительность. Например, строки, содержащие одно и то же значение, могут использовать одну и ту же память.
Ставь 👍 и забирай 📚 Базу знаний