黑马程序员技术交流社区

标题: 为什么集合框架类能够直接打印? [打印本页]

作者: 王少岩    时间: 2012-8-11 23:16
标题: 为什么集合框架类能够直接打印?
比如ArrayList、LinkedList、HashSet、TreeSet、HashMap等直接用输出语句System.out.println(这些集合类的实力对象);就能够把他们里面存的内容全打印出来,而不必试用迭代器打印
如:
ArrayList al= new ArrayList ();
  al.add("aaaa");
  al.add("bbbb");
  al.add("cccc");
  al.add("dddd");
  sop(al);//打印[aaaa,bbbb,cccc,dddd],为什么能打印出来,还有new ArrayList ()里面不是存的对象的地址值吗?那不是应该打印"aaaa"在内存中的地址值吗?为什么会打印[aaaa,...]这些,而不是四个地址值

作者: 郑正华    时间: 2012-8-11 23:29
因为这些集合框架重写了toString方法。就比如ArrayList,它是重写了AbstractCollection类的toString方法。你可以去查查API。
源码是这样的:
public String toString() {
    Iterator<E> i = iterator();
    if (! i.hasNext())
      return "[]";

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

作者: 王舜民    时间: 2012-8-12 00:32
郑正华 发表于 2012-8-11 23:29
因为这些集合框架重写了toString方法。就比如ArrayList,它是重写了AbstractCollection类的toString方法。 ...

就是这样?

接口 List<E>
所有超级接口:
Collection<E>, Iterable<E>
所有已知实现类:
AbstractList, AbstractSequentialList, ArrayList, AttributeList, CopyOnWriteArrayList, LinkedList, RoleList, RoleUnresolvedList, Stack, Vector

作者: 郑正华    时间: 2012-8-13 10:26
王舜民 发表于 2012-8-12 00:32
就是这样?

接口 List

对,集合的默认输出形式不一样是因为它们各自都自己覆写了toString方法
作者: 尤洋    时间: 2012-8-13 10:36
原因不用说的太复杂
其实就是这些集合框架重写了toString方法
而打印语句sop();中默认添加了一个toString()
所以打印时 sop(al);相当于sop(al.toString());
作者: 杨康    时间: 2012-8-13 10:39
因为你add的对象都是String类型的,打印的时候会自动调用toString()方法
作者: 王舜民    时间: 2012-8-13 10:41
郑正华 发表于 2012-8-13 10:26
对,集合的默认输出形式不一样是因为它们各自都自己覆写了toString方法

有够复杂的呢




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2