字符串常用的操作就是拼接,特别是SQL语句的拼接。
做了个简单的试验,它们之间的差别惊人!
StringBuffer:
1 public void testStringBuffer() { 2 long start = System.currentTimeMillis(); 3 StringBuffer sb = new StringBuffer(); 4 5 for (int i = 0; i < COUNT; i++) { 6 sb.append(STR_INIT); 7 } 8 long end = System.currentTimeMillis(); 9 10 System.out.println("StringBuffer 耗时:" + (end - start)); 11 }
运行结果:基本在50毫秒
StringBuilder:
1 public void testStringBuilder() { 2 long start = System.currentTimeMillis(); 3 StringBuilder sb = new StringBuilder(); 4 5 for (int i = 0; i < COUNT; i++) { 6 sb.append(STR_INIT); 7 } 8 long end = System.currentTimeMillis(); 9 10 System.out.println("StringBuilder 耗时:" + (end - start)); 11 }
运行结果:平均50毫秒,最低30多毫秒,最高90多毫秒
String:
1 public void testString() { 2 long start = System.currentTimeMillis(); 3 String s = ""; 4 5 for (int i = 0; i < COUNT; i ++) { 6 s += STR_INIT; 7 } 8 9 long end = System.currentTimeMillis(); 10 11 System.out.println("Str 耗时:" + (end - start)); 12 }
运行结果:2分多钟(是StringBuffer,StringBilder的上千倍)
代码说明:
for循环的次数(COUNT)为 10000
StringBuffer和StringBuilder的区别:
StringBuffer——线程安全的
StringBuilder——非线程安全
JDK API建议:如果不涉及线程问题,建议使用StringBuilder
个人建议:当需要字符串做拼接时,使用StringBuilder吧!
UPDATE:2016-5-23
重新学习发现内存也是可以计算的。
内存的差别倒是不大,跟时间比起来,可以忽略不计了。
详细代码请参考:Github 。