在 Java 中,将字符数组(char[])转换为字符串(String)有多种方法,以下是几种常用的方式,以及它们的区别和适用场景。

使用 String 构造函数(最直接、最常用)
这是最直接的方法,通过调用 String 类的构造函数来创建一个新的字符串对象。
char[] charArray = {'H', 'e', 'l', 'l', 'o', ' ', 'W', 'o', 'r', 'l', 'd'};
// 使用 String 的 char[] 构造函数
String str = new String(charArray);
System.out.println(str); // 输出: Hello World
特点:
- 最常用:这是将整个字符数组转换为字符串的标准方法。
- 创建新对象:它会基于字符数组的内容创建一个全新的、不可变的
String对象。 - 灵活性:还可以指定转换的起始位置和长度。
// 从索引 6 开始,转换长度为 5 的字符 String subStr = new String(charArray, 6, 5); System.out.println(subStr); // 输出: World
使用 String.valueOf() 静态方法
String 类提供了一个静态的 valueOf() 方法,可以将各种数据类型(包括字符数组)转换为字符串。
char[] charArray = {'J', 'a', 'v', 'a'};
// 使用 String.valueOf() 方法
String str = String.valueOf(charArray);
System.out.println(str); // 输出: Java
特点:

- 简洁:语法上比
new String()稍微简洁一些。 - 功能更通用:
valueOf()方法有多个重载版本,可以接受Object、char、int、double等多种参数,使用起来非常方便。 - 底层实现:在大多数 JVM 实现中,
String.valueOf(char[])内部就是调用了new String(char[])。
使用 String.copyValueOf() 静态方法
String.copyValueOf() 是 valueOf() 的一个变体,它的功能和 new String(char[]) 几乎完全相同。
char[] charArray = {'C', 'o', 'p', 'y', 'V', 'a', 'l', 'u', 'e'};
// 使用 String.copyValueOf() 方法
String str = String.copyValueOf(charArray);
System.out.println(str); // 输出: CopyValue
特点:
- 与构造函数功能一致:它和
new String(char[])一样,会创建一个新的字符串副本。 - 同样支持子数组:也可以指定起始位置和长度。
// 从索引 4 开始,转换长度为 5 的字符 String subStr = String.copyValueOf(charArray, 4, 5); System.out.println(subStr); // 输出: Value
使用 StringBuilder 或 StringBuffer
如果你需要在一个循环中频繁地构建字符串,或者需要修改字符串内容,那么使用 StringBuilder 或 StringBuffer 会更高效。
char[] charArray = {'S', 't', 'r', 'i', 'n', 'g', 'B', 'u', 'i', 'l', 'd', 'e', 'r'};
// 使用 StringBuilder
StringBuilder sb = new StringBuilder();
for (char c : charArray) {
sb.append(c);
}
String str = sb.toString();
System.out.println(str); // 输出: StringBuilder
特点:

- 高效:
StringBuilder是可变的,在循环中追加字符比不断创建新的String对象性能要好得多。 - 可变性:
StringBuilder不是线程安全的,但速度更快。StringBuffer是线程安全的,但速度稍慢,在单线程环境下,优先使用StringBuilder。 - 灵活性:除了逐个追加,还可以一次性追加整个字符数组。
// 更简洁的 StringBuilder 用法 StringBuilder sb2 = new StringBuilder(); sb2.append(charArray); // 直接 append 整个数组 String str2 = sb2.toString(); System.out.println(str2); // 输出: StringBuilder
总结与对比
| 方法 | 语法 | 是否创建新对象 | 主要特点 | 推荐场景 |
|---|---|---|---|---|
new String() |
new String(charArray) |
是 | 最标准、最直接的方法。 | 绝大多数情况下的首选,当你需要将整个字符数组或其一部分转换为字符串时。 |
String.valueOf() |
String.valueOf(charArray) |
是 | 语法简洁,功能通用,可转换多种类型。 | 代码风格偏好,或者需要与其他类型(如 int, double)一起转换时。 |
String.copyValueOf() |
String.copyValueOf(charArray) |
是 | 功能与 new String() 完全相同。 |
与 valueOf() 类似,可读性可能稍好,但不如 new String() 常用。 |
StringBuilder.toString() |
new StringBuilder().append(charArray).toString() |
是 | 高效,适用于循环或频繁拼接字符串的场景。 | 当你需要动态构建字符串时,尤其是在循环中。 |
重要注意事项:字符数组与字符串的引用关系
当你使用 new String(charArray) 或 String.valueOf(charArray) 时,会创建一个新的字符串对象,该对象的内容是字符数组的副本,这意味着修改原始的字符数组不会影响新生成的字符串。
char[] chars = {'a', 'b', 'c'};
// 创建一个新的字符串对象,它是 chars 数组的一个副本
String str = new String(chars);
// 修改原始字符数组
chars[0] = 'z';
// str 的值不会改变,因为它指向的是一个新的、独立的字符串对象
System.out.println(str); // 输出: abc
System.out.println(chars); // 输出: [z, b, c]
这个特性非常重要,它保证了 String 对象的不可变性,也使得你可以在不担心原始数据被意外修改的情况下安全地使用转换后的字符串。
