Java concat string in stringbuilder call

As far as I know, StringBuilder helps reduce memory usage by not creating temporary string instances in the string pool during concats. But, what happens if I do it like this:

StringBuilder sb = new StringBuilder("bu");
sb.append("b"+"u");

Will it compile in

sb.append("b");
sb.append("u");

? Or does it depend on optimization flags? Or will I lose all profit if string builders? Or does this question make no sense? :)

+4
source share
4 answers

It compiles in sb.append("bu")because the compiler translates the concatenation of multiple String litterals into one string litteral.

If you

String a = "a";
sb.append(a + "b");

he compiled it

String a = "a";
String temp = a + "b"; // useless creation of a string here
sb.append(temp);

So you should prefer

sb.append(a);
sb.append("b");

in this case.

+8
source

"b" + "u" - , , , "bu".

 0: new #2; //class StringBuilder
 3: dup
 4: ldc #3; //String bu
 6: invokespecial   #4; //Method StringBuilder."<init>":(String;)V
 9: astore_1
10: aload_1
11: ldc #3; //String bu
13: invokevirtual   #5; // StringBuilder.append:(String;)LStringBuilder;

, , , :

...

StringBuilder sb = new StringBuilder("bu");
String b = "b", u = "u";

sb.append(b + u);

... :

0:  new #2; //class StringBuilder
3:  dup
4:  ldc #3; //String bu
6:  invokespecial   #4; //Method StringBuilder."<init>":(String;)V
9:  astore_1
10: ldc #5; //String b
12: astore_2
13: ldc #6; //String u
15: astore_3
16: aload_1
17: new #2; //class StringBuilder
20: dup
21: invokespecial   #7; //Method StringBuilder."<init>":()V
24: aload_2
25: invokevirtual   #8; //Method StringBuilder.append:(String;)StringBuilder;
28: aload_3
29: invokevirtual   #8; //Method StringBuilder.append:(String;)StringBuilder;
32: invokevirtual   #9; //Method StringBuilder.toString:()String;
35: invokevirtual   #8; //Method StringBuilder.append:(String;)StringBuilder;

.. -

StringBuilder sb = new StringBuilder("bu");
String b = "b", u = "u";

StringBuilder temp = new StringBuilder();
temp.append(b);
temp.append(b);
String result = temp.toString();

sb.append(result);

17-21, StringBuilder a b. String StringBuilder 32 StringBuilder 35.


(- javap, JDK. , !)

+7

, "b" + "u" b, u, bu, StringBuilder.

0

:

StringBuilder sb = new StringBuilder();
sb.append("b"+"u");

:

StringBuilder sb = new StringBuilder();
sb.append("b").append("u");

BEST: // Since you knew that it would already be there !;)

StringBuilder sb = new StringBuilder();
sb.append("bu");

:)

EDIT

I think my answer above is incorrect when it comes only to literals ...

:/

-1
source

All Articles