Ні, не зовсім.
По-перше, є незначна різниця в семантиці. Якщо aє null, то a.concat(b)кидає , NullPointerExceptionале a+=bбуде ставитися до первісної вартості , aяк якщо б воно було null. Крім того, concat()метод приймає лише Stringзначення, тоді як +оператор мовчки перетворює аргумент у String (використовуючи toString()метод для об'єктів). Тож concat()метод суворіший у тому, що він приймає.
Щоб заглянути під капот, напишіть простий клас с a += b;
public class Concat {
String cat(String a, String b) {
a += b;
return a;
}
}
Тепер розібрати з javap -c(включений у JDK Sun). Ви повинні побачити список, включаючи:
java.lang.String cat(java.lang.String, java.lang.String);
Code:
0: new #2; //class java/lang/StringBuilder
3: dup
4: invokespecial #3; //Method java/lang/StringBuilder."<init>":()V
7: aload_1
8: invokevirtual #4; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
11: aload_2
12: invokevirtual #4; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
15: invokevirtual #5; //Method java/lang/StringBuilder.toString:()Ljava/lang/ String;
18: astore_1
19: aload_1
20: areturn
Отже, a += bє еквівалентом
a = new StringBuilder()
.append(a)
.append(b)
.toString();
concatМетод повинен бути швидше. Однак із більшою кількістю рядків StringBuilderметод виграє, принаймні, з точки зору продуктивності.
Вихідний код Stringі StringBuilder(та його базовий клас-приватний пакет) доступний у src.zip програми Sun JDK. Ви можете бачити, що ви створюєте масив char (змінюючи розмір за необхідності), а потім викидаєте його під час створення фіналу String. На практиці розподіл пам’яті напрочуд швидко.
Оновлення: Як зазначає Павло Адамський, продуктивність змінилася в останніх HotSpot. javacяк і раніше виробляє абсолютно той самий код, але компілятор байт-кодів обманює. Просте тестування повністю не дає змоги, оскільки все тіло коду викидається. Підсумовування System.identityHashCode(не String.hashCode) показує, що StringBufferкод має невелику перевагу. Підлягає зміні під час випуску наступного оновлення або використання іншого JVM. З @lukaseder , список HotSpot JVM вбудованих функцій .