Łą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);
    }
}

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ć.

Komentarze (3)

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.

Komentarze (0)

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.

Komentarze (2)