1、原理
StringBuffer、StringBuilder和String一样,也用来代表字符串。String类是不可变类,任何对String的改变都 会引发新的String对象的生成;StringBuffer则是可变类,任何对它所指代的字符串的改变都不会产生新的对象。
2、执行效率、线程安全
三者的原理和操作基本相同,区别在于StringBufferd支持并发操作,线性安全的,适 合多线程中使用。StringBuilder不支持并发操作,线性不安全的,不适合多线程中使用。新引入的StringBuilder类不是线程安全的,但其在单线程中的性能比StringBuffer高。
3、执行赋值效率代码测试:
public class StringTest {
public static String baseinfo="my";
public static final int count=2000000;
//String赋值测试
public static void doStringTest(){
String str=new String(baseinfo);
long startTime=System.currentTimeMillis();//循环执行前,获取系统当前时间
for(int i=0;i<count/100;i++){
str=str+"dopa";
}
long endTime=System.currentTimeMillis();//结束循环时,系统的当前时间
System.out.println("执行String赋值循环所花的时间"+(endTime-startTime));
}
//StringBuffer赋值测试
public static void doStringBufferTest(){
StringBuffer sb=new StringBuffer(baseinfo);
long startTime=System.currentTimeMillis();
for(int i=0;i<count;i++){
sb=sb.append("dopa");
}
long endTime=System.currentTimeMillis();
System.out.println("执行StringBuffer赋值循环所花的时间"+(endTime-startTime));
}
//StringBuilder赋值测试
public static void doStringBuilderTest(){
StringBuilder sb=new StringBuilder(baseinfo);
long startTime=System.currentTimeMillis();
for(int i=0;i<count;i++){
sb=sb.append("dopa");
}
long endTime=System.currentTimeMillis();
System.out.println("执行StringBuilder赋值循环所花的时间"+(endTime-startTime));
}
public static void main(String[] args) {
doStringTest();
doStringBufferTest();
doStringBuilderTest();
}
}
4、测试结果:
执行String赋值循环所花的时间705
执行StringBuffer赋值循环所花的时间55
执行StringBuilder赋值循环所花的时间20
测试结果单位都是毫秒,1毫秒(ms)=0.001秒(s)