добавить или + оператор в StringBuffer? - PullRequest
4 голосов
/ 06 августа 2010

В моем проекте есть несколько фрагментов кода, в которых используются объекты StringBuffer, и небольшая его часть выглядит следующим образом:

StringBuffer str = new StringBuffer();

str.append("new " + "String()");

, поэтому меня смутило использование метода append и оператора +.

то есть следующий код может быть записан как

str.append("new ").append("String()");

Значит, две вышеупомянутые строки одинаковы? (Функционально да, но) Или есть какое-то конкретное их использование?т.е. производительность или читабельность или ???

спасибо.

Ответы [ 4 ]

15 голосов
/ 06 августа 2010

В в этом случае более эффективно использовать первую форму - потому что компилятор преобразует ее в:

StringBuffer str = new StringBuffer();
str.append("new String()");

потому что он объединяет константы.

Несколько общих замечаний:

  • Если бы ни одно из этих выражений не было константой, вам лучше (с точки зрения производительности) использовать два вызова append, чтобы избежать создания промежуточной строки без всякой причины
  • Если вы используете последнюю версию Java, StringBuilder обычно предпочтительнее
  • Если вы сразу собираетесь добавить строку (и знаете, что это такое во время создания), вы можете передать ее конструктору
6 голосов
/ 06 августа 2010

На самом деле компилятор байт-кода заменит все конкатенации строк, которые включают в себя не константы в Java-программе, вызовами StringBuffer. Это

int userCount = 2;
System.out.println("You are the " + userCount + " user");

будет переписано как

int userCount = 2;
System.out.println(new StringBuffer().append("You are the ").append(userCount).append(" user").toString());

Это как минимум то, что можно наблюдать при декомпиляции файлов классов Java, скомпилированных с JDK 5 или 6. См. этот пост .

0 голосов
/ 06 августа 2010

Если вы не работаете с параллельными системами, используйте StringBuilder вместо StringBuffer. Это быстрее, но не потокобезопасно:)

Он также использует тот же API, так что его более-менее прямая находка / замена-

0 голосов
/ 06 августа 2010

Вторая форма наиболее эффективна с точки зрения производительности, поскольку создается только один строковый объект, который добавляется в строковый буфер.Первая форма создает три строковых объекта 1) для «новой» 2) для «новой строки» 3) для объединенного результата 1) и 2).и этот третий строковый объект присоединяется к строковому буферу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...