Я хочу выполнить конкатенацию двух String
:
String nombre = adornoF.getNombre();
String prefijo = ga.getsid();
String all = nombre + prefijo;
Пока они возвращают getNombre()
a .getsid()
String
Это нормально или есть лучший способ?
Я хочу выполнить конкатенацию двух String
:
String nombre = adornoF.getNombre();
String prefijo = ga.getsid();
String all = nombre + prefijo;
Пока они возвращают getNombre()
a .getsid()
String
Это нормально или есть лучший способ?
Способы объединения двух
String
:С помощью оператора
+
:через метод concat() :
Используя класс StringBuffer и метод append():
Используя класс StringBuilder и метод append() :
Во всех трех случаях вы получите один и тот же результат, однако рекомендуется использовать StringBuilder для объединения текста в буфере и получения одного объекта
String
с помощьюtoString()
.Документация по Android:
Это нормально, вы также можете использовать
concat()
java-функцию следующим образом:Есть еще один способ использовать
StringBuilder
В циклах оптимальнее использовать
StringBuilder
Извлечено на SO
Вот обсуждение, что лучше, очевидно, зависит от его использования, если это только один раз, то лучше использовать
+
, но если это построить цепочку из цикла, то лучшеStringBuilder
Это очень хорошо, не меняйте его раньше времени .
При создании программы важно, среди прочего, несколько вещей:
Третий пункт всегда важен. Во всех строках кода важно, чтобы они делали то, что от них ожидается.
Два других момента не всегда так важны. Если ваша конкатенация строк занимает 0,01% времени вашей программы, вы мало что выиграете от ее оптимизации. Если вы потребляете 20%, то оно того стоит.
Чтобы сделать программу корректной , важно использовать код, который прост и удобен для понимания и сопровождения .
Код, который вы написали:
отвечает этим требованиям.
Потенциально более эффективный код, например:
Это не намного сложнее понять. Но если вы всегда программируете так, программа с 10 000 строк будет иметь 40 000, и вы заметите разницу.
Зачем ухудшать читабельность вашей программы, чтобы получить прирост эффективности, который может быть незначительным?
Вывод: старайтесь, чтобы ваш код был простым, удобным и правильным.
И когда он будет работать хорошо, пропустите его профилировщиком и оптимизируйте узкие места.
В этом случае StringBuilder быстрее?
Предположим, что по какой-то причине мы пришли к выводу, что ваша производительность имеет решающее значение. Быстрее ли использование StrinBuilder?
Рассмотрим код с оператором +:
И код со StringBuilder:
Это код в байт-кодах для оператора +:
А это код в байткодах для случая StringBuilder:
Цифры, которые получаются (от 1 до 14, а также буквы) не настоящие, я изменил их, чтобы объяснение было более понятным.
Первое, что бросается в глаза, это то, что код оператора + компилируется в StringBuilder.
Во-вторых, код StringBuilder имеет те же 14 байткодовых инструкций, что и оператор + (строки без буквы boc). За исключением различий в параметре, как в строке 8 (astore_0 или astore_2), но эта разница не влияет на производительность.
На что это влияет, так это на 6 дополнительных инструкций байт-кода (7b, 8b, 9b, 9c, 11b и 11c), которые есть в коде StringBuilder.
На устройство Android доставляется не байт-код JVM. Это конвертируется в DEX. А затем в нативный код. Но с тем, что я видел, это уже понятно. Если бы одним из этих промежуточных шагов была оптимизация кода StringBuilder, он в лучшем случае достиг бы оптимизированного кода оператора +, но ни в коем случае не улучшил бы его.
Вывод: StringBuilder в этом конкретном случае работает медленнее.
Должны ли мы отказаться от Stringbuilder и всегда использовать оператор +?
Конечно нет. Для объединения двух строк лучше использовать оператор +, но рассмотрим случай с массивом из 1000 строк, когда вы хотите объединить их все, чтобы получить одну строку.
Осмелюсь сказать, что со StringBuilder будет быстрее:
И это будет не только быстрее(1), но и этот код так же прост для понимания и поддержки, как альтернатива с оператором +:
(1) Если компилятор также не способен оптимизировать код оператора +.
Один из вариантов, который никто не упомянул, - это использовать
String.format
:Результат:
Что ж, давайте сделаем вызов всем четырем. Скажем:
Объединим строку:
и давайте посмотрим, какой из них эффективнее 4.
Каждый тест использует код, так как он работает внутри.
Примечание :
Тест был сделан на Java, на ПК. Было бы интересно запустить его на Android (возможно, с меньшим количеством значений, например, 10 000 строк)... было бы интересно увидеть результат.
Исходный код взят из 100 000 раз. Для других значений измените переменную
ITERATION
:Код:
Результат (а)
Результат (б)
Результат (с)
Результат (г)
Результат (д)
Я предлагаю вам использовать
StringBuilder
.Проблема с
Strings
java в том, что они неизменяемы и каждый раз, когда вы с ними работаете, он создает объект. При небольшом количестве процессов стоимость не имеет значения, но при большом проектеStringBuilder
дает лучшую производительность и, в свою очередь, меньшее потребление памяти.(хотя GarbajeCollector позаботится о последнем)
Бывший: