Non, pas tout à fait.
Premièrement, il y a une légère différence de sémantique. Si aest null, a.concat(b)lance alors un NullPointerExceptionmais a+=btraitera la valeur d'origine de acomme si elle l'était null. De plus, la concat()méthode accepte uniquement les Stringvaleurs tandis que l' +opérateur convertit silencieusement l'argument en chaîne (en utilisant la toString()méthode pour les objets). Alors leconcat() méthode est donc plus stricte dans ce qu'elle accepte.
Pour regarder sous le capot, écrivez un cours simple avec a += b;
public class Concat {
String cat(String a, String b) {
a += b;
return a;
}
}
Désassemblez maintenant avec javap -c(inclus dans le Sun JDK). Vous devriez voir une liste comprenant:
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
Donc, a += best l'équivalent de
a = new StringBuilder()
.append(a)
.append(b)
.toString();
La concatméthode devrait être plus rapide. Cependant, avec plus de chaînes, la StringBuilderméthode gagne, au moins en termes de performances.
Le code source de Stringet StringBuilder(et sa classe de base package-private) est disponible dans src.zip du Sun JDK. Vous pouvez voir que vous créez un tableau de caractères (redimensionnant si nécessaire), puis le jetez lorsque vous créez la finale String. Dans la pratique, l'allocation de mémoire est étonnamment rapide.
Mise à jour: Comme le note Pawel Adamski, les performances ont changé dans le HotSpot plus récent. javacproduit toujours exactement le même code, mais le compilateur de bytecode triche. Les tests simples échouent complètement car le corps entier du code est jeté. La somme System.identityHashCode(non String.hashCode) montre que le StringBuffercode a un léger avantage. Sous réserve de modifications lors de la publication de la prochaine mise à jour ou si vous utilisez une autre machine virtuelle Java. De @lukaseder , une liste des éléments intrinsèques de la JVM HotSpot .