StringBuilder适合单线程下频繁修改字符串的场景,如循环拼接、SQL构建、JSON生成、日志组装;其高效源于可变数组、无同步开销和可控扩容;不适用于多线程共享或仅少量拼接。
StringBuilder适合在单线程环境下频繁修改字符串的场景,比如循环拼接、SQL构建、JSON生成、日志组装等。它不适用于多线程共享修改,也不适合只读或极少变动的字符串。
这些情况都满足两个关键条件:字符串要反复改动 + 执行环境是单线程。
+=拼String会创建上万对象,而StringBuilder复用同一块内存。append逐步写入,比String叠加更轻量。sb.append("user=").append(id).append(", action="
).append(op),无锁、低开销。它的高效不是凭空来的,核心来自三方面设计:
char[](JDK 9+为byte[]),所有操作(append、insert、delete)都在原数组上完成,不新建对象。synchronized,没有线程安全机制,单线程下比StringBuffer快10%–15%左右。oldCapacity * 2 + 2扩容;可预估长度传入构造参数(如new StringBuilder(1024)),减少扩容次数。选错类型反而拖慢程序,注意避开这些坑:
"Hello" + name + "!",编译器会自动优化成StringBuilder,手动写反而啰嗦。append可能造成数据错乱,此时应改用StringBuffer,或用局部变量隔离。三者本质区别就两点:是否可变、是否线程安全。