пример кода:
StringBuffer sb = new StringBuffer("hi");
sb = null;
Вопрос:
будет ли буквальная строка «привет» каким-то образом оставаться в памяти даже после того, как StringBuffer был собран сборщиком мусора? Или он просто используется для создания массива символов для StringBuffer, а затем никогда не помещается в память?
Похоже, строковые литералы помещаются в пул строк и остаются в памяти, пока программа работает.
@ElliottFrisch Я думаю, вам придется вернуться назад, чтобы найти строковые литералы, которые не интернируются.
@Zeratul Или загрузчик классов собрал.
@ElliottFrisch Нет смысла больше отдавать предпочтение StringBuilder перед StringBuffer. Если используется только в одном потоке, компилятор снимет блокировку, используемую в StringBuffer, поэтому это не будет иметь никакого значения (по привычке я тоже использую StringBuilder).
@ OleV.V. ну, есть разница между ожиданием, пока оптимизатор удалит ненужную операцию, и отсутствием запроса операции в первую очередь. Таким образом, независимо от того, насколько крошечной может быть разница, из-за отсутствия каких-либо других функциональных отличий, все же есть причина предпочесть StringBuilder. В конце концов, вы имеют должны решить, что делать.
StringBuffer скопирует аргумент, переданный его конструктору, но не содержит ссылки на него, поэтому независимо от того, собирает он мусор или нет, совершенно не имеет отношения к жизненному циклу экземпляра строки "hi".




Да, 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 methodString.intern.
Предпочитайте
StringBuilderStringBuffer. Что касается буквальногоString, это зависит от вашей версии Java и от того, находится ли он в пулеintern.