В 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 лакхов индийских рупий.