StringBuilder效率高,线程不安全
StringBuffer效率相对StringBuilder较低,线程安全
多线程中StringBuilder执行.insert(index,*);方法可能会出错
测试代码
public static class TestRunable implements Runnable
{
private int num=0;
private StringBuffer sBuffer;
private StringBuilder stringBuilder;
private Random random;
public TestRunable(int i,StringBuffer sBuffer,StringBuilder stringBuilder) {
num=i;
this.sBuffer=sBuffer;
this.stringBuilder=stringBuilder;
random=new Random();
}
@Override
public void run() {
// TODO Auto-generated method stub
try {
Thread.sleep(random.nextInt(5)+5);
sBuffer.append(num+"\t");
sBuffer.insert(num-1,num);
stringBuilder.append(num+"\t");
stringBuilder.insert(num-1,num);
System.out.println("----------------线程"+num+"执行中----------------");
System.out.println("sBuffer="+sBuffer);
System.out.println("stringBuilder="+stringBuilder);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
//测试代码如下
StringBuffer sBuffer=new StringBuffer();
StringBuilder stringBuilder=new StringBuilder();
Random random=new Random();
Thread[] ts=new Thread[20];
for(int i=0;i<ts.length;i++)
{
ts[i]=new Thread(new TestRunable(i+1, sBuffer, stringBuilder));
ts[i].start();
}
分析
不同之处StringBuffer的所有方法都加了同步标识: