@[TOC]String StringBuilder StringBuffer 速度 线程安全性验证
速度验证
时间 花费String+> String concat> StringBuilder~StringBuffer
源代码
public static String getStringRendom(int length)
{
return RandomStringUtils.randomAlphanumeric(length);
}
public static void main(String[] args) throws InterruptedException {
String s = "";
StringBuilder sb = new StringBuilder();
StringBuffer sbf = new StringBuffer();
Random r = new Random();
LinkedList<String> src=new LinkedList<String>();
//随机产生100000个字符串
for(int i=0;i<=100000;i++)
{
src.add(getStringRendom(r.nextInt(10)));
}
long st1=System.currentTimeMillis();
//验证+拼接速度
for(String st:src)
{
s=s+st;
}
long st2=System.currentTimeMillis();
System.out.println("String+:"+(st2-st1));
s="";
//验证concat 速度
for(String st:src)
{
s=s.concat(st);
}
long st3=System.currentTimeMillis();
System.out.println("Stringconcat:"+(st3-st2));
//验证StringBuilder速度
for(String st:src)
{
sb.append(st);
}
long st4=System.currentTimeMillis();
System.out.println("StringBuilder:"+(st4-st3));
//验证StringBuffer速度
for(String st:src)
{
sbf.append(st);
}
long st5=System.currentTimeMillis();
System.out.println("StringBuffer:"+(st5-st4));
}
结果
String+:11406
Stringconcat:6051
StringBuilder:8
StringBuffer:7
线程安全验证
StringBuffer 线程安全,StringBuilder 线程不安全
源代码
public static void main(String[] args) throws InterruptedException {
long startTime = System.currentTimeMillis();
String strToReverse = "AAAABBBB";
StringBuffer stringBuffer = new StringBuffer(strToReverse);
StringBuilder stringBuilder = new StringBuilder(strToReverse);
//每个方法启动10000个线程,验证线程安全
for(int i=0; i<10000; i++) {
new StringBuilderTaskThread(stringBuilder).start();
new StringBufferTaskThread(stringBuffer).start();
}
try {
//等待所有线程结束
Thread.sleep(30000);
//输出 验证结果
System.out.println("StringBuffer toString: " + stringBuffer.toString());
System.out.println("StringBuilder toString: " + stringBuilder.toString());
long endTime = System.currentTimeMillis();
System.out.println("Running time: " + (endTime-startTime));
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
class StringBufferTaskThread extends Thread {
private StringBuffer s = null;
public StringBufferTaskThread(StringBuffer stringBuffer) {
super();
this.s = stringBuffer;
}
@Override
public void run() {
for(int i=0; i<10; i++) {
try {
Thread.sleep(200);
s.reverse();
Thread.sleep(200);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
class StringBuilderTaskThread extends Thread {
private StringBuilder s = null;
public StringBuilderTaskThread(StringBuilder stringBuilder) {
super();
this.s = stringBuilder;
}
@Override
public void run() {
for(int i=0; i<10; i++) {
try {
Thread.sleep(200);
s.reverse();
Thread.sleep(200);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
结果
StringBuffer toString: AAAABBBB
StringBuilder toString: BABAABAB
Running time: 33056