Я пытаюсь понять, что лучше всего и почему для объединения строковых литералов и переменных для разных случаев. Например, если у меня есть такой код
StringBuilder sb = new StringBuilder("AAAAAAAAAAAAA")
.append(B_String).append("CCCCCCCCCCC").append(D_String)
.append("EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE")
.append("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF");
Это способ сделать это? Из этого поста я заметил, что +
оператор в Strings создает новый экземпляр StringBuilder, объединяет операнды и возвращает преобразование String, что, похоже, требует гораздо больше работы, чем просто вызов .append()
; так что если это правда, то об этом не может быть и речи. А что насчет String.concat()
? Правильно ли использовать .append()
для каждой конкатенации? Или только для переменных и литералов можно добавлять .concat()
?
StringBuilder sb = new StringBuilder("AAAAAAAAAAAAA")
.append(B_String.concat("CCCCCCCCCCC")).append(D_String
.concat("EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE")
.concat("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"));
Каковы общие правила передового опыта и производительности в подобных ситуациях? Верно ли мое предположение, +
и его действительно не следует использовать?
источник
Ответы:
+
операторЗа кулисами это переводится на:
String s = new StringBuilder(s1).append(s2).toString();
Представьте, сколько дополнительной работы он добавляет, если у вас есть
s1 + s2
здесь:вместо того:
Несколько строк с
+
Стоит отметить, что:
переводится на:
String s = new StringBuilder(s1).append(s2).append(s3)...apend(sN).toString();
concat()
String
создаетchar[]
массив, который может вместить какs1
иs2
. Копииs1
иs2
содержимое этого нового массива. На самом деле требует меньше работы, чем+
оператор.StringBuilder.append()
Поддерживает внутренний
char[]
массив, который увеличивается при необходимости. Никакого лишнегоchar[]
не создается, если внутренний достаточно большой.также работает плохо , потому что
s1.concat(s2)
создает дополнительныйchar[]
массив и копируетs1
иs2
к нему просто скопировать , что новое содержимое массива к внутреннемуStringBuilder
char[]
.При этом вы должны использовать
append()
все время и добавлять необработанные строки (ваш первый фрагмент кода правильный).источник
+
объекты String вместо созданияStringBuilder
одноразовой конкатенации, поскольку она в основном будет делать то же самое?Компилятор оптимизирует конкатенацию +.
Так
int a = 1; String s = "Hello " + a;
превращается в
new StringBuilder().append("Hello ").append(1).toString();
Там отличная тема здесь объяснить , почему вы должны использовать оператор +.
источник
String s = "Hello World";
поскольку вы используете литералы.Оптимизация выполняется компилятором автоматически.
Компилятор Java2 автоматически преобразует следующее:
к
String s = (new StringBuffer()).append(s1).append(s2).toString();
Взято прямо с веб-сайта Java Best Practices on Oracles.
источник
Вы всегда должны использовать
append
.concat
создать новую строку так, как+
я думаю.Если вы
concat
или используете+
с 2 final String, JVM может выполнить оптимизацию, так что это то же самое, что и добавление в этом случае.источник
Если вы объединяете ровно две строки, используйте String.concat (создает новую строку, создавая новый массив символов, который соответствует обеим строкам, и копирует в него массивы символов обеих строк).
Если вы объединяете несколько (более двух) строк в одну строку, используйте + или StringBuilder.append, это не имеет значения, поскольку компилятор преобразует + в StringBuilder.append. Это хорошо для нескольких строк, поскольку поддерживает один массив символов, который увеличивается по мере необходимости.
Если вы объединяете несколько строк в несколько строк, создайте один StringBuilder и используйте метод append. В конце, когда вы закончите добавление Strings в StringBuilder, используйте его .toString () - метод, чтобы создать из него String. Для объединения в несколько строк это быстрее, чем второй метод, поскольку второй метод будет создавать новый StringBuilder в каждой строке, добавлять строки и затем возвращать их к String, тогда как третий метод использует только один StringBuilder для всего этого.
источник
+
Лучше всего использовать оператор использования , он также прост и удобочитаем.Официальный документ: https://docs.oracle.com/javase/8/docs/api/java/lang/String.html
источник
на уровне байт-кода нет различий, и мы не ставим под угрозу эффективность. В случае выполнения уровня байтового кода он должен пройти через метод перегрузки не встроенного оператора для +, вызвав append. затем на уровне языка ассемблера (Java написана на C, а C создает сборки, аналогичные сборке, будет дополнительный вызов регистра для вызова метода store + в стеке, и будет дополнительный push. (на самом деле кросс-компилятор может оптимизировать оператор + звоните, в этом случае не имеет значения для эффективности.)
Хорошая практика - иметь один способ повысить удобочитаемость. :)
источник
Лично я предпочитаю
Strings.format()
простой и удобный для чтения однострочный форматтер строк .String b = "B value"; String d = "D value"; String fullString = String.format("A %s C %s E F", b, d); // Output: A B value C D value E F
источник
Все ответы довольно хороши и понятны. Но я чувствовал, что изучение других методов конкатенации строк также может помочь, например, Guava Joiner, Streams, String.format и т. Д.
Для получения полной информации о производительности каждого метода конкатенации java-string-concatenation-which-way-is-best .
Вкратце, производительность конкатенации зависит от номера. строк для объединения. Например, для объединения 1-10 строк лучше всего подходят эти методы - StringBuilder, StringBuffer и Plus Operator. А для объединения сотен строк - Guava Joiner, библиотека apache stringsUtils также отлично работает.
Пожалуйста, просмотрите указанный выше блог. Это действительно очень хорошо объясняет эффективность работы.
Спасибо.
источник