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!";