对于一次性初始化且后面不要修改的长字符串,直接用+操作符连接。这是很常用的场景,一般代码编辑器如eclipse,或者source insight 对行代码的长度都是有限制的。如:拼接数据库里面一个查询语句,字段特别多,查询特别复杂,就必须用+号去连接字符串,提高代码可读性。
对于中间有变量,需要动态拼接字符串,特别在循环内部或者大量连接操作时,必须要用StringBuffer或者StringBuilder,用+号操作符连接速度和效率特别差。
public class Test {
public static void main(String[] args) {
String str = "";
StringBuffer sb = new StringBuffer();
StringBuilder sbu = new StringBuilder();
long start = 0L;
long end = 0L;
start = System.currentTimeMillis();
for (int i = 0; i < 9999; i++) {
str = str + "a";
}
end = System.currentTimeMillis();
System.out.println("使用string的时间是:" + (end - start) + "毫秒!");
start = System.currentTimeMillis();
for (int i = 0; i < 9999; i++) {
sb.append("a");
}
end = System.currentTimeMillis();
System.out.println("使用StringBuffer的时间是:" + (end - start) + "毫秒!");
start = System.currentTimeMillis();
for (int i = 0; i < 9999; i++) {
sbu.append("a");
}
end = System.currentTimeMillis();
System.out.println("使用StringBuilder的时间是:" + (end - start) + "毫秒!");
}
}
//运行结果:
使用string的时间是:60毫秒!
使用StringBuffer的时间是:1毫秒!
使用StringBuilder的时间是:0毫秒!
注意:Java 1.5发行版本中新增加了非同步的StringBuilder类,用于补充同步的StringBuffer类,在多线程环境下推荐使用StringBuffer类。一般情况下两者性能差异不大,在100万次循环下,StringBuilder也只快了几十毫秒。