问题1:循环拼接字符串为什么变慢
测试代码:
public class Test {
public static void main(String[] args) {
long start = System.currentTimeMillis();
String s = "";
for (int i = 0; i < 100000; i++) {
s += i;
}
long end = System.currentTimeMillis();
System.out.println("耗时:" + (end - start));
}
}
当循环次数变大时,耗时明显增加。
改成 StringBuilder:
public class Test {
public static void main(String[] args) {
long start = System.currentTimeMillis();
StringBuilder sb = new StringBuilder();
for (int i = 0; i < 100000; i++) {
sb.append(i);
}
long end = System.currentTimeMillis();
System.out.println("耗时:" + (end - start));
}
}
对比测试,多次运行后 StringBuilder 明显更快。
问题2:为什么String拼接慢
反编译简单测试代码:
String s = "a" + "b";
编译后会变成:
new StringBuilder().append("a").append("b").toString();
但如果是在循环里:
s += i;
每次都会创建新的 StringBuilder,再生成新的 String 对象。
对象频繁创建,性能下降。
问题3:什么时候可以直接用String
简单测试:
String a = "hello";
String b = "world";
String c = a + b;
非循环场景下,差距不明显。
少量拼接时直接用 String 不会有明显问题。
问题4:StringBuilder线程安全吗
简单测试多线程拼接时,数据会出现错乱。
StringBuilder 不是线程安全。
如果多线程环境,需要使用:
StringBuffer
或者自行加锁处理。