Мы знаем, что в Java строки хранятся в области памяти heap . Внутри этой кучи памяти есть определенная область памяти, называемая String Pool . Когда мы создаем строковые примитивы, они будут храниться в области памяти пула строк благодаря неизменяемости java string.
Обратитесь к следующему коду.
public class StringPoolDemo{ public static void main(String[] args){ String a = "hello"; String b = "hello"; } }
Оба строковых примитива a и b одинаковы. Таким образом, без создания двух строковых объектов в куче JVM может создать только одну строку и подключить обе ссылочные переменные к одному и тому же строковому объекту. Когда это произойдет, строковые объекты будут созданы внутри специальной области памяти, называемой stringpool кучи.
Этот пул строк представляет собой большую хэш-карту . Все строки будут сохранены как элементы хэш-карты.
Но история немного отличается, когда дело доходит до создания строк с помощью конструктора. Потому что в это время строка будет вести себя как объект, а не как примитив. Таким образом, строковый объект будет создан внутри кучи. Не в пуле строк.
Кроме того, мы можем добавлять строки в область памяти пула строк вручную с помощью функции String.intern() .
public class StringPoolDemo{ public static void main(String[] args){ String s = "hello world"; s.intern(); } }
При выполнении этого кода s будет сохранен в памяти пула строк.
Давайте напишем какой-нибудь код, чтобы проверить это.
public class StringPoolDemo{ public static void main(String[] args){ String a = "hello"; String b = "hello"; System.out.println(a.equals(b)); // true System.out.println(a == b); // true } }
В обоих выходных данных мы получаем true в качестве выходных данных. Таким образом, мы можем сказать, что оба a и b ссылка на один и тот же строковый объект.
Вы можете использовать -XX:+PrintStringTableStatistics флаг JVM, чтобы увидеть, сколько сегментов доступно в вашем пуле строк JVM и сколько из них используется.
Если ваше приложение содержит огромное количество строковых примитивов, вы можете добиться значительной эффективности, увеличив размер пула строк с помощью -XX: StringTableSize= .
Обязательно используйте простое число в качестве значения для достижения наилучшей производительности.
Оригинал: “https://dev.to/buddhikac96/java-string-pool-2j56”