Оператор String.format() vs "+"
Что следует использовать для базовой операции конкатенации строк?
String randomString = "hello " + userName + " how are you" ?
или
String randomString = String.format("hello %s how are you ?",userName);
Я чувствую, что String.format()
дает лучшее представление о выходной строке. Но что на самом деле за и против в использовании любого из них?
Есть ли что-либо с точки зрения производительности или сиротских записей в пуле строковых литералов.
Изменить: Я говорю о нескольких параметрах в строке, а не только о одном. Около 5 +.
Бонусный вопрос: Пожалуйста, также поделитесь своим мнением о том, какой из них следует использовать? любой из этих или третьего... !! ?
Ответы
Ответ 1
Если вы ищете только производительность, я считаю, что использование StringBuilder/StringBuffer
является наиболее эффективным способом построения строк. Даже если компилятор Java достаточно умен, чтобы перевести большинство конкатенаций String в эквивалент StringBuilder
.
Если вы ищете удобочитаемость, то String.format
гораздо яснее, я думаю, и это то, что я использую, кроме случаев, когда мне нужно полагаться на высокую производительность.
Поэтому, если ваша главная проблема - не производительность, то есть этот код не находится в пути, который называется много, вы можете предпочесть использовать String.format
поскольку он дает лучшее представление о полученной String (как вы сказали).
Кроме того, использование String.format
позволяет использовать формат, что означает, что вы можете использовать его для заполнения строк, чисел форматирования, дат и т.д., Что сделало бы код еще хуже при использовании простой конкатенации.
Изменить для Chuu:
Используя JAD, вы можете увидеть, что следующий код:
public class Test {
public static void main(String[] args) {
String str = "a" + "b" + "c";
String str2 = "foo" + str + "bar" + str;
System.out.println(str2);
}
}
при декомпиляции будет выглядеть так:
public class Test {
public static void main(String[] args) {
String str = "abc";
String str2 = new StringBuilder("foo").append(str).append("bar").append(str).toString();
System.out.println(str2);
}
}
Доказательство этого также можно найти с javap
утилиты javap
, которая покажет вам байт-код Java в файле .class
:
public static void main(java.lang.String[] args);
0 ldc <String "abc"> [16]
2 astore_1 [str]
3 new java.lang.StringBuilder [18]
6 dup
7 ldc <String "foo"> [20]
9 invokespecial java.lang.StringBuilder(java.lang.String) [22]
12 aload_1 [str]
13 invokevirtual java.lang.StringBuilder.append(java.lang.String) : java.lang.StringBuilder [25]
16 ldc <String "bar"> [29]
18 invokevirtual java.lang.StringBuilder.append(java.lang.String) : java.lang.StringBuilder [25]
21 aload_1 [str]
22 invokevirtual java.lang.StringBuilder.append(java.lang.String) : java.lang.StringBuilder [25]
25 invokevirtual java.lang.StringBuilder.toString() : java.lang.String [31]
28 astore_2 [str2]
29 getstatic java.lang.System.out : java.io.PrintStream [35]
32 aload_2 [str2]
33 invokevirtual java.io.PrintStream.println(java.lang.String) : void [41]
36 return
Ответ 2
Что следует использовать для базовой операции конкатенации строк?
Примеры, которые вы предоставляете серверам в разных целях. +
перегружен до concat String
но String.format
используется для форматирования строк, как указано в имени.
Объединение струн вместе не является основной задачей.
Таким образом, если требование состоит в том, чтобы объединить метод использования +
или concat.
Эти ссылки будут полезны:
Должен ли я использовать String.format() Java, если производительность важна?
Лучше ли использовать String.format над строкой Concatenation в Java?
Ответ 3
Попробуй это
long t0 = System.currentTimeMillis();
String userName = "test";
for (int i = 0; i < 1000000; i++) {
String randomString = "hello " + userName + " how are you?";
// String randomString = String.format("hello %s how are you ?",userName);
}
System.out.println(System.currentTimeMillis() - t0);
вы будете удивлены, узнав, что конкатенация в 10 раз быстрее, чем String.format. Но формат может делать очень полезные вещи с числами, датами и т.д. Подробнее см. Java.util.Formatter API, который фактически используется String.format.
Ответ 4
Лично я предпочел бы использовать форматирование, поскольку он выглядит лучше, и я не могу себе представить, что это сильно влияет на производительность.
Ответ 5
Большинство людей, рекомендующих использовать StringBuffer, живут в прошлом. Текущей лучшей практикой является использование StringBuilder. Но это может измениться, так почему бы не позволить компилятору сделать это для вас? Когда вы просто используете "+", компилятор выберет текущую реализацию, которая может даже комбинировать статические строки ("foo" + "bar" станет единственным "foobar").
В явном месте, где я бы явно выделил StringBuilder, находится в циклах (где он создается до цикла и используется внутри).
Проверьте сгенерированный байт-код, если у вас есть сомнения в том, что происходит.
Итак, когда использовать формат? Я бы использовал формат, когда фактическое форматирование было сложным. Но вы говорите о простой конкатенации прямо сейчас.
Ответ 6
Я думаю, что String.Format более эффективен, потому что он имеет следующие преимущества,
- Улучшенная читаемость
- Лучше переводимый
- Вы можете использовать поставщиков формата и простые форматы (например, фиксированную ширину) прямо в строке формата.
- Вы можете сделать некоторые мощные вещи, поместив строки формата в файлы конфигурации.
- String.Format() часто бывает быстрее, поскольку он использует StringBuilder и эффективный конечный автомат за кулисами, тогда как конкатенация строк в.Net относительно медленная. Это особенно верно, поскольку размер строки и количество замещенных значений увеличивается.
Благодарю.
Ответ 7
Мои два цента: всегда используйте String.format()
В этой ситуации интернационализация вызывает гораздо большую озабоченность, чем стиль или производительность. По этой причине я всегда использовал String.format()
Текст на английском языке: "Hello " + userName + " how are you?"
Перевод в джедай: userName + "you are how? Hello!"
Если строки конкатенированы, изменение порядка слов может быть затруднено, если это невозможно для переводчика. Эта проблема становится все хуже, поскольку в строке больше и больше заполнителей.
Ответ 8
По-моему, используйте + operator
.
Если производительность вызывает беспокойство, вы должны использовать StringBuilder
и, как StringBuilder
Алекс в своем комментарии выше, компилятор Java преобразует:
String str2 = "a" + str1;
to: String str2 = new StringBuilder("a").append(str1)).toString();
В дополнение к этому вы можете избежать исключений во время выполнения с помощью + operator
. Вместо этого вы получите синтаксические ошибки, которые вы можете поймать во время компиляции. Например:
String var = "huge success.";
System.out.print( "I'm making a note here: " + var );
//System.out.print( "Printing: " + ); Syntax error!
System.out.print( String.format( "I'm making a note here: '%s'", var ) );
System.out.print( String.format( "I'm making a note here: '%s'" ) ); // runtime exception!
System.out.print( String.format( "I'm making a note here: '%d'", var ) ); // runtime exception!
Читаемость сводится к личным предпочтениям. Однако я скажу, что синтаксис String.format
в основном из C++, и большинство языков, созданных с тех пор, обняли + operator
для удобства чтения.
Ответ 9
Моя главная проблема с String.format
заключается в том, что это специфичная для локали операция, и вы можете получить непредсказуемые результаты, если ваш код запущен в другом языковом стиле.
Я хотел бы иметь альтернативу не locale, поскольку его компактный синтаксис действительно хорош.