Java中String与char用+拼接时,编译器在编译期选择String连接重载,调用String.valueOf(char),而非算术加法;手动转换推荐String.valueOf(c),StringBuilder.append(char)无需转String,循环拼接应避免+而用预容量StringBuilder.append(char)。

Java里用+连接字符串和char到底发生了什么
Java中String和char用+拼接时,编译器会自动把char转成String再执行字符串连接——这不是运行时的隐式转换,而是编译期就确定的重载选择。调用的是String.valueOf(char),不是Character.toString()(虽然两者结果一致,但底层实现略有差异)。
常见误区是以为"a" + 'b'会触发char的数值加法(比如'a' + 'b'得195),但只要左边是String,整个表达式就按字符串连接处理,不会做算术运算。
char转String的三种写法,哪一种最稳妥
手动转换有多个API可选,适用场景和细微差别如下:
-
String.valueOf(c):推荐首选。对null安全(c为char基本类型时不可能null,但该方法设计统一,且JVM对其做了优化) -
Character.toString(c):语义更明确,内部也是调用String.valueOf(c),无实质区别 -
"" + c:能用,但不建议。每次都会新建一个StringBuilder再toString(),多一次对象创建,性能略差;可读性也弱于前两者
在StringBuilder或StringBuffer里append char要不要先转String
完全不需要。这两个类的append()方法有专门针对char的重载:append(char),直接写入内部字符数组,零开销。
立即学习“Java免费学习笔记(深入)”;
如果错误地写成sb.append(String.valueOf(c))或sb.append("" + c),反而绕过高效路径,触发额外的String构造和复制。
示例对比:
StringBuilder sb = new StringBuilder();
sb.append('x'); // ✅ 直接写入,高效
sb.append("x"); // ⚠️ 创建新String对象再拷贝
sb.append(String.valueOf('x')); // ❌ 多余包装
字符串连接性能陷阱:循环里用+拼接char会怎样
在循环中反复用+拼接,比如result += ch;,哪怕每次只加一个char,也会在每次迭代生成新的String对象——因为String不可变。时间复杂度是O(n²),n是字符数。
正确做法是预分配StringBuilder并用append(char):
StringBuilder sb = new StringBuilder(input.length()); // 预估容量
for (char c : input.toCharArray()) {
sb.append(c); // 不要写 sb.append(String.valueOf(c))
}
String result = sb.toString();
特别注意:如果循环体里还混着其他String拼接(比如sb.append("prefix") + c + "suffix"),容易误用+导致隐式StringBuilder重建,破坏性能优势。











