【Java】Java 打印字符数组的正确姿势

文章目录
- 一、前言
- 二、基础知识:`char[]` 是什么?
- 三、打印 `char[]` 的不同方式
- 1. 直接使用 `System.out.println(char[])`
- 2. 使用 `Arrays.toString(char[])`
- 3. 转换为字符串输出
- 4. 使用 `String.valueOf(char[])`
- 5. 使用循环逐个打印
- 四、常见错误与陷阱
- ❌ 1. 直接打印 `char[]` 的引用(错误示例)
- ❌ 2. 打印其他类型数组时行为不同
- ⚠️ 3. 字符编码问题
一、前言
在 Java 编程中,我们经常需要处理字符数组(char[])。
然而在 打印字符数组 时,常常会遇到让人疑惑的输出结果。
例如:
char[] chars = {'H', 'e', 'l', 'l', 'o'};
System.out.println(chars);
输出结果:
Hello
看起来没问题,但如果换成 int[]:
int[] nums = {1, 2, 3};
System.out.println(nums);
输出结果却是:
[I@1b6d3586
这是为什么呢?
二、基础知识:char[] 是什么?
在 Java 中:
char[] array = {'J', 'a', 'v', 'a'};
char[] 是一个 字符类型的数组对象。
每个元素是一个 Unicode 字符,占用 2 字节(16 位)。
三、打印 char[] 的不同方式
1. 直接使用 System.out.println(char[])
char[] chars = {'J', 'a', 'v', 'a'};
System.out.println(chars);
输出:
Java
✅ 这是最直接也是最常用的方式。
原因解析:
System.out.println(char[]) 在底层调用了 PrintStream 类的重载方法:
public void println(char[] x) {synchronized (this) {print(x);newLine();}
}
而 print(char[] x) 的实现是:
public void print(char s[]) {write(s);
}
最终,它会直接把字符数组 当作字符串 输出(而不是调用 toString())。
因此可以直接显示内容 "Java"。
2. 使用 Arrays.toString(char[])
import java.util.Arrays;public class Main {public static void main(String[] args) {char[] chars = {'H', 'e', 'l', 'l', 'o'};System.out.println(Arrays.toString(chars));}
}
输出:
[H, e, l, l, o]
✅ 适合调试场景。
Arrays.toString()会以数组形式打印每个字符,并加上逗号和方括号。
3. 转换为字符串输出
char[] chars = {'N', 'i', 'H', 'a', 'o'};
String str = new String(chars);
System.out.println(str);
输出:
NiHao
✅ 推荐在需要将字符数组转换为字符串时使用。
这是 String 类的一个常用构造函数:
public String(char value[]) {this.value = Arrays.copyOf(value, value.length);
}
它会将字符数组内容拷贝到新的字符串对象中。
4. 使用 String.valueOf(char[])
char[] chars = {'a', 'b', 'c'};
System.out.println(String.valueOf(chars));
输出:
abc
✅ 功能与
new String(chars)相同。
内部同样调用了new String(value)构造方法。
区别在于:
new String(chars)创建新对象;String.valueOf(chars)在内部可能做额外的优化。
5. 使用循环逐个打印
char[] chars = {'J', 'a', 'v', 'a'};
for (char c : chars) {System.out.print(c);
}
System.out.println(); // 换行
输出:
Java
✅ 手动控制输出格式,适合自定义打印逻辑(例如加分隔符)。
四、常见错误与陷阱
❌ 1. 直接打印 char[] 的引用(错误示例)
Object obj = new char[]{'J', 'a', 'v', 'a'};
System.out.println(obj);
输出:
[C@5acf9800
原因:
obj是Object类型,而不是char[]。
println(Object x)调用的是x.toString(),而数组没有重写toString(),
因此输出的是内存地址形式(如[C@哈希码)。
✅ 解决方案:
System.out.println(new String((char[]) obj));
❌ 2. 打印其他类型数组时行为不同
int[] arr = {1, 2, 3};
System.out.println(arr); // 输出 [I@1b6d3586
这是因为 只有
char[]被特殊对待。
其他数组必须使用Arrays.toString()或循环打印。
⚠️ 3. 字符编码问题
如果字符数组中包含中文或特殊符号:
char[] chars = {'你', '好', 'J', 'a', 'v', 'a'};
System.out.println(chars);
输出可能因编码而异。
在 UTF-8 编码下结果正常显示,但在非 Unicode 控制台上可能出现乱码。
✅ 解决方案:确保项目编码为 UTF-8。
参考用toCharArray()转换后直接打印Java toCharArray() 方法 | 菜鸟教程
