StringBuilder / StringBuffer с буквальной строкой в ​​памяти

пример кода:

StringBuffer sb = new StringBuffer("hi");
sb = null;

Вопрос:

будет ли буквальная строка «привет» каким-то образом оставаться в памяти даже после того, как StringBuffer был собран сборщиком мусора? Или он просто используется для создания массива символов для StringBuffer, а затем никогда не помещается в память?

Предпочитайте StringBuilderStringBuffer. Что касается буквального String, это зависит от вашей версии Java и от того, находится ли он в пуле intern.

Elliott Frisch 20.12.2018 22:34

Похоже, строковые литералы помещаются в пул строк и остаются в памяти, пока программа работает.

Artanis 20.12.2018 22:55

@ElliottFrisch Я думаю, вам придется вернуться назад, чтобы найти строковые литералы, которые не интернируются.

Tom Hawtin - tackline 20.12.2018 23:45

@Zeratul Или загрузчик классов собрал.

Tom Hawtin - tackline 20.12.2018 23:46

@ElliottFrisch Нет смысла больше отдавать предпочтение StringBuilder перед StringBuffer. Если используется только в одном потоке, компилятор снимет блокировку, используемую в StringBuffer, поэтому это не будет иметь никакого значения (по привычке я тоже использую StringBuilder).

Ole V.V. 21.12.2018 04:33

@ OleV.V. ну, есть разница между ожиданием, пока оптимизатор удалит ненужную операцию, и отсутствием запроса операции в первую очередь. Таким образом, независимо от того, насколько крошечной может быть разница, из-за отсутствия каких-либо других функциональных отличий, все же есть причина предпочесть StringBuilder. В конце концов, вы имеют должны решить, что делать.

Holger 21.12.2018 17:41

StringBuffer скопирует аргумент, переданный его конструктору, но не содержит ссылки на него, поэтому независимо от того, собирает он мусор или нет, совершенно не имеет отношения к жизненному циклу экземпляра строки "hi".

Holger 21.12.2018 17:43
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
6
7
433
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Да, hi - это константа времени компиляции, поэтому она интернируется компилятором и находится в пуле строк.

Более того, G1GC может выполнять дедупликацию строк как часть JEP 192: дедупликация строк в G1, и в этом случае, даже если hi не был интернирован javac, он может быть сохранен как часть дедупликации.

A string literal always refers to the same instance of class String. This is because string literals - or, more generally, strings that are the values of constant expressions (§15.28) - are "interned" so as to share unique instances, using the method String.intern.

JLS 11 > 3. Lexical Structure > 3.10.5. String Literals

Другие вопросы по теме