Пул строк (String Pool) — это множество строк в кучи (Java Heap Memory). Мы знаем, что String — особый класс в java, с помощью которого мы можем создавать строковые объекты.
На диаграмме ниже мы видим как именно строковый пул расположен в памяти Java Heap. И как разные способы создания строк влияют на расположение их в памяти.
Сам строковый пул возможен только потому, что строки в Java неизменные. Также пул строк позволяет сохранить память в Java Runtime, хотя это и требует больше времени на создание самой строки.
Пример работы с пулом строк
Когда мы используем двойные кавычки, чтобы создать новую строку, то первым делом идет поиск строки с таким же значением в пуле строк. Если java такую строку нашла, то возвращает ссылку, в противном случае создается новая строка в пуле, а затем возвращается ссылка.
Однако использование оператора new
заставляет класс String создать новый объект String. После этого можем использовать метод intern()
, чтобы поместить этот объект в пул строк или обратиться к другому объекту из пула строк, который имеет такое же значение.
Ниже приведена программа, которая демонстрирует работу с пулом строк:
StringPool.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
package ua.com.prologistic.util; public class StringPool { public static void main(String[] args) { String s1 = "Cat"; String s2 = "Cat"; String s3 = new String("Cat"); // сравниваем наши строки System.out.println("s1 == s2 : " + ( s1 == s2 ) ); System.out.println("s1 == s3 : " + ( s1 == s3 ) ); } } |
Результат выполнения программы:
1 2 |
s1 == s2 : true s1 == s3 : false |
Что происходит внутри нашей программы отчетливо видно на диаграмме выше.
Следите за обновлениями на Javadevblog.com
спасибо. очень понятно написано, но разве пул строк находится в хипе?насколько я знаю он хранится в permgen. меня просто немного сбила картинка в статье
SERGII, не помню точно с какой версии Java, но пул строк был перенесен из PermGen в кучу.
Да и сам PermGen уже переименовали в MetaSpace и сделали его вроде автоматически расширяемым.
С Java 8 перенесено с ПермГен…
SERGII, не помню точно с какой версии Java, но пул строк был перенесен из PermGen в кучу.
Да и сам PermGen уже переименовали в MetaSpace и сделали его вроде автоматически расширяемым.