Les voies normales seraient Integer.toString(i)ou String.valueOf(i).
La concaténation fonctionnera, mais elle n'est pas conventionnelle et pourrait être une mauvaise odeur car elle suggère que l'auteur ne connaît pas les deux méthodes ci-dessus (quoi d'autre pourraient-ils ne pas savoir?).
Java a un support spécial pour l'opérateur + lorsqu'il est utilisé avec des chaînes (voir la documentation ) qui traduit le code que vous avez publié en:
StringBuilder sb = new StringBuilder();
sb.append("");
sb.append(i);
String strI = sb.toString();
au moment de la compilation. C'est un peu moins efficace ( sb.append()finit par appeler Integer.getChars(), ce qui Integer.toString()aurait fait de toute façon), mais ça marche.
Pour répondre à un commentaire de Grodriguez: ** Non, le compilateur n'optimiser la chaîne vide dans ce cas - regard:
simon@lucifer:~$ cat TestClass.java
public class TestClass {
public static void main(String[] args) {
int i = 5;
String strI = "" + i;
}
}
simon@lucifer:~$ javac TestClass.java && javap -c TestClass
Compiled from "TestClass.java"
public class TestClass extends java.lang.Object{
public TestClass();
Code:
0: aload_0
1: invokespecial #1; //Method java/lang/Object."<init>":()V
4: return
public static void main(java.lang.String[]);
Code:
0: iconst_5
1: istore_1
Initialisez le StringBuilder:
2: new #2; //class java/lang/StringBuilder
5: dup
6: invokespecial #3; //Method java/lang/StringBuilder."<init>":()V
Ajoutez la chaîne vide:
9: ldc #4; //String
11: invokevirtual #5; //Method java/lang/StringBuilder.append:
(Ljava/lang/String;)Ljava/lang/StringBuilder;
Ajoutez l'entier:
14: iload_1
15: invokevirtual #6; //Method java/lang/StringBuilder.append:
(I)Ljava/lang/StringBuilder;
Extrayez la chaîne finale:
18: invokevirtual #7; //Method java/lang/StringBuilder.toString:
()Ljava/lang/String;
21: astore_2
22: return
}
Il y a une proposition et des travaux en cours pour changer ce comportement, ciblés pour JDK 9.