【Java】打印数组,别再直接 System.out.println 踩坑了!
大家好,我是云扬。
在日常 Java 开发中,打印数组是再基础不过的操作,但绝大多数刚入门的开发者,都会踩同一个经典坑:直接对数组使用 System.out.println(),结果打印出一串完全看不懂的地址值。
今天这篇文章,就把 Java 打印数组的原理、正确用法、规范一次性讲透,新手也能直接照着用。
一、为什么不能直接打印数组?
先看一段最容易写错的代码:
String[] cmowers = {"沉默","云扬","一枚有趣的程序员"};
// 错误写法:直接打印数组
System.out.println(cmowers);
运行后你会得到类似这样的结果:
[Ljava.lang.String@3d075dc0
这并不是乱码,而是有明确含义的:
[Ljava.lang.String:表示这是一个字符串数组的 Class 名称@后面的十六进制串:是该数组对象的hashCode
根本原因:
Java 中的数组本质是对象,继承自顶层父类 Object,而 Object 类的 toString() 方法默认就是输出「类名 @哈希值」:
// Object 类源码
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
所以直接打印数组,只会拿到对象地址,而非数组内容。
二、Java 打印数组的 4 种正确方式
1. 最常用:Arrays.toString ()(一维数组首选)
java.util.Arrays 工具类提供的 toString() 方法,可以直接把任意类型数组转为可读字符串,一行代码搞定。
import java.util.Arrays;
public class ArrayPrintTest {
public static void main(String[] args) {
String[] cmowers = {"沉默","云扬","一枚有趣的程序员"};
// 正确打印一维数组
System.out.println(Arrays.toString(cmowers));
}
}
输出结果:
[沉默, 云扬, 一枚有趣的程序员]
支持:基本类型数组(int、double 等)+ 引用类型数组,通用又简洁。
2. 基础遍历:for 循环 /for-each
需要对数组元素逐行处理时,用循环打印最灵活。
String[] cmowers = {"沉默","云扬","一枚有趣的程序员"};
// 1. 普通 for 循环
for(int i = 0; i < cmowers.length; i++){
System.out.println(cmowers[i]);
}
// 2. 增强 for-each(推荐,代码更简洁)
for (String s : cmowers) {
System.out.println(s);
}
3. Java 8+:Stream 流打印
使用 Stream 流式编程,优雅简洁,适合函数式编程场景。
import java.util.Arrays;
import java.util.stream.Stream;
public class ArrayStreamPrint {
public static void main(String[] args) {
String[] cmowers = {"沉默","云扬","一枚有趣的程序员"};
// 方式 1
Arrays.asList(cmowers).stream().forEach(s -> System.out.println(s));
// 方式 2
Stream.of(cmowers).forEach(System.out::println);
// 方式 3
Arrays.stream(cmowers).forEach(System.out::println);
}
}
4. 多维数组:Arrays.deepToString ()
打印二维及以上数组,必须用 deepToString(),否则还是会输出地址。
import java.util.Arrays;
public class TwoDimensionalArrayPrint {
public static void main(String[] args) {
String[][] deepArray = new String[][]{{"沉默", "云扬"}, {"一枚有趣的程序员"}};
// 打印多维数组
System.out.println(Arrays.deepToString(deepArray));
}
}
输出结果:
[[沉默, 云扬], [一枚有趣的程序员]]
三、POJO 对象打印规约(开发必看)
实际项目中,我们更多是打印对象数组,这里有一个必须遵守的开发规约:
POJO 类必须重写 toString () 方法
POJO(Plain Ordinary Java Object)简单来说就是普通实体类,不继承 / 实现任何框架类。
重写 toString() 后,打印对象时才能看到属性值,方便排查异常、调试代码。
示例:
public class User {
private String name;
private int age;
// getter、setter 省略
// 必须重写 toString
@Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
四、总结
日常开发直接记这几条就够了:
- 一维数组 → 优先用
Arrays.toString() - 多维数组 → 固定用
Arrays.deepToString() - 需要逐元素处理 → 用
for-each或Stream - 自定义对象数组 → 先重写类的
toString()
我是云扬,后续会继续分享更多 Java 基础避坑、MySQL 实战、后端开发干货,欢迎持续关注。



