Что мы знаем, так это то, что мутация строки использует много памяти.
Это неверно. Строки не могут быть изменены . Они неизменны.
То, о чем вы на самом деле говорите, это построение строки из других строк. Это может использовать намного больше памяти, чем необходимо, но это зависит как вы строите строку.
Итак, что мы можем сделать, это использовать StringBuilder / StringBuffer.
Использование StringBuilder поможет в некоторых случаях:
String res = "";
for (String s : ...) {
res = res + s;
}
(Если цикл повторяется много раз, то оптимизация вышеприведенного использования StringBuilder может оправдать себя.)
Но при других обстоятельствах это пустая трата времени:
String res = s1 + s2 + s3 + s4 + s5;
(Оптимизировать приведенное выше для использования StringBuilder - пустая трата времени, поскольку компилятор Java автоматически преобразует выражение в код, который создает и использует StringBuilder.)
Вы должны когда-либо использовать StringBuffer вместо StringBuilder только тогда, когда строка должна быть доступна и / или обновлена более чем одним потоком; то есть когда необходимо для обеспечения безопасности потока.
Но в какой момент мы должны перейти на StringBuilder?
Простой ответ - только , когда профилировщик сообщает вам , что у вас проблема с производительностью при обработке / обработке строк.
Вообще говоря, StringBuilders используются для построения строк, а не в качестве основного представления строк.
А что нам делать, когда мы должны разделить его или заменить символы там?
Затем вы должны пересмотреть свое решение использовать StringBuilder / StringBuffer в качестве основного представления в этой точке. И если это все еще гарантировано, вы должны выяснить, как выполнить операцию, используя выбранный вами API. (Это может повлечь за собой преобразование в строку, выполнение операции, а затем создание нового результата StringBuilder из результата.)