public class Demo07 {
public static void main(String[] args) {
ArrayList arr = new ArrayList();
arr.add("tom");
arr.add(3);
arr.add(2);
arr.add(1);
Collections.reverse(arr);
System.out.println(arr);
Iterator it = arr.iterator();
while(it.hasNext()){
Object s = it.next();
System.out.println(s);
}
int[] a = {1,2,3,4};
System.out.println(a);
for (int i = 0; i < a.length; i++) {
System.out.println(a[i]);
}
}
问题很好。
下次遇到这种疑问,可以先从源码的角度去思考一下。
遍历打印,打印的是每个元素,这个毫无疑问。
那如果直接打印数组或集合呢,数组和集合都是对象类型,这个就要看System.out.Println(Object)的实现啊。
System.out是个变量,类型是PrintStream,那就看一下PrintStream的Println(Object)方法
public void println(Object x) {
String s = String.valueOf(x);
synchronized (this) {
print(s);
newLine();
}
}
可以看到是通过String.valueOf(x)将对象转成了字符串,然后再看String类的valueOf(Object)方法
public static String valueOf(Object obj) {
return (obj == null) ? "null" : obj.toString();
}
到这里就很明显了,是调用对象的toString方法。
默认的toString方法是打印对象地址,比如数组。
而ArrayList重写了toString方法(其实是AbstractCollection重写了toString并且ArrayList是它的子类),所以打印的不是地址,而是元素的值。
1.集合能直接打印
2.迭代器一般是对集合进行操作的时候用
3.集合直接打印会以数组的形式打印出来
4.数组直接打印就是数组的地址
5.数组遍历的时候是取下标,也就是对数组的元素进行打印,所以打印出来就是数组的值,也可以用Arrays.toString()来打印数组
集合的迭代器主要是不知道集合长度的情况下,方便循环获取集合元素用于业务处理,数组a直接打印的话,显示的是数组对象对应的hash值,而a[i]打印出来的是数组元素对应的value值
就喜欢你这样善于思考善于否定的
List 有实现toString()方法,而普通数组没有