String aaneenschakeling: concat() vs "+" operator

Uitgaande van String a en b:

a += b
a = a.concat(b)

Onder de motorkap, zijn ze hetzelfde?

Hier is concat gedecompileerd als referentie. Ik zou graag de + operator ook willen kunnen decompileren om te zien wat dat doet.

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 is correct, maar het'is ook de moeite waard om op te merken dat de speciale + operator door de Java compiler kan worden omgezet in iets efficiënters. Java heeft een StringBuilder klasse die een niet-thread-veilige, muteerbare String voorstelt. Wanneer een stel aaneenschakelingen van String worden uitgevoerd, converteert de Java compiler stilletjes

String a = b + c + d;

in

String a = new StringBuilder(b).append(c).append(d).toString();

wat voor grote strings aanzienlijk efficiënter is. Voor zover ik weet, gebeurt dit niet als je de concat methode gebruikt.

De concat methode is echter efficiënter bij het aaneenschakelen van een lege String op een bestaande String. In dat geval hoeft de JVM geen nieuw String object aan te maken en kan hij gewoon het bestaande object teruggeven. Zie de concat documentatie om dit te bevestigen.

Dus als je'erg bezorgd bent over efficiëntie dan zou je de concat methode moeten gebruiken wanneer je mogelijk-lege Strings aaneenschakelt, en anders + gebruiken. Het verschil in prestaties zou echter te verwaarlozen moeten zijn en je zou je hier waarschijnlijk nooit zorgen over moeten maken.

Commentaren (3)

De operator + kan werken tussen een string en een waarde van het gegevenstype string, char, integer, double of float. Hij converteert de waarde gewoon naar zijn string-representatie voor de concatenatie.

De operator concat kan alleen worden uitgevoerd op en met tekenreeksen. Hij controleert op compatibiliteit van het gegevenstype en geeft een foutmelding als ze niet overeenkomen.

Behalve dit, doet de code die je gaf dezelfde dingen.

Commentaren (0)

Ik denk het niet.

a.concat(b) is geïmplementeerd in String en ik denk dat de implementatie niet veel veranderd is sinds de vroege java machines. De + operatie implementatie hangt af van Java versie en compiler. Op dit moment is + geïmplementeerd met behulp van StringBuffer om de bewerking zo snel mogelijk te maken. Misschien zal dit in de toekomst veranderen. In eerdere versies van java was + bewerking op Strings veel langzamer omdat het tussenresultaten produceerde.

Ik vermoed dat += is geïmplementeerd met + en op dezelfde manier is geoptimaliseerd.

Commentaren (2)