· 首先要知道它们的作用主要是为了保存字符串(他们的区别也主要体现在这),比起string 的提供的各种操作,前两者主要优势则是体现在速度上(底下附实例验证)。
记住几个重要知识点
· 速度上 StringBuilder>StringBuffer>String (前两个速度很接近,但速度远超string)
· StringBuilder 线程不安全,推荐使用,但是多线程考虑到同步使用下者
· StringBuffer是用于线程安全的,如果需要同步才考虑它
产生速度差别的原因:
· String abc="def";
生成的abc对象其实是个常量,一旦创建无法更改。
· abc=abc+"aaa";
而这种给字符串重新赋值的方式,看似改变了对象,其本质是给新生成的字符串在存储区重新分配别的空间,也就是系统重新建立了abc对象,如果频繁改变字符串则就生成很多无用的对象。
重点是String每次改变字符串的时候,而且在jvm中,程序自动创建了StringBuilder,并利用它为你重新生成String,因此直接用StringBuilder相当于主动减少了改变字符串要经历的环节。
· StringBuilder之所以比StringBuffer快一点,因为他是不支持同步的。
速度验证(java):
import java.util.Random;
public class StringBuilderTest {
// 以下三个函数遵照同一种方式生成等长字符串,比较他们的速度
public String toStringTest() { // 生成String对象字符串
Random rand = new Random(50);
String result;
result = "[";
for (int i = 0; i < 25000; i++) {//注意这与其他两个函数循环次数不同
result = result + rand.nextInt(100) + ",";
}
result.substring(0, result.length() - 1);
result += "]";
return result;
}
public String toStringTest1() {// 生成StringBuilder对象字符串
Random rand = new Random(50);
StringBuilder result = new StringBuilder("[");
for (int i = 0; i < 250000; i++) {
result.append(rand.nextInt(100));
result.append(",");
}
result.delete(result.length() - 2, result.length());
result.append("]");
return result.toString();
}
public String toStringTest2() {// 生成StringBuffer对象字符串
Random rand = new Random(50);
StringBuffer result = new StringBuffer("[");
for (int i = 0; i < 250000; i++) {
result.append(rand.nextInt(100));
result.append(",");
}
result.delete(result.length() - 2, result.length());
result.append("]");
return result.toString();
}
public static void main(String[] args) {
long start = System.currentTimeMillis();
StringBuilderTest test = new StringBuilderTest();
System.out.println(test.toStringTest());//分别调用他们,算出运行时间
System.out.println("用时: " + (System.currentTimeMillis() - start) + "ms");
}
}
运行截图:
· String(注意这个 函数只循环25000次,是后两者的1/10,因为运行250000次,软件崩了)

· StringBuilder(循环250000次才看出来与StringBuffer速度上的微弱差异)

· StringBuffer