Java 使用 System.out.print 输出数组

1
2
int[] array = {5, 4, 3, 2, 1};
System.out.print(array);

今天在执行这段代码的时候,输出竟然是

1
[I@1b6d3586

之前用 Python 用习惯了,没意识到 Java 不能这样输出数组。

解决方案

可以使用 Arrays.toString() 方法。

1
2
int[] array = {5, 4, 3, 2, 1};
System.out.print(Arrays.toString(array));

或者使用 for 循环遍历数组的每一个元素输出。

剖析原因

以下来剖析一下深层次的原因。

来分析一下 System.out.print

java.lang.System 是一个类。我们先来看一下 System 类的源代码。

1
2
3
4
5
public final class System extends Object {
...
static PrintStream out;
...
}

这里能看出,out 其实是 System 的一个静态成员变量,其类型是 PrintStream。而 print()PrintStream 类的一个方法。

通过查看Java Docs我们可以看到有很多重载的 print() 方法。

print_overload_list

可以看到,有很多重载的 print() 函数,但是没有专门支持 int[]long[]double[] 这种类型数组输出的 print() 方法。

因此,int[]long[]double[] 类型的数组对象会被当做 Object 对象来处理。

我们来看一下 print(Object obj)

1
2
3
public void print(Object obj) {
write(String.valueOf(obj));
}

其实相当于对数组调用了 toString() 方法。而Java中数组的 toString() 方法只会返回“对象类型@对象地址”。

System.out 的初始化

1
2
3
4
5
public final class System extends Object {
...
static PrintStream out;
...
}

当JVM启动的时候,JVM会通过 initializeSystemClass() 方法对 out 进行初始化。

参考资料

  1. java - out in System.out.println() - Stack Overflow
  2. How System.out.println() really works – Lucky’s Notes
  3. System.out.println - Javapapers
  4. JAVA中的数组是对象吗? - 知乎