Non, pas tout à fait.
Premièrement, il y a une légère différence de sémantique. Si a
est null
, a.concat(b)
lance alors un NullPointerException
mais a+=b
traitera la valeur d'origine de a
comme si elle l'était null
. De plus, la concat()
méthode accepte uniquement les String
valeurs 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 += b
est l'équivalent de
a = new StringBuilder()
.append(a)
.append(b)
.toString();
La concat
méthode devrait être plus rapide. Cependant, avec plus de chaînes, la StringBuilder
méthode gagne, au moins en termes de performances.
Le code source de String
et 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. javac
produit 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 StringBuffer
code 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 .