String 是字符串常量,而 StringBuffer 和 StringBuilder 是字符串变量,我们都知道,常量是不可变的,所以在对 String 对象进行操作时,每次都会创建一个新的对象,既浪费时间又浪费空间,而像 StringBuffer 和 StringBuilder 这种就不会新建对象,在效率上,StringBuffer 和 StringBuilder 则会优于 String。
关于三个的速度,我们可以用 System.currentTimeMillis() 方法来记录当前时间,从而进行测试:
public class Demo {
//初始值
final String str = "Noelle";
//添加的值
final String a = "a";
//添加的次数
final int count = 222222;
//测试 String 速度
public long test_String() {
String string = str;
//记录开始时间
Long begin_time = System.currentTimeMillis();
for(int i = 0; i < count; ++i) {
string += a;
}
//记录结束时间
Long end_time = System.currentTimeMillis();
return end_time - begin_time;
}
//测试 StringBuffer 速度
public long test_StringBuffer() {
StringBuffer buffer = new StringBuffer(str);
//记录开始时间
Long begin_time = System.currentTimeMillis();
for(int i = 0; i < count; ++i) {
buffer.append(a);
}
//记录结束时间
Long end_time = System.currentTimeMillis();
return end_time - begin_time;
}
//测试 StringBuilder 速度
public long test_StringBuilder() {
StringBuilder builder = new StringBuilder(str);
//记录开始时间
Long begin_time = System.currentTimeMillis();
for(int i = 0; i < count; ++i) {
builder.append(a);
}
//记录结束时间
Long end_time = System.currentTimeMillis();
return end_time - begin_time;
}
public static void main(String[] args) {
Demo demo = new Demo();
System.out.println("String: "+demo.test_String());
System.out.println("StringBuffer: "+demo.test_StringBuffer());
System.out.println("StringBuilder: "+demo.test_StringBuilder());
}
}
结果:
String: 12647
StringBuffer: 5
StringBuilder: 4
由此我们看出三个速度:String < StringBuffer < StringBuilder。
需要注意的是:虽然StringBuilder的速度最快,但在多线程情况下,StringBuffer 相比 StringBuilder 更加安全。因此,在单线程中,数据量较少就直接使用 String 就可以,数据量较多就考虑最快的 StringBuilder,在多线程中,就考虑最快的 StringBuffer。