Java String Optimization

How many lines does this create?

String test(String text) { return "string 1 " + text + " string 2 " + "string 3"; } 
+4
source share
4 answers

There are no new String calls here, the only one of which exists in StringBuilder.toString, therefore

1

 java.lang.String test(java.lang.String); Code: Stack=3, Locals=2, Args_size=2 0: new #16; //class java/lang/StringBuilder 3: dup 4: ldc #18; //String string 1 6: invokespecial #20; //Method java/lang/StringBuilder."<init>":(Ljava/lang/String;)V 9: aload_1 10: invokevirtual #23; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; 13: ldc #27; //String string 2 15: invokevirtual #23; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; 18: ldc #29; //String string 3 20: invokevirtual #23; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; 23: invokevirtual #31; //Method java/lang/StringBuilder.toString:()Ljava/lang/String; 26: areturn 
+6
source

It is quite easy to answer by compiling the code and then checking the bytecode with javap -c . In this particular case, the compiler should generate code like

 String result = new StringBuilder("string1"). append(text).append("string2").append("string3").toString(); 

therefore, depending on how you look at it, you can say only one, or if you are one of those people who like to consider literals β€œcreated” when they are used, you can say four.

+4
source

javap is your friend. I put your code in S.java and pulled it with javap -c S :

 Compiled from "S.java" public class S extends java.lang.Object{ public S(); Code: 0: aload_0 1: invokespecial #1; //Method java/lang/Object."<init>":()V 4: return public java.lang.String test(java.lang.String); Code: 0: new #2; //class java/lang/StringBuilder 3: dup 4: invokespecial #3; //Method java/lang/StringBuilder."<init>":()V 7: ldc #4; //String string 1 9: invokevirtual #5; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; 12: aload_1 13: invokevirtual #5; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; 16: ldc #6; //String string 2 18: invokevirtual #5; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; 21: ldc #7; //String string 3 23: invokevirtual #5; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; 26: invokevirtual #8; //Method java/lang/StringBuilder.toString:()Ljava/lang/String; 29: areturn } 

With OpenJDK 1.6.0_22, only one StringBuilder and one string are created.

+3
source

this is the equivalent

  (new StringBuilder((new StringBuilder((new StringBuilder("String 1")).append(text).toString())).append("string 2 ").toString()).append("string 3").toString(); 

that 3 string constructions and 6 lines. Optimization Method:

  StringBuilder sb = new StringBuilder("string 1"); sb.append(test); sb.append(" string 2 "); sb.append("string 3"); return sb.toString(); 
-1
source

All Articles