Это плохо?
(представьте, что он больше)
int count;
//done something to count
String myString = "this " + "is " + "my " + "string" + "and " + this.methodCall() + " answer " + "is : " + count;
или лучше в StringBuilder/StringBuffer?
Это плохо?
(представьте, что он больше)
int count;
//done something to count
String myString = "this " + "is " + "my " + "string" + "and " + this.methodCall() + " answer " + "is : " + count;
или лучше в StringBuilder/StringBuffer?
Компилятор Java преобразует его в StringBuilder, чтобы повысить производительность повторяющейся конкатенации строк. http://java.sun.com/docs/books/jls/Third%5Fedition/html/expressions.html#15.18.1.2
Когда вы выполняете конкатенацию в цикле, компилятор не может заменить StringBuilder сам по себе, поэтому вам следует подумать о конкатенации в StringBuilder.
Нет, все хорошо. Если вы используете компилятор Sun Java 6, он фактически будет использовать StringBuilder.
Прочтите эту статью< /а>
Javadoc для состояний StringBuffer из Java 5.0
Обычно следует использовать класс StringBuilder, а не этот, так как он поддерживает все те же операции, но быстрее, так как не выполняет синхронизацию.
Компилятор будет комбинировать строковые литералы, так что это то же самое, что писать
String myString = "this is my stringand " + this.methodCall() + " answer is : " + count;
что то же самое, что
String myString = new StringBuilder().append("this is my stringand ").append(methodCall()).append(" answer is : ").append(count).toString();
Я бы не беспокоился о производительности, если только вам не нужно удалять мусор из вашей системы, и в этом случае вы не будете использовать здесь строки. (Маловероятно, что вам стоит об этом беспокоиться)
Было бы более читабельно, если бы вы использовали StringBuilder
/StringBuffer
(выберите в зависимости от модели потока вашего приложения)
если ты напишешь
String str = "abc";
str+="def";
Внутри он создаст StringBuilder
для того же
7: invokespecial #4; //Method java/lang/StringBuilder."<init>":()V
10: aload_1
11: invokevirtual #5; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
14: ldc #6; //String def
16: invokevirtual #5; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
19: invokevirtual #7; //Method java/lang/StringBuilder.toString:()Ljava/lang/String;
22: astore_1
(представьте, что он больше)...
Объединение строк с помощью оператора «+» создает множество временных объектов и увеличивает сбор мусора. Использование класса StringBuffer более эффективно.
Подробнее здесь: http://www.ibm.com/developerworks/websphere/library/bestpractices/string_concatenation.html
StringBuffer strBuf = new StringBuffer();
strBuf.append("this");
strBuf.append("is");
strBuf.append("my");
strBuf.append("string");
strBuf.append("and");
strBuf.append(this.methodCall());
strBuf.append(" answer ");
strBuf.append("is : ");
strBuf.append(count);
Может быть связано: Конкатенация строк: оператор concat() vs +
Относительно новая статья с графиком, показывающая, что конкатенация с '+' масштабируется довольно ужасно. И, как упоминалось в другом ответе, StringBuilder, вероятно, будет более читабельным.
Вы должны предпочесть StringBuilder конкатенации строк, поскольку у вас есть вызов метода и переменная, добавляемая к строкам.
Однако количество простых строк, таких как «this» и «is», не влияет на производительность, поскольку компилятор будет эффективно их обрабатывать и создавать интернированные строки, которые в конечном итоге попадут в байт-код. При этом упомянутые строки не будут иметь накладных расходов на окончательную производительность.
Я не думаю, что это имеет какое-либо значение для производительности, когда строка написана таким образом - компилятор все равно ее оптимизирует.