String.concat()在少量字符串拼接时比+略快,因跳过类型转换和null隐式处理,底层复用arraycopy且无StringBuilder开销;但两者均创建新String对象,不适合循环拼接,高频场景应选StringBuilder。

String.concat() 在少量字符串拼接时比 + 略快,但两者都属于“创建新对象”型操作,不适合循环或高频拼接;真正高效的是 StringBuilder。
concat 和 + 的底层逻辑其实很接近
两者都依赖 Arrays.copyOf() 或 System.arraycopy() 复制字符数组,每次调用都会生成全新 String 实例。区别在于:
- concat() 只接受 String 类型参数,跳过类型转换和 null 判断开销,所以轻量级场景下稍快
-
+ 运算符更灵活,支持任意类型(自动调用
toString()),但多一层隐式转换成本 - 编译期常量拼接(如
"a" + "b")会被 javac 直接优化为一个字符串字面量,此时 concat 和 + 没有运行时差异
性能实测数据参考(10万次拼接)
典型测试环境下(JDK 17+,HotSpot JVM):
- concat:约 230–260 ms
- +:约 450–480 ms(尤其在非编译期常量场景)
- StringBuilder.append():约 6–10 ms
差距主要来自对象创建频次:concat/+ 每次拼接都 new 一个 String,而 StringBuilder 复用内部 char[],仅在扩容时复制一次。
立即学习“Java免费学习笔记(深入)”;
什么时候该用 concat()
适合明确只有两个字符串、且不涉及循环的简单拼接,比如:
userId.concat("_").concat(timestamp)- 配置项组装:
prefix.concat(".").concat(key)
它语义清晰、无同步开销、不依赖额外对象,比 + 更直白表达“纯字符串连接”意图。
什么情况千万别用 concat()
以下场景 concat 不仅慢,还容易出错:
- 拼接三个以上字符串链式调用(
a.concat(b).concat(c).concat(d))→ 创建 3 个中间 String 对象 - 在 for 循环里反复调用 → O(n²) 时间复杂度,内存压力陡增
- 拼接含 null 的变量 → 直接抛
NullPointerException,而+会转成字符串"null"
这种时候统一换成 StringBuilder,初始化时预估容量(如 new StringBuilder(128))还能进一步减少数组扩容次数。


















