Non, pas tout à fait.
Tout d'abord, il y a une légère différence de sémantique. Si a est nul, alors le concat()
mais la première traitera la valeur originale de a comme si elle était "null". En outre, la méthode concat()
n'accepte que la méthode String
tandis que les +
convertira silencieusement l'argument en String (en utilisant l'opérateur toString()
pour les objets). Ainsi, la concat()
est plus stricte dans ce qu'elle accepte.
Pour regarder sous le capot, écrivez une classe simple avec a += b ;
public class Concat {
String cat(String a, String b) {
a += b;
return a;
}
}
Maintenant désassemblez avec javap -c (inclus dans le Sun JDK). Vous devriez voir une liste incluant :
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 méthode concat devrait être plus rapide. Cependant, avec plus de chaînes, la méthode StringBuilder l'emporte, du moins en termes de performances.
Le code source de String et StringBuilder (et sa classe de base privée par paquetage) est disponible dans src.zip du Sun JDK. Vous pouvez voir que vous construisez un tableau de caractères (en le redimensionnant si nécessaire), puis que vous le jetez lorsque vous créez la chaîne finale. En pratique, l'allocation de mémoire est étonnamment rapide.