Hayır, pek değil.
İlk olarak, anlambilimde ufak bir fark vardır. Eğer a
bir null
, daha sonra a.concat(b)
bir atar NullPointerException
ama a+=b
orijinal değerini ele alacağız a
o sanki null
. Ayrıca, concat()
yöntem yalnızca String
değerleri kabul ederken, +
operatör bağımsız değişkeni sessizce bir String'e dönüştürür ( toString()
nesneler için yöntemi kullanarak ). Dolayısıyla concat()
yöntem, kabul ettiği şeyde daha katıdır.
Kaputun altına bakmak için, a += b;
public class Concat {
String cat(String a, String b) {
a += b;
return a;
}
}
Şimdi ile sökün javap -c
(Sun JDK'ya dahil). Aşağıdakileri içeren bir giriş görmelisiniz:
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
Yani, a += b
eşdeğeri
a = new StringBuilder()
.append(a)
.append(b)
.toString();
concat
Yöntemi daha hızlı olmalıdır. Ancak, daha fazla dizeyle StringBuilder
yöntem en azından performans açısından kazanır.
String
Ve StringBuilder
(ve paket-özel taban sınıfının) kaynak kodu Sun JDK'nın src.zip dosyasında bulunur. Bir char dizisi oluşturduğunuzu (gerekirse yeniden boyutlandırdığınızı) ve ardından finali oluşturduğunuzda attığınızı görebilirsiniz String
. Pratikte bellek tahsisi şaşırtıcı derecede hızlıdır.
Güncelleme: Pawel Adamski'nin belirttiği gibi, daha yeni HotSpot'ta performans değişti. javac
hala tam olarak aynı kodu üretir, ancak bytecode derleyicisi hile yapar. Tüm kod gövdesi atıldığından basit testler tamamen başarısız olur. Toplama System.identityHashCode
(değil String.hashCode
), StringBuffer
kodun hafif bir avantajı olduğunu gösterir. Bir sonraki güncelleme yayınlandığında veya farklı bir JVM kullanıyorsanız değişebilir. Gönderen @lukaseder , HotSpot JVM intrinsics listesi .