В Java строка — это последовательность символов, всегда заключенная в двойные кавычки. Одним из альтернативных определений строки является «массив символов». Кроме того, в Java строки являются самостоятельными объектами.

Проще говоря, строки не могут быть изменены. Когда строка неизменяема, все изменения в ней приводят к созданию нового объекта, а не модификации старой строки. За эту неприкосновенность отвечает String Pool. Следующим шагом будет изучение идеи пула строк.

Курс разработки серверной части Java может улучшить ваши навыки.

Что такое пул строк в Java?

Строковые литералы Java хранятся в отдельном разделе кучи Java, называемом пулом строк. String Constant Pool или String Intern Pool — два других названия этой концепции. JVM консультируется с пулом строковых констант перед созданием нового объекта String для строкового литерала.

  • Во-первых, мы поговорим о двух основных способах выделения памяти в Java — стеке и куче.
  • В памяти стека разрешены только целые числа, символы, байты, короткие, логические, длинные, числа с плавающей запятой и двойные числа.
  • Напротив, непримитивные типы данных, такие как строки, хранятся в памяти кучи. В стеке хранится указатель на этот адрес.

Выделение памяти для пула строк

Класс String по умолчанию сохраняет закрытый и пустой пул строк.

JVM всегда просматривает пул строковых констант, прежде чем использовать строковый литерал. Ссылка на литерал в пуле сохраняется в переменной, если она там уже существует.

Если литеральная строка не может быть найдена, JVM выделяет и возвращает ссылку на новый строковый объект из пула строковых констант.

Требуется пул строковых констант

Каждый раз, когда создается объект String, требуется определенный объем кучи памяти.

Предположим, что мы создаем n копий объекта String, каждая из которых имеет одно и то же значение, но занимает отдельный участок памяти.

Пространство кучи используется неэффективно. JVM использует пул строковых констант для оптимизации способа хранения строк, что повышает скорость наших программ и снижает потребление памяти.

Методы создания строк

В Java очень распространены три метода генерации строк:

Буквальная строка:

Представляем новый поисковый запрос

Вызов процедуры String.intern()

Давайте узнаем, как пул строк реагирует на эти три разных подхода.

Во-первых, литеральная строка

Это самый простой и интуитивно понятный метод объявления строки. Необходимо использовать двойные кавычки.

«»; Строка = "";

"Джава"; ул = «Ява»

Выражение «Java» в строке str1 и «Изучение» в строке str2 являются строками.

Изменения в строковом ресурсе:

По умолчанию в пуле не будет строк. Следовательно, строковый литерал «Java» добавляется в пул строковых констант, когда компилятор обрабатывает первую строку.

Вторая строка проверяется на соответствие пулу строковых констант перед выполнением компилятором. Поскольку «Java» — это ранее существовавший элемент пула строк, ссылка на него сохраняется в str1.

Если строковый литерал «Study» еще не существует в пуле строковых констант, то его создание инициируется третьим предложением. Указатель на него хранится в str2. Компилятор всегда просматривает пул строковых констант перед созданием строкового литерала. Если он найдет уже существующую строку, он вернет эту строку в переменную, а не создаст новую.

Вставка нового ключевого слова:

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

Проще говоря, String = new String("");

Если str — это строка «Java», то str1 — это строка «new String («Java»)»;

Сдвиги распределения памяти в куче Java

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

Вызов процедуры String.intern()

Когда строка создается с ключевым словом new, она сохраняется в куче, а не в пуле строковых констант. Если строкового литерала еще нет в пуле строк, JVM создаст его и сохранит ссылку на него в переменной, когда мы используем String.intern() для улучшения функциональности. Если создаваемый объект String уже существует в пуле констант String, вместо него возвращается ссылка на него.

Идентификатор строки›.intern();

«строковое значение» = «новая строка»; «строковое имя» — это строковая переменная.intern();

Рассмотрим следующее: String str = «Java»;

новая строка («Java») = строка («Java»).intern();

Новая строка str2 = «Код»; ул2.интерн();

Заключение

Пул строк в Java является важным компонентом для оптимизации скорости и сокращения использования памяти. Java проверяет, был ли ранее создан строковый литерал, путем поиска в пуле строк. Если это так, исходный объект возвращается вместо создания нового. На один и тот же элемент в пуле строк будет ссылаться множество идентичных строковых литералов, если они будут созданы.

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

Стоимость курса Java-разработчика может достигать 3 лакхов индийских рупий.