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+)或 Guava Joiner
  • 避免对原始 char[] 使用 Stream 方式,性能差且啰嗦

所有示例代码已整理并托管至 GitHub 仓库:https://github.com/baeldung/tutorials(模块:core-java-string-conversions-2)


原始标题:Convert Character Array to String in Java