Android StringBuilder vs String Concatenation

Я читал эту страницу документации http://developer.android.com/reference/android/util/Log.html.

Этот раздел попался мне на глаза:

Совет. Не забывайте, что когда вы делаете вызов, например

Log.v(TAG, "index=" + i);

что, когда вы создаете строку для передачи в Log.d, компилятор использует StringBuilder и имеет место не менее трех распределений: Сам StringBuilder, буфер и объект String. Реально, есть и другое распределение и копирование буфера, и еще большее давление на gc. Это означает, что если ваше сообщение журнала отфильтровывается, вы, возможно, выполняете значительную работу и значительные накладные расходы.

Это означает, что компилятор Android принимает конкатенации строк (+) и преобразовывает их в инструкции StringBuilder и append.

Является ли мое предположение правильным или же лучше использовать StringBuilder вручную вместо конкатенации строк?

Ответы

Ответ 1

Компилятор делает именно то, что вы предлагаете. Вы можете печатать байт-коды сгенерированного файла .class(используя javap -c) и видеть вызовы для построения и использования StringBuilder.

Однако обычно это делается вручную, когда конкатенации строк распределены по нескольким строкам кода. Компилятор обычно выделяет отдельный StringBuilder для каждого выражения со строкой, содержащего +.

Ответ 2

Ответ Теда Хоппа - это хорошо, но он понял его несколько раз, чтобы понять. Вот отредактированный ответ, который, надеюсь, более ясен.

Конкатенация строк (т.е. используя +, как в String myString = "Hello " + "World";), использует StringBuilder в фоновом режиме вместе с другими выделениями. Таким образом, для чего-либо другого, кроме простой однократной конкатенации, было бы лучше использовать StringBuilder самостоятельно.

Например,

StringBuilder myString = new StringBuilder();
myString.append("Hello ");
myString.append("to ");
myString.append("everyone ");
myString.append("in ");
myString.append("the ");
myString.append("world!");

лучше, чем

String myString = "Hello " + "to " + "everyone " + "in " + "the " + "world!";