string.valueof(c)更清晰、更安全,推荐优先使用;"" + c语义模糊且性能略差;new string(new char[]{c})冗余低效,应避免。

char转String该用String.valueOf还是"" + c
直接说结论:String.valueOf(c)更清晰、更安全,推荐优先用;"" + c虽能工作,但底层多一次StringBuilder扩容+toString,且语义模糊,容易让协作者误以为你在做字符串拼接逻辑。
常见错误现象:有人看到"" + 'a'返回"a"就以为这是“标准写法”,结果在性能敏感循环里大量使用,或在静态常量初始化时混用导致字节码变复杂。
-
String.valueOf(c)是专为此设计的重载方法,JVM可内联,无对象创建开销(JDK 9+) -
"" + c实际触发StringBuilder.append(char)→toString(),至少生成1个临时StringBuilder和1个String - 两者在功能上等价,但
String.valueOf明确表达了“类型转换”意图,而+容易和业务拼接混淆(比如"prefix" + c + "suffix")
为什么new String(new char[]{c})不是好选择
这写法能跑通,但属于典型过重操作:它绕过所有优化路径,强制走字符数组→String构造流程,既慢又占内存。
使用场景几乎不存在——除非你正在调试String构造器行为本身。日常开发中,它只带来三重负担:额外数组分配、冗余拷贝、GC压力上升。
立即学习“Java免费学习笔记(深入)”;
- 比
String.valueOf(c)慢3~5倍(JMH基准测试,JDK 17) - 生成2个对象:
char[]和String,而String.valueOf在JDK 9+中复用内部常量池中的单字符字符串(如"a") - 在Android低内存设备上,频繁调用可能触发GC抖动
注意String.valueOf(null)和"" + null的行为差异
这是最容易踩的坑:当char变量本身是Character包装类且为null时,两种写法崩溃方式完全不同。
Character c = null;之后:
-
String.valueOf(c)→ 返回字符串"null"(因为调用的是String.valueOf(Object)重载) -
"" + c→ 同样返回"null"(StringBuilder.append(Object)也处理null) - 但如果你写的是
String.valueOf(c.charValue())(强行拆箱),就会抛NullPointerException
所以关键不是选哪个操作符,而是先确认变量是否可能为null。若可能,应显式判空,而不是依赖valueOf或+的隐式容错。
在字符串拼接场景下,别为了单个char硬套String.valueOf
如果真实需求是"ID-" + c + "-END"这类组合,直接用+就行——JVM会自动优化成StringBuilder链式调用,此时再拆成"ID-" + String.valueOf(c) + "-END"反而干扰编译器优化,还降低可读性。
性能影响其实微乎其微,但逻辑割裂感强:你本意是拼接,却在中间插入一个“类型转换”的仪式感动作。
- 纯转换(如日志打点、Map键生成、DTO字段赋值)→ 用
String.valueOf(c) - 嵌入拼接(如SQL片段、路径组装、模板填充)→ 用
"" + c或直接+表达式 - Java 15+可考虑
String.format("%c", c),但仅限需要格式控制(如补零、大小写)时,别为单纯转换引入格式化开销
最麻烦的其实是没想清楚自己到底要“转换”还是“拼接”。一旦混淆,后面加注释都难解释清楚。










