核心方法:toCharArray()
这是将 String 转换为 char 数组最标准、最推荐的方法。

语法
public char[] toCharArray()
功能
该方法会创建一个新的 char 数组,然后将调用该方法的 String 对象中的所有字符(包括空格)按顺序复制到这个新数组中,并返回该数组。
示例代码
public class StringToCharArrayExample {
public static void main(String[] args) {
// 1. 定义一个字符串
String str = "Hello, Java!";
// 2. 使用 toCharArray() 方法将字符串转换为 char 数组
char[] charArray = str.toCharArray();
// 3. 打印转换后的数组
System.out.println("原始字符串: " + str);
System.out.println("转换后的 char 数组: " + java.util.Arrays.toString(charArray));
// 4. 遍历 char 数组并打印每个字符
System.out.println("\n遍历数组中的每个字符:");
for (char c : charArray) {
System.out.print(c + " ");
}
}
}
输出结果
原始字符串: Hello, Java!
转换后的 char 数组: [H, e, l, l, o, ,, , J, a, v, a, !]
遍历数组中的每个字符:
H e l l o , J a v a !
重要注意事项
返回的是新数组,而不是视图
toCharArray() 方法总是创建一个新的 char 数组,而不是返回对字符串内部字符数组的引用,这意味着你可以安全地修改返回的数组,而不会影响原始的 String 对象。
示例:
public class ImportantNoteExample {
public static void main(String[] args) {
String originalStr = "immutable";
System.out.println("原始字符串: " + originalStr);
// 转换为 char 数组
char[] chars = originalStr.toCharArray();
// 修改 char 数组中的第一个字符
chars[0] = 'I'; // 将 'i' 改为 'I'
System.out.println("修改后的 char 数组: " + new String(chars)); // 将 char 数组变回字符串
System.out.println("原始字符串是否改变: " + originalStr); // 原始字符串保持不变
}
}
输出结果:

原始字符串: immutable
修改后的 char 数组: Immutable
原始字符串是否改变: immutable
正如你所见,修改 chars 数组并不会影响 originalStr,这证明了 String 对象的不可变性。
性能考虑
对于非常大的字符串,频繁调用 toCharArray() 会因为不断创建新数组而消耗较多内存,在性能极其敏感的场景下,如果你只需要读取字符而不需要修改,可以考虑使用 String.charAt(int index) 方法来逐个访问字符,这样可以避免创建额外的数组。
示例(不推荐用于简单转换,仅作性能对比):
String str = "a very long string...";
// 这种方式没有创建新数组,但代码更繁琐
for (int i = 0; i < str.length(); i++) {
char c = str.charAt(i);
// ... do something with c
}
其他相关方法(不直接用于转换)
虽然 toCharArray() 是最直接的方法,但了解其他方法也很有帮助,因为它们在某些特定场景下会用到。

getChars()
如果你只想转换字符串的一部分(一个子串)到 char 数组,getChars() 是一个很好的选择。
语法:
public void getChars(int srcBegin, int srcEnd, char[] dst, int dstBegin)
srcBegin: 要复制的第一个字符的索引。srcEnd: 要复制的最后一个字符的索引(不包括这个索引)。dst: 目标char数组。dstBegin: 目标数组中开始放置字符的位置。
示例:
public class GetCharsExample {
public static void main(String[] args) {
String str = "Hello, World!";
char[] destination = new char[5]; // 创建一个长度为5的目标数组
// 将 str 中索引 7 到 12 (不包括12) 的字符复制到 destination 数组的开始位置 (0)
str.getChars(7, 12, destination, 0);
System.out.println("目标数组内容: " + new String(destination)); // 输出 "World"
}
}
使用 StringBuffer 或 StringBuilder
StringBuffer 和 StringBuilder 有一个构造函数可以直接接受一个 String,然后通过 toString() 方法可以变回字符串,虽然这不是直接转换,但它们内部都维护着一个 char 数组,可以间接获取。
示例:
public class StringBuilderExample {
public static void main(String[] args) {
String str = "Java";
// 使用 StringBuilder 构造函数
StringBuilder sb = new StringBuilder(str);
// 获取其内部的 char 数组(通过反射或查看源码可知,但这不是公共API)
// 注意:直接访问 sb.value 是不推荐的,因为它不是公共API,未来可能改变。
// 这里仅作概念演示。
// char[] internalCharArray = sb.value; // 在某些JDK版本中可能可以访问,但不要在生产代码中这样做
// 更安全的方式是先转为 String 再用 toCharArray()
char[] safeCharArray = sb.toString().toCharArray();
System.out.println("通过 StringBuilder 转换的数组: " + java.util.Arrays.toString(safeCharArray));
}
}
这种方法绕了远路,不如直接用 toCharArray() 高效和清晰。
| 方法 | 描述 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|---|
toCharArray() |
将整个字符串转换为新的 char 数组 |
最简单、最直接、最常用 | 为大字符串创建新数组有内存开销 | 绝大多数情况下的首选 |
getChars() |
将字符串的子串复制到已存在的 char 数组 |
灵活,可以处理部分内容 | 需要预先创建目标数组 | 只需要字符串的一部分时 |
charAt() |
逐个访问字符串中的字符 | 不创建新数组,节省内存 | 代码繁琐,效率低于数组遍历 | 只需读取字符且对性能要求极高时 |
在 Java 中,如果你需要将 String 转换为 char 数组,请毫不犹豫地使用 toCharArray() 方法,它是最符合 Java 设计思想、最清晰、最可靠的方式。
