Java中集合能直接打印,为什么还需要迭代器呢?集合直接打印打印出来的是什么啊,数组直接打印打印出来的数组元素的首地址吗?那为什么遍历之后就不是打印出来地址了

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]);

        }
    }

img


就是为什么集合能直接打印,还要迭代器啊

问题很好。

  1. 第一个问题,集合继承了迭代器接口,所以你在遍历的时候其实还是在使用迭代器,看图:

img

  1. 第二个问题,这个和继承知识点有关,object 类是所有类的祖先类,因为打印数组其实就是调用数组的 toString 方法,数组的 toString 方法继承的是 object 类的,object 类的 toString 方法输出比较怪。看图:

img


建议阅读《Java核心技术卷1》

用心的回答,希望给个采纳,谢谢!

下次遇到这种疑问,可以先从源码的角度去思考一下。
遍历打印,打印的是每个元素,这个毫无疑问。
那如果直接打印数组或集合呢,数组和集合都是对象类型,这个就要看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()方法,而普通数组没有