Zakładając ciąg a i b:
a += b
a = a.concat(b)
Pod maską, czy są to te same rzeczy?
Tutaj jest concat zdekompilowany jako odniesienie. Chciałbym być w stanie zdekompilować operatora +
, aby zobaczyć, co to robi.
public String concat(String s) {
int i = s.length();
if (i == 0) {
return this;
}
else {
char ac[] = new char[count + i];
getChars(0, count, ac, 0);
s.getChars(0, i, ac, count);
return new String(0, count + i, ac);
}
}
Niyaz jest poprawny, ale warto również zauważyć, że specjalny operator + może zostać przekształcony w coś bardziej wydajnego przez kompilator Javy. Java ma klasę StringBuilder, która reprezentuje niechroniony przed wątkami, mutowalny String. Podczas wykonywania kilku konkatenacji Stringów, kompilator Javy po cichu konwertuje
String a = b + c + d;
na
String a = new StringBuilder(b).append(c).append(d).toString();
co dla dużych ciągów jest znacznie bardziej wydajne. O ile mi wiadomo, nie dzieje się tak, gdy używasz metody concat.
Metoda concat jest jednak bardziej wydajna w przypadku konkatenacji pustego String na istniejący String. W tym przypadku JVM nie musi tworzyć nowego obiektu String i może po prostu zwrócić istniejący. Zobacz dokumentację metody concat, aby to potwierdzić.
Więc jeśli jesteś super-concerned o wydajności to powinieneś użyć metody concat podczas konkatenacji możliwie pustych Stringów, i użyć + w przeciwnym razie. Jednak różnica w wydajności powinna być pomijalna i prawdopodobnie nie powinieneś'nigdy się o to martwić.
Operator + może działać pomiędzy łańcuchem a wartością typu łańcuchowego, znakowego, całkowitego, podwójnego lub zmiennoprzecinkowego. Po prostu konwertuje on wartość na jej reprezentację łańcuchową przed konkatenacją.
Operator concat może być wykonywany tylko na łańcuchach i z łańcuchami. Sprawdza on zgodność typów danych i wyrzuca błąd, jeśli nie są one zgodne.
Z wyjątkiem tego, kod, który podałeś, robi te same rzeczy.
Nie wydaje mi się.
Operacja a.concat(b)
jest zaimplementowana w String i myślę, że jej implementacja nie zmieniła się zbytnio od czasów wczesnych maszyn java. Implementacja operacji +
zależy od wersji Javy i kompilatora. Obecnie +
jest zaimplementowane przy użyciu StringBuffer
aby operacja była tak szybka jak to tylko możliwe. Być może w przyszłości to się zmieni. We wcześniejszych wersjach javy +
operacje na Stringach były znacznie wolniejsze ponieważ dawały pośrednie wyniki.
Domyślam się, że +=
jest zaimplementowane przy użyciu +
i podobnie zoptymalizowane.