String 不可变字符序列。String长度是不可变,主要适用操作少量数据。
StringBuffer 线程安全的可变字符序列。StringBuffer源代码中很多方法都被关键字synchronized 修饰了,synchronized这个关键字是为线程同步机制 设定的。由此我们可以看出,StringBuffer线程安全,适用多线程操作字符串缓冲区下操作大量数据。
StringBuilder 非线程安全的可变字符序列 。StringBuffer在JDK1.5新引入,其前身就是StringBuffer,StringBuilder的效率比StringBuffer稍高。在不考虑线程安全,单线程操作字符串缓冲区下操作大量数据StringBuffer是首选。
String 、StringBuffer 、 StringBuilder速度测试
定义三个方法,方法中分别定义String、StringBuffer、StringBuilder对象。创建前获取当前时间,创建对象后循环10000次改变改变值变化,循环结束获取当前时间再与之前获取时间相差。
/**
* 计算StringBuffer耗时
*/
public static void stringBufferRunTime(){
long begin=System.currentTimeMillis();
StringBuffer stringBuffer=new StringBuffer();
for (int i = 0; i < 10000; i++) {
stringBuffer.append(i+"StringBuffer");
}
long end=System.currentTimeMillis();
System.out.println("StringBuffer耗时:"+(end-begin));
}
/**
* 计算StringBuilder耗时
*/
public static void stringBuilderRunTime(){
long begin=System.currentTimeMillis();
StringBuilder stringBuilder=new StringBuilder();
for (int i = 0; i < 10000; i++) {
stringBuilder.append(i+"StringBuilder");
}
long end=System.currentTimeMillis();
System.out.println("StringBuilder耗时:"+(end-begin));
}
/**
* 计算String耗时
*/
public static void stringRunTime(){
long begin=System.currentTimeMillis();
String str=null;
for (int i = 0; i < 10000; i++) {
String ss=i+"StringBuilder";
str=str+ss;
}
long end=System.currentTimeMillis();
System.out.println("String耗时:"+(end-begin));
}
public static void main(String[] args) {
//测试
stringBufferRunTime();
stringBuilderRunTime();
stringRunTime();
}
结果如下图:
结论:StringBuilder>StringBuffer>String