Android StringBuilder против конкатенации строк - PullRequest
14 голосов
/ 18 декабря 2011

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

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

Совет: не забывайте об этом, когда вы делаете вызов, как

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

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

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

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

Ответы [ 2 ]

9 голосов
/ 18 декабря 2011

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

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

2 голосов
/ 30 января 2017

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

Конкатенация строк (т. Е. Использование +, как в 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!";
...