2 a670917266 a670917266 于 2017.06.15 14:36 提问

求问一个java问题 关于集合打印方面的

定义一个集合
arraylist al=new arraylist
为什么system.out.println(al)
可以直接打印集合里的数据 而不是地址
我看源码里的是valueof方法 直接去的变量里的内容

3个回答

fight_in_dl
fight_in_dl   Ds   Rxr 2017.06.15 15:52
已采纳

您能看到源码,那我们一起跟踪一下。(以下操作均假定在eclipse中)

 public void println(Object x) {
        String s = String.valueOf(x); //光标移到valueOf上,按F3,进入下一处
        synchronized (this) {
            print(s);
            newLine();
        }
    }

到这里:

 public static String valueOf(Object obj) {
        return (obj == null) ? "null" : obj.toString(); //调用tostring()
    }

而ArrayList的toString()继承自 AbstractList,可以象下面这样找:

ArrayList al=new ArrayList();  //光标移到ArrayList上,按F3,进到ArrayList.class文件中。

public class ArrayList<E> extends AbstractList<E>  //在ArrayList.class文件头部找到这行,光标移到AbstractList上,按F3,进到AbstractList.class文件中。

然后在AbstractList.class文件中查找toString方法(在文件的底部),它是这样写的:

 public String toString() {
        Iterator<E> it = iterator();
        if (! it.hasNext())
            return "[]";

        StringBuilder sb = new StringBuilder();
        sb.append('[');
        for (;;) {
            E e = it.next();
            sb.append(e == this ? "(this Collection)" : e);
            if (! it.hasNext())
                return sb.append(']').toString();
            sb.append(',').append(' ');
        }
    }

这就是根源所在。

用心回答每个问题,如果对您有帮助,请采纳答案好吗,谢谢!

warmcore
warmcore   2017.06.15 14:50

在ArrayList里面覆写了Object类的toString方法,输出时会被默认调用

KwaiSZ
KwaiSZ   2017.06.15 15:14

ArrayList是这样的,因为他是实现类并且重写了继承于OBJ的方法

Csdn user default icon
上传中...
上传图片
插入图片