单线程用stringbuilder,多线程共享同一对象时用stringbuffer;核心区别是stringbuffer线程安全(方法加synchronized)、性能较低,stringbuilder线程不安全、单线程性能高10%–15%,且均支持预设容量优化扩容开销。

直接看线程环境:单线程用 StringBuilder,多线程共享同一对象时用 StringBuffer。
关键区别就两点
• 线程安全:StringBuffer 所有公共方法都加了 synchronized,多个线程同时调用不会出错;StringBuilder 没有同步机制,多线程下可能数据错乱。
• 性能表现:因为少了同步开销,StringBuilder 在单线程中普遍比 StringBuffer 快 10%–15%,尤其在大量 append、insert 场景下更明显。
怎么判断该用哪个
• 字符串操作只发生在同一个线程里(比如 Web 请求处理中的参数拼接、日志组装、SQL 构建),选 StringBuilder——安全、轻量、高效。
• 多个线程会共用并修改同一个字符串对象(例如全局缓存计数器、并发任务的汇总日志缓冲区),必须用 StringBuffer,否则结果不可预测。
• 不确定是否多线程?先默认用 StringBuilder;真遇到并发问题,再换成 StringBuffer 或加外部锁,而不是一开始就牺牲性能。
一个容易忽略的优化点
• 创建时预估容量。比如知道最终字符串大概 200 字符,就写 new StringBuilder(200)。避免反复扩容(默认初始容量是 16,每次扩容≈2×+2),减少数组拷贝开销。
• StringBuffer 同理,预设容量同样有效。
选对类不难,关键是别把单线程场景当成“以防万一”去用 StringBuffer——那只是白丢性能。











