We all know that using StringBuffer to perform String concatenations is far more efficient than conctenating strings using the '+' operator. Since JDK 1.5 a new class called StringBuilder has been added. StringBuilder is just like StringBuffer, except that it's methods are not synchronized. You should use StringBuilder to improve your performance if you do not need thread safety.
Shown below is an example that concatanates 10000 strings using the '+' operator, StringBuffer, and StringBuilder, and prints the operation time in nanoseconds. The ability to get time in nanoseconds is another feature that was added in JDK 1.5.
package biz.adaptivesoftware.examples.string; public class StringConcatanations { public static final int MAX_ITER = 10000; public static void main(String[] args) { concatenate(); concatenateWithStringBuffer(); concatenateWithStringBuilder(); } public static void concatenate() { System.out.println("Concatanating using the + operator"); String s1 = ""; long s1Time = getNanoTime(); for(int i=0;i<MAX_ITER;i++) { s1 = s1 + "abc"; } long e1Time = getNanoTime(); System.out.println("Time: " + (e1Time - s1Time)); } public static void concatenateWithStringBuffer() { System.out.println("Concatanating using StringBuffer"); StringBuffer sb = new StringBuffer(); long s2Time = getNanoTime(); for(int i=0;i<MAX_ITER;i++) { sb.append("abc"); } long e2Time = getNanoTime(); System.out.println("Time: " + (e2Time - s2Time)); } public static void concatenateWithStringBuilder() { System.out.println("Concatanating using StringBuilder"); StringBuilder sBuilder = new StringBuilder(); long s3Time = getNanoTime(); for(int i=0;i<MAX_ITER;i++) { sBuilder.append("abc"); } long e3Time = getNanoTime(); System.out.println("Time: " + (e3Time - s3Time)); } public static long getNanoTime() { return System.nanoTime(); } } |
Output:
Concatanating using the + operator Time: 744597428 Concatanating using StringBuffer Time: 1685131 Concatanating using StringBuilder Time: 1317206 |
Java2html |
As you can see, if you do not need thread safety, StringBuilder yeilds the best result, followed by Stringuffer, followed by the '+' operator. However, if you do need thread safety, then StringBuffer is your natural choice.
Recommended Books:
Notes: This text was originally posted on my earlier blog at http://www.adaptivelearningonline.net
Comments
Here are my new results (although this was done in groovy).
Time: 416136305
Time: 396484439
Time: 385318754
I think this just goes to show that there are cases (such as single appends) when using + may be just as fast and more readable. However, if you are going to be using for loops then I think you are correct here.
Jackie
public class StringConcatanations {
public static final int MAX_ITER = 100000;
public static void main(String[] args) {
Long start = 0
MAX_ITER.times{
start += concatenate();
}
println("Time: " + start);
start = 0
MAX_ITER.times{
start += concatenateWithStringBuffer();
}
println("Time: " + start);
start = 0
MAX_ITER.times
{
start += concatenateWithStringBuilder()
}
println("Time: " + start);
}
public static Long concatenate() {
String s1 = "";
Long s1Time = getNanoTime();
s1 = s1 + "abc";
Long e1Time = getNanoTime();
return (e1Time - s1Time);
}
public static Long concatenateWithStringBuffer() {
StringBuffer sb = new StringBuffer();
long s2Time = getNanoTime();
sb.append("abc");
String returnValue = sb.toString()
long e2Time = getNanoTime();
return e2Time - s2Time;
}
public static Long concatenateWithStringBuilder() {
//System.out.println("Concatanating using StringBuilder");
StringBuilder sBuilder = new StringBuilder();
Long s3Time = getNanoTime();
sBuilder.append("abc");
String returnValue = sBuilder.toString()
Long e3Time = getNanoTime();
return (e3Time - s3Time);
}
public static long getNanoTime() {
return System.nanoTime();
}
}
That's a nice example. I wonder if Groovy uses StringBuffer internally for concatening String (even when the + operator is used).
--
Regards
Parag
source: Difference among String vs StringBuffer vs StringBuilder