A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 王少岩 中级黑马   /  2012-8-11 23:16  /  2291 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

比如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,...]这些,而不是四个地址值

6 个回复

倒序浏览
因为这些集合框架重写了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-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-12 00:32
就是这样?

接口 List

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

有够复杂的呢
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马