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

Пул строковых констант: почему «new» создает новый строковый объект, даже если литерал существует?

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

String Constant Pool: Why Does \

Пул строковых констант: углубленное исследование

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

Однако путаница возникает при использовании оператора «новый» для создания нового объекта String, поскольку это, по-видимому, противоречит правилу. стажировки. Чтобы прояснить это, давайте рассмотрим следующие утверждения:

  • "Когда компилятор встречает строковый литерал, он проверяет пул, чтобы узнать, существует ли уже идентичная строка."
  • "В в случае «нового» ссылки на строковые литералы по-прежнему помещаются в таблицу констант, но когда вы используете «новый», JVM обязана создавать новый объект String во время выполнения, а не использовать объект из константы table.»

Эти операторы указывают, что, хотя строковый литерал интернируется и сохраняется в пуле, использование «нового» заставляет JVM создать новый объект String. Это означает, что, несмотря на существование эквивалентной строки в пуле, оператор «new» обходит его и выделяет новый объект в памяти, отличной от пула.

Чтобы проиллюстрировать это, рассмотрим следующий пример:

String one = new String("test");
String two = "test";
System.out.println(one.equals(two)); // true
System.out.println(one == two); // false

Как и ожидалось, значения «one» и «two» — «test», но сравнение «==" возвращает false, поскольку они относятся к разным объектам String. Это связано с тем, что использование «new» приводит к созданию нового объекта String для «one», даже если строковый литерал «test» уже существует в пуле.

Подводя итог, можно сказать, что пул строковых констант оптимизирует использование памяти путем интернирования строковых литералов. Однако использование «new» обходит пул и создает новый объект String в памяти, не относящейся к пулу. В результате образуются два разных объекта String с одинаковым значением, но разными ссылками.

Последний учебник Более>

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

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

Copyright© 2022 湘ICP备2022001581号-3