«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > Распределение памяти для строк в Java

Распределение памяти для строк в Java

Опубликовано 12 ноября 2024 г.
Просматривать:415

Memory Allocation of Strings in Java

В Java строки хранятся в памяти как объекты класса String.

Когда память выделяется для какой-либо программы Java, JVM (виртуальная машина Java) делит выделенную память на две части. Одна часть — это стек, а другая часть — куча. В динамической памяти Java выделяет некоторую память, особенно для литералов, эта память называется пулом строковых констант (SCP). SCP — это предопределенная область внутри кучи. Пул строк помогает сэкономить много места для среды выполнения Java. Класс String использует SCP для хранения уникальных строковых литералов.

В памяти стека хранятся переменные или ссылки на переменные или ссылки на объекты.

В памяти кучи хранятся все динамически выделяемые объекты. Чтобы выделить память для объекта, мы используем новое ключевое слово.

Существует два способа создания строковых объектов.

  1. Строковый литерал

Строка str1 = «МояСтрока»;

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

На рисунке выше str1 указывает на «MyString» в SCP. Ниже приведены способы обработки вновь созданных строковых литералов.

  1. Используя новое ключевое слово

String str2 = новая строка («MyString»); //Создание экземпляра класса строки с использованием нового ключевого слова

Когда строковый объект создается с использованием нового ключевого слова, будет создано два объекта. Один в SCP, другой в куче, а ссылочная переменная хранится в стеке.

Мы уже создали литерал «MyString», используя

Строка str1 = «МояСтрока»;

Поскольку у нас не может быть дубликатов в SCP, JVM не будет создавать еще один объект в SCP, а вернет существующую ссылку на переменную str3 в стеке и создаст один объект в куче. Str3 будет указывать на объект MyString в куче, но не в SCP.

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

Случай 1: Как строковые объекты, определенные выше, хранятся в памяти.

строки общедоступного классаStorageConcept

{

public static void main(String[] args)

{

Строка str1 = «МояСтрока»;

Строка str2 = новая строка («MyString»);

System.out.println(str1 == str2); //Вывод:False

System.out.println(str1.equals(str2)); //Выход: Истина

}

}

Когда мы сравниваем str1 и str2 с помощью оператора «==», он возвращает false. Как мы знаем, оператор «==» сравнивает их физические адреса. Здесь, в нашем примере, str1 указывает на объект в SCP, а str2 указывает на объект в куче. Поэтому он возвращает false.
Но в случае с str1.equals(str2), как мы знаем, функция «equals» проверяет, что отдельные символы, как str1, так и str3, имеют одинаковое сохраненное значение, и возвращают true.

Случай 2: еще один строковый литерал

Строка str3 = «МояСтрока»;

И str1, и str3 будут указывать на один и тот же строковый литерал в SCP.

строки общедоступного классаStorageConcept

{

public static void main(String[] args)

{

Строка str1 = «МояСтрока»;

Строка str3 = «МояСтрока»;

System.out.println(str1 == str2); //Выход: Истина

System.out.println(str1.equals(str2)); //Выход: Истина

}

}

s1 == s3 возвращает true, поскольку оператор «==» сравнивает их физические адреса, но не содержимое.
s1.equals(s3) возвращает true, а функция «equals» проверяет отдельные символы в обеих ссылочных переменных.

Случай 3: Другой строковый объект создается с использованием нового ключевого слова

Строка str4 = новая строка («Новая строка»);

В этом случае JVM проверит эту строку в SCP. Она не может найти строковый объект со значением «NewString», поэтому она создаст два объекта: один в SCP, а другой в куче, ссылочная переменная str4 будет сохранена в стек. Str4 будет иметь ссылку на объект в куче.

Случай 4: создается еще один строковый литерал.

Строка str5 = «Новаястрока»;

В этом случае JVM проверит SCP, доступен ли этот литерал или нет, здесь «NewString» уже присутствует в SCP, поэтому JVM не будет создавать дубликат в SCP, а вместо этого возвращает ссылку на переменную str5.

Случай 5: присвоение одной строки другой строке

Строка str4 = новая строка («Новая строка»);

Строка str6 = str4; //Назначение

Здесь str6 и str4 будут указывать на один и тот же объект в куче и не удалят значение в str4.

строки общедоступного классаStorageConcept

{

public static void main(String[] args)

{

Строка str4 = новая строка («Новая строка»);

Строка str6 = str4;

System.out.println(str4 == str6); //Вывод: true

}

}

JVM передаст ссылку «NewString» в куче на переменную str6. Вот почему str4 == str6 возвращает true.

В заключение, создание строковых объектов с использованием строкового литерала и оператора new имеет свои плюсы и минусы.

Используя строковые литералы, мы можем повысить эффективность использования памяти, не создавая дубликатов. JVM создает один уникальный объект, и строка остается в SCP навсегда. Обратной стороной этого является то, что пул строк имеет фиксированный размер и через некоторое время он переполнится.
Но при использовании нового ключевого слова создаются два объекта: один в SCP, а другой в куче. В куче, если объект нам не нужен, сборщик мусора удалит его, чтобы освободить место. Но недостатком этого является то, что с «новым» оператором JVM всегда придется создавать новый объект, а это перегрузка для JVM.

Заявление о выпуске Эта статья воспроизведена по адресу: https://dev.to/soumya_deypersevere08_/memory-allocation-of-strings-in-java-1393?1 Если есть какие-либо нарушения, пожалуйста, свяжитесь с [email protected], чтобы удалить ее.
Последний учебник Более>

Изучайте китайский

Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.

Copyright© 2022 湘ICP备2022001581号-3