Оператор 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 более эффективен, потому что он имеет следующие преимущества,

  1. Улучшенная читаемость
  2. Лучше переводимый
  3. Вы можете использовать поставщиков формата и простые форматы (например, фиксированную ширину) прямо в строке формата.
  4. Вы можете сделать некоторые мощные вещи, поместив строки формата в файлы конфигурации.
  5. 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, поскольку его компактный синтаксис действительно хорош.