StringBuffer.append比String加号好在那里?
转载自:http://www.4ucode.com/Study/Topic/1161684
网上的JAVA面试题经常有两个String 字符串相加没有 StringBuffer.append();速度高
但是很少有说明原因的。
所以自己做了个小测试
源代码1 
public class TestMain {
public static void main(String[] args) { 
String test1="测试测试1"; 
String test2="测试测试2"; 
String test3=test1+test2; 
System.out.println(test3);    
} 
}
结果编译后的class 然后再反编译 发现 代码已经被默认优化成
import java.io.PrintStream;    
public class TestMain 
{ 
public static void main(String args[]) 
{ 
String test1 = "测试测试1"; 
String test2 = "测试测试2"; 
String test3 = (new StringBuilder(String.valueOf(test1))).append(test2).toString(); 
System.out.println(test3); 
} 
}
源代码2
public static void main(String[] args) {  
String test1="测试测试1"; 
String test2="测试测试2"; 
StringBuffer test3=new StringBuffer(); 
test3.append(test1); 
test3.append(test2); 
System.out.println(test3);    
}
先编译再反编译 
的结果跟以前一样
结果: 
很明显 连个字符串 相加 最后都优化成了  StringBuilder的.append(); 
查了一下源代码 
StringBuilder 类 和  StringBuffer 类都 继承于 AbstractStringBuilder
public final class StringBuffer 
extends AbstractStringBuilder 
implements java.io.Serializable, CharSequence
{ 
public synchronized StringBuffer append(String str) { 
super.append(str); 
return this; 
} 
}
public final class StringBuilder 
extends AbstractStringBuilder 
implements java.io.Serializable, CharSequence 
{ 
public StringBuilder append(String str) { 
super.append(str); 
return this; 
}
}
 
而且都是调用AbstractStringBuilder 
的 
public AbstractStringBuilder append(String str) { 
if (str == null) str = "null"; 
int len = str.length(); 
if (len == 0) return this; 
int newCount = count + len; 
if (newCount > value.length) 
expandCapacity(newCount); 
str.getChars(0, len, value, count); 
count = newCount; 
return this; 
}
方法
经过以上得到以下结论: 
所以 如果用加号相加两个字符串  比用StringBuffer.append() 方法多创建对象而且没有append线程安全。
拼串频繁的方法建议参考以下实例:
StringBuffer buffer = new StringBuffer();
buffer.append(" 字段 like '%$").append(变量名).append("$%' ");
sql = sql + " where aaa.domainId=" + domainId + " and (" + where;
个人测试代码:
   String str = "";
       log.info("date--1---"+new Date());
       for(int j=1;j<=10000;j++){
        str = str + Integer.toString(j);
       }
       log.info("str.length()-----"+str.length());
       log.info("date---2--"+new Date());
       
       log.info("date---1--"+new Date());
       StringBuffer bf = new StringBuffer();
       for(int j=1;j<=10000;j++){
        bf.append(Integer.toString(j));
       }
       log.info("bf.length()-----"+bf.length());
       log.info("date---2--"+new Date());
结果:
date--1---Thu Mar 29 10:09:54 CST 2012
str.length()-----41001
date---2--Thu Mar 29 10:09:55 CST 2012
date---1--Thu Mar 29 10:09:55 CST 2012
bf.length()-----41001
date---2--Thu Mar 29 10:09:55 CST 2012
总结:在使用最简单的拼接字符串时,当字符串的最终length达到30000-40000级差别明显到秒级,建议在复杂sql拼接都使用StringBuffer.append("").
posted on 2012-03-20 15:38 anuo_ruibo 阅读(496) 评论(0) 收藏 举报
 
                    
                 
                
            
         
 浙公网安备 33010602011771号
浙公网安备 33010602011771号