数组与ArrayList的打印差异及底层原因咨询
数组与ArrayList打印差异的原因解析
这是个非常典型的Java基础问题,我来帮你把背后的逻辑梳理清楚:
核心原因:toString()方法的实现差异
System.out.println()本质上会调用传入对象的toString()方法生成输出字符串,而ArrayList和数组在这个方法的实现上有本质区别:
1. ArrayList的toString()是专门为打印内容设计的
ArrayList继承自AbstractCollection,这个类已经帮我们重写了toString()方法。它的逻辑是:
- 遍历集合中的每个元素,调用每个元素自己的
toString()方法 - 把所有元素的字符串结果用逗号分隔,再包裹在方括号
[]里
所以不管你存的是Point对象还是Integer包装类,ArrayList都会帮你把每个元素的内容正确拼接输出——这就是你看到[java.awt.Point[x=10,y=20], ...]和[1, 2, 3, 4, 5]的原因。
2. 数组没有重写Object的默认toString()
数组在Java里是特殊的对象,但它并没有重写Object类的默认toString()方法。Object的toString()格式是:
[类型标识]@[对象哈希码的十六进制]
- 对于对象数组(比如
Point[]),类型标识是[L全类名;,所以你看到的[Ljava.awt.Point;@70dea4e就是这个格式 - 对于基本类型数组(比如
int[]),类型标识是[基本类型缩写,int的缩写是I,所以输出是[I@5c647e05
这种输出只会告诉你数组的类型和内存地址,不会遍历打印元素内容。
如何正确打印数组内容
如果想要像ArrayList一样打印数组的元素,可以使用java.util.Arrays类的toString()静态方法:
- 对于对象数组:
Arrays.toString(points1)会输出[java.awt.Point[x=70,y=80], java.awt.Point[x=90,y=100], null, null, null] - 对于基本类型数组:
Arrays.toString(intArray)会输出[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
把你的代码修改一下试试:
import java.util.Arrays; // ... 其他代码不变 System.out.println(Arrays.toString(points1)); System.out.println(Arrays.toString(intArray));
对应你的代码与输出总结
System.out.println(points):ArrayList重写了toString(),正确打印所有Point元素的内容System.out.println(points1):Point数组使用Object默认toString(),输出类型+哈希码System.out.println(intArray):int数组同样使用默认toString(),输出类型+哈希码System.out.println(intsArrayList):ArrayList重写toString(),正确打印Integer元素的数值
内容的提问来源于stack exchange,提问作者csStudent7264
相关产品推荐
相关产品推荐

