I am dealing with an application that contains lots of legacy code.
What I see very often is string concatenation using “+” within a StringBuilder argument.
Example:
StringBuilder sb = new StringBuilder("This "
+ "looks "
+ "rather "
+ "weird "
+ "to "
+ "me.")
From what I’ve learned the compiler replaces a string concatenation that uses the + operator with StringBuilder().append().
I am afraid now the compiler will create a temporary StringBuilder to perform the concatenation then convert toString() and insert the result into the existing StringBuilder.
My Question is: Is the compiler able to optimize the nested StringBuilder away? And if not should I rewrite the code to save a few CPU cycles? It is obviously working but it hurts my eyes whenever I look at it.
Thanks for any insights!
Advertisement
Answer
The compiler optimizes concatenation of String literal constants:
StringBuilder sb = new StringBuilder("This "
+ "looks "
+ "rather "
+ "weird "
+ "to "
+ "me.");
is exactly equivalent, at runtime, to:
StringBuilder sb = new StringBuilder("This looks rather weird to me.");
This also applies to any String compile-time constants, not just literals.
The concern you may have read about is when using non-constants:
StringBuilder sb = new StringBuilder("This "
+ arg1
+ var2);
is equivalent to:
StringBuilder sb = new StringBuilder(new StringBuilder("This ")
.append(arg1)
.append(var2)
.toString());
and it would give you better performance if you re-wrote that as:
StringBuilder sb = new StringBuilder("This ")
.append(arg1)
.append(var2);