问题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

或者自行加锁处理。