Więcej
Łączenie ciągów: concat() vs "+" operator
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);
}
}
475
3
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
na
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życiuStringBuffer
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.