Thursday, June 7, 2012

Sonar or FindBugs Critical issue: Performance - Method concatenates strings using + in a loop

This issue arises when there is a String being built in a concatenation loop.
For each iteration, the String is converted to a StringBuffer/StringBuilder, appended to, and converted back to a String. This can lead to a cost quadratic in the number of iterations, as the growing string is recopied in each iteration.

Better performance can be obtained by using a StringBuffer (or StringBuilder in Java 1.5) explicitly.

For example:


// This is bad
String s = "";
for (int i = 0; i < field.length; ++i) {
   s = s + field[i];
}


// This is better - StringBuffer is synchronized
StringBuffer buf = new StringBuffer();
for (int i = 0; i < field.length; ++i) {
   buf.append(field[i]);
}
String s = buf.toString();



//Even better - better performance if synchronization is not an issue
StringBuilder builder = new StringBuilder();

for (int i = 0; i < field.length; ++i) {
   builder.append(field[i]);
}
String s = builder.toString(); 

1 comment: