51 votes

String valueOf vs concaténation avec une chaîne vide

Je travaille dans l'optimisation de code Java. Je ne suis pas clair sur la différence entre String.valueOf ou le signe +""

 int intVar = 1;
String strVar = intVar + "";
String strVar = String.valueOf(intVar);

Quelle est la différence entre les lignes 2 et 3 ?

64voto

Jigar Joshi Points 116533
public void foo(){
int intVar = 5;
String strVar = intVar+"";    
}

Cette approche utilise StringBuilder pour créer la chaîne résultante

 public void foo();
  Code:
   0:   iconst_5
   1:   istore_1
   2:   new     #2; //class java/lang/StringBuilder
   5:   dup
   6:   invokespecial   #3; //Method java/lang/StringBuilder."<init>":()V
   9:   iload_1
   10:  invokevirtual   #4; //Method java/lang/StringBuilder.append:(I)Ljava/lan
g/StringBuilder;
   13:  ldc     #5; //String
   15:  invokevirtual   #6; //Method java/lang/StringBuilder.append:(Ljava/lang/
String;)Ljava/lang/StringBuilder;
   18:  invokevirtual   #7; //Method java/lang/StringBuilder.toString:()Ljava/la
ng/String;
   21:  astore_2
   22:  return

 public void bar(){
int intVar = 5;
String strVar = String.valueOf(intVar);
}

Cette approche invoque simplement une méthode statique de String pour obtenir la version String de int

 public void bar();
  Code:
   0:   iconst_5
   1:   istore_1
   2:   iload_1
   3:   invokestatic    #8; //Method java/lang/String.valueOf:(I)Ljava/lang/Stri
ng;
   6:   astore_2
   7:   return

qui à son tour appelle Integer.toString()

9voto

duffymo Points 188155

Je préférerais valueOf() , car je pense que c'est plus lisible et explicite.

Toutes les préoccupations concernant les performances sont des micro-optimisations qui ne seraient pas mesurables. Je ne m'inquiéterais pas pour eux jusqu'à ce que je puisse prendre une mesure et voir qu'ils ont fait une différence.

4voto

Thilo Points 108673

La première ligne équivaut à

 String strVal = String.valueOf(intVar) + "";

de sorte qu'il y a un travail supplémentaire (et inutile) à faire. Je ne sais pas si le compilateur optimise les concaténations avec des littéraux de chaîne vides. Si ce n'est pas le cas (et en regardant la réponse de @Jigar, ce n'est apparemment pas le cas), cela deviendra à son tour

 String strVal = new StringBuilder().append(String.valueOf(intVar))
                      .append("").toString();

Donc, vous devriez vraiment utiliser directement String.valueOf.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X