Ні, не зовсім.
По-перше, є незначна різниця в семантиці. Якщо 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 вбудованих функцій .