1. 概述
在本文中,我们将探讨在 Java 中将字符数组(char[]
)转换为 String
的几种常用方法。这类操作虽然基础,但在处理底层数据、解析协议或踩坑边界条件时非常常见,掌握不同方式有助于写出更高效、清晰的代码。
2. 使用 String 构造函数
最直接、简单粗暴的方式就是使用 String
类提供的构造函数,它接受一个 char[]
作为参数:
✅ 推荐指数:⭐⭐⭐⭐⭐
✅ 适用场景:通用、高性能
@Test
public void whenStringConstructor_thenOK() {
final char[] charArray = { 'b', 'a', 'e', 'l', 'd', 'u', 'n', 'g' };
String string = new String(charArray);
assertThat(string, is("baeldung"));
}
这种方式底层其实调用了 String.valueOf(char[])
,但语义清晰、性能优秀,是首选方案。
3. 使用 String.valueOf()
既然提到了 valueOf()
,我们也可以直接调用这个静态方法:
✅ 推荐指数:⭐⭐⭐⭐⭐
✅ 与构造函数性能几乎一致
@Test
public void whenStringValueOf_thenOK() {
final char[] charArray = { 'b', 'a', 'e', 'l', 'd', 'u', 'n', 'g' };
String string = String.valueOf(charArray);
assertThat(string, is("baeldung"));
}
⚠️ 注意:
String.copyValueOf()
方法虽然语义等价,但在现代 Java 版本中已无实际意义,不推荐使用。它只是历史遗留,性能和功能上没有任何优势。
4. 使用 StringBuilder 的 toString()
如果你面对的是一个 char[][]
—— 即多个字符子数组需要拼接成一个字符串,这时 StringBuilder
就派上用场了:
✅ 推荐指数:⭐⭐⭐⭐
✅ 适合复杂拼接逻辑
@Test
public void whenStringBuilder_thenOK() {
final char[][] arrayOfCharArray = { { 'b', 'a' }, { 'e', 'l', 'd', 'u' }, { 'n', 'g' } };
StringBuilder sb = new StringBuilder();
for (char[] subArray : arrayOfCharArray) {
sb.append(subArray);
}
assertThat(sb.toString(), is("baeldung"));
}
📌 小技巧:可以通过预估总长度初始化 StringBuilder
容量,避免多次扩容:
int totalLength = Arrays.stream(arrayOfCharArray).mapToInt(arr -> arr.length).sum();
StringBuilder sb = new StringBuilder(totalLength);
这样能进一步提升性能,尤其在大数据量场景下效果明显。
5. 使用 Java 8 Stream
如果你喜欢函数式风格,或者数据源已经是流式结构,可以用 Arrays.stream()
配合 Collectors.joining()
实现转换:
⚠️ 推荐指数:⭐⭐
⚠️ 性能较差,仅推荐用于代码可读性优先的场景
@Test
public void whenStreamCollectors_thenOK() {
final Character[] charArray = { 'b', 'a', 'e', 'l', 'd', 'u', 'n', 'g' };
Stream<Character> charStream = Arrays.stream(charArray);
String string = charStream.map(String::valueOf).collect(Collectors.joining());
assertThat(string, is("baeldung"));
}
📌 踩坑提醒:
- 数组必须是包装类型
Character[]
,不能是原始类型char[]
- 每个元素都要调用
String.valueOf()
,产生额外开销 - 创建流、中间操作、收集器都有性能损耗
❌ 结论:不建议用于高性能路径,但作为“一行流式表达”在业务逻辑中偶尔使用也无妨。
6. 使用 Guava 的 Joiner
如果你项目中引入了 Guava,并且需要生成带分隔符的字符串(比如 CSV 格式),Joiner
是个不错的选择:
✅ 推荐指数:⭐⭐⭐(仅限分隔场景)
✅ 语法简洁,语义明确
@Test
public void whenGuavaCommonBaseJoiners_thenOK() {
final Character[] charArray = { 'b', 'a', 'e', 'l', 'd', 'u', 'n', 'g' };
String string = Joiner.on("|").join(charArray);
assertThat(string, is("b|a|e|l|d|u|n|g"));
}
📌 注意事项:
- 同样只支持
Character[]
,不支持原始char[]
- 需要额外依赖 Guava(
com.google.guava:guava
) - 对于无分隔符拼接,不如
String.valueOf()
直接
7. 总结
方法 | 是否推荐 | 适用场景 |
---|---|---|
new String(char[]) |
✅ 强烈推荐 | 通用、高性能 |
String.valueOf(char[]) |
✅ 强烈推荐 | 语义清晰,与构造函数等价 |
StringBuilder.append() |
✅ 推荐 | 多段拼接、复杂逻辑 |
Stream + Collectors.joining() |
⚠️ 谨慎使用 | 函数式风格、非性能敏感场景 |
Guava Joiner |
✅ 条件推荐 | 带分隔符拼接,且已引入 Guava |
📌 最佳实践建议:
- 默认选
String.valueOf(char[])
或构造函数 - 拼接多个
char[]
用StringBuilder
- 分隔符场景优先考虑
String.join()
(JDK 8+)或 GuavaJoiner
- 避免对原始
char[]
使用 Stream 方式,性能差且啰嗦
所有示例代码已整理并托管至 GitHub 仓库:https://github.com/baeldung/tutorials(模块:core-java-string-conversions-2)