Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

String Concatenation and Autoboxing in Java

When you concatenate a String with a primitive such as int, does it autobox the value first.

ex.

String string = "Four" + 4;

How does it convert the value to a string in Java?

like image 907
rubixibuc Avatar asked Sep 16 '12 07:09

rubixibuc


1 Answers

To see what the Java compiler produces it is always useful to use javap -c to show the actual bytecode produced:

For example the following Java code:

String s1 = "Four" + 4;
int i = 4;
String s2 = "Four" + i;

would produce the following bytecode:

   0:   ldc     #2; //String Four4
   2:   astore_1
   3:   iconst_4
   4:   istore_2
   5:   new     #3; //class java/lang/StringBuilder
   8:   dup
   9:   invokespecial   #4; //Method java/lang/StringBuilder."<init>":()V
   12:  ldc     #5; //String Four
   14:  invokevirtual   #6; //Method java/lang/StringBuilder.append:(Ljava/lang/
String;)Ljava/lang/StringBuilder;
   17:  iload_2
   18:  invokevirtual   #7; //Method java/lang/StringBuilder.append:(I)Ljava/lan
g/StringBuilder;
   21:  invokevirtual   #8; //Method java/lang/StringBuilder.toString:()Ljava/la
ng/String;
   24:  astore_3
   25:  return

From this we can see:

  • In the case of "Four" + 4, the Java compiler (I was using JDK 6) was clever enough to deduce that this is a constant, so there is no computational effort at runtime, as the string is concatenated at compile time
  • In the case of "Four" + i, the equivalent code is new StringBuilder().append("Four").append(i).toString()
  • Autoboxing is not involved here as there is an StringBuilder.append(int) method which according to the docs is using String.valueOf(int) to create the string representation of the integer.
like image 55
beny23 Avatar answered Sep 22 '22 18:09

beny23