这是一个非常基础且常用的 String 类方法。
核心定义
toCharArray() 是 Java 中 java.lang.String 类的一个公共方法。
方法签名:
public char[] toCharArray()
作用:
将一个字符串对象转换为一个字符数组 (char[]),新创建的数组包含了字符串中的每一个字符,顺序与字符串中的顺序完全一致。
返回值: 一个新分配的字符数组,其长度等于字符串的长度,内容是字符串中每个字符的副本。
使用示例
下面通过几个简单的例子来演示它的用法。
示例 1:基本用法
这是最常见的用法,将一个字符串转换成字符数组,然后遍历打印。
public class ToCharArrayExample {
public static void main(String[] args) {
String str = "Hello, World!";
// 调用 toCharArray() 方法
char[] charArray = str.toCharArray();
// 打印数组的长度
System.out.println("字符串长度: " + str.length()); // 输出: 13
System.out.println("数组长度: " + charArray.length); // 输出: 13
// 遍历字符数组
System.out.println("\n字符数组内容:");
for (int i = 0; i < charArray.length; i++) {
System.out.println("索引 " + i + ": " + charArray[i]);
}
// 使用增强 for 循环
System.out.println("\n使用增强 for 循环遍历:");
for (char c : charArray) {
System.out.print(c + " ");
}
}
}
输出:
字符串长度: 13
数组长度: 13
索引 0: H
索引 1: e
索引 2: l
索引 3: l
索引 4: o
索引 5: ,
索引 6:
索引 7: W
索引 8: o
索引 9: r
索引 10: l
索引 11: d
索引 12: !
使用增强 for 循环遍历:
H e l l o , W o r l d !
示例 2:修改字符数组 vs 修改字符串
一个非常重要的特性是:toCharArray() 返回的是原字符串的一个副本,修改这个字符数组不会影响原始的字符串对象。
public class StringImmutabilityExample {
public static void main(String[] args) {
String originalStr = "Java";
System.out.println("原始字符串: " + originalStr);
// 转换为字符数组
char[] chars = originalStr.toCharArray();
// 修改字符数组中的内容
chars[0] = 'K'; // 将第一个字符 'J' 改为 'K'
System.out.println("修改后的字符数组: " + new String(chars)); // 输出: Kava
System.out.println("原始字符串是否改变: " + originalStr); // 输出: Java (没有改变)
}
}
输出:
原始字符串: Java
修改后的字符数组: Kava
原始字符串是否改变: Java
这个例子清晰地展示了 Java 中字符串的不可变性 (Immutability)。toCharArray() 创建的是副本,保护了原始数据。
示例 3:实际应用场景
toCharArray() 在很多场景下都非常有用。
场景 1:字符级别的处理和统计
统计一个字符串中每个字母出现的次数。
public class CharCountExample {
public static void main(String[] args) {
String text = "programming is fun";
text = text.toLowerCase(); // 转为小写方便统计
char[] chars = text.toCharArray();
int[] counts = new int[26]; // 假设只统计 a-z
for (char c : chars) {
if (c >= 'a' && c <= 'z') {
counts[c - 'a']++;
}
}
System.out.println("字母出现次数统计:");
for (char c = 'a'; c <= 'z'; c++) {
if (counts[c - 'a'] > 0) {
System.out.println(c + ": " + counts[c - 'a']);
}
}
}
}
场景 2:反转字符串
虽然 Java 8+ 可以用 StringBuilder.reverse(),但用 toCharArray() 也是一种经典实现方式。
public class ReverseStringExample {
public static void main(String[] args) {
String str = "Hello";
char[] charArray = str.toCharArray();
int start = 0;
int end = charArray.length - 1;
while (start < end) {
// 交换首尾字符
char temp = charArray[start];
charArray[start] = charArray[end];
charArray[end] = temp;
start++;
end--;
}
// 将字符数组转换回字符串
String reversedStr = new String(charArray);
System.out.println("原始字符串: " + str);
System.out.println("反转后字符串: " + reversedStr);
}
}
输出:
原始字符串: Hello
反转后字符串: olleH
与 getChars() 的比较
String 类还有一个类似的方法 getChars(),它们有什么区别呢?
| 特性 | toCharArray() |
getChars() |
|---|---|---|
| 返回值 | 返回一个全新的 char[] 数组。 |
无返回值 (void),数据被复制到你提供的 char[] 数组中。 |
| 使用方式 | 简单直接,适合一次性将整个字符串转为数组。 | 更灵活,可以指定源字符串的起始和结束索引,以及目标数组的起始位置。 |
| 灵活性 | 较低,总是复制整个字符串。 | 较高,可以复制字符串的任意一部分到目标数组的任意位置。 |
getChars() 方法签名:
public void getChars(int srcBegin, int srcEnd, char[] dst, int dstBegin)
srcBegin: 源字符串中要复制的起始索引(包含)。srcEnd: 源字符串中要复制的结束索引(不包含)。dst: 目标字符数组。dstBegin: 目标数组中开始放置的位置。
示例:
public class GetCharsExample {
public static void main(String[] args) {
String str = "Hello, World!";
char[] destination = new char[5]; // 创建一个长度为5的数组
// 将源字符串索引 7 到 12 (不包含) 的内容复制到目标数组的索引 0 开始的位置
// 即 "World" 复制到 destination
str.getChars(7, 12, destination, 0);
System.out.println("目标数组内容: " + new String(destination)); // 输出: World
}
}
如何选择?
- 如果你需要整个字符串的字符数组,使用
toCharArray()更简洁。 - 如果你只需要字符串的一部分,或者想将字符复制到一个已经存在的数组中,使用
getChars()更高效,因为它可以避免创建不必要的数组。
- 功能:
toCharArray()是 JavaString类的一个方法,用于将字符串内容复制到一个新的字符数组 (char[]) 中。 - 返回值: 一个新的
char[]数组。 - 核心特性: 它返回的是副本,修改返回的数组不会影响原始的字符串,体现了字符串的不可变性。
- 常用场景: 需要对字符串进行字符级别的操作,如遍历、统计、排序、反转等。
- 与
getChars()的区别:toCharArray()更简单,适合全量复制;getChars()更灵活,适合部分复制和复用已有数组。
