АРХИВ ПО ТЭГУ "JVM"
НОЯБРЬ 19, 2014

Hi,

Very interesting thing: Java compiler generate pretty clever code when you operate with strings, i.e. when you concatenate two or more Strings JVM creates StringBuilder transparently to a programmer and concatenates passed strings using that builder object and only then assigns the value to resulting string.

So typical interview question «What is more efficient for concatenating strings: ‘plus’ operator on strings or using StringBuilder class?» you can simply answer «both ways are efficient, and actually almost the same». Let’s do some disassembling now to make sure. I was using both Java 1.6 and Java 1.7 to test my statement.

  1. class Str{
  2.   public static void main(String[] args) {
  3.     String s = "first";
  4.     int i = 5;
  5.     String s2 = "second";
  6.  
  7.     String res = s + i + " " + s2;
  8.  
  9.     System.out.println(res);
  10.   }
  11. }

And now bytecode generated using javac (Java 1.7):

Compiled from «Str.java»
  1. class Str {
  2.   Str();
  3.     Code:
  4.        0: aload_0      
  5.        1: invokespecial #1                  // Method java/lang/Object."":()V
  6.        4: return        
  7.  
  8.   public static void main(java.lang.String[]);
  9.     Code:
  10.        0: ldc           #2                  // String first
  11.        2: astore_1      
  12.        3: iconst_5      
  13.        4: istore_2      
  14.        5: ldc           #3                  // String second
  15.        7: astore_3      
  16.        8: new           #4                  // class java/lang/StringBuilder
  17.       11: dup          
  18.       12: invokespecial #5                  // Method java/lang/StringBuilder."":()V
  19.       15: aload_1      
  20.       16: invokevirtual #6                  // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
  21.       19: iload_2      
  22.       20: invokevirtual #7                  // Method java/lang/StringBuilder.append:(I)Ljava/lang/StringBuilder;
  23.       23: ldc           #8                  // String  
  24.       25: invokevirtual #6                  // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
  25.       28: aload_3      
  26.       29: invokevirtual #6                  // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
  27.       32: invokevirtual #9                  // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
  28.       35: astore        4
  29.       37: getstatic     #10                 // Field java/lang/System.out:Ljava/io/PrintStream;
  30.       40: aload         4
  31.       42: invokevirtual #11                 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
  32.       45: return        
  33. }