Java集合框架之Colletion之toString的来源

现在观察如下的代码:

package CollectionDemo;


import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;

public class testCollection {
    public static void main(String[] args) {
        Collection c = new ArrayList();
        //定义了两个元素
        c.add("孙悟空");
        c.add(6);

        System.out.println("c集合里的元素个数是:"+c.size());

        //删除元素
        c.remove(6);
        System.out.println("c集合里的元素个数是:"+c.size());
        //判断是否包含指定的字符串
        System.out.println("c集合中是否包含孙悟空的字符串"+c.contains("孙悟空"));
        c.add("轻量级java EE企业级应用实践");
        System.out.println("c集合中的元素是:"+c);

        Collection books = new HashSet();
        books.add("轻量级java EE企业级应用实践");
        books.add("疯狂java讲义");
        System.out.println("c集合中是否完全包含books集合:"+c.containsAll(books));
        //从c中删除了books所包含的元素
        c.removeAll(books);
        System.out.println("c集合中的元素:"+c);
        //删除c中的所有的元素
        c.clear();
        System.out.println("c集合中的元素:"+c);
        //books集合和c集合求交集
        books.retainAll(c);
        System.out.println("books集合里的元素"+books);



    }
}

  

其中有一行代码是:System.out 的println方法中可以直接输出一个集合的变量,而不需要迭代输出,感到很好奇,为什么呢?书上有一句话说是 “所有的Collection实现类都重写了toString()方法,然后我就去源码进行了查看,发现ArrayList中并没有,去查了Set的源码发现也没有,最后在逐层的向上查找中发现在AbstractCollection中有一个重写了Object的toString()方法,而后来的类都是继承了AbstractCollection或者是其父类继承了该类,从而才使得println的方法中可以直接输出的。这里说一下继承关系

public class ArrayList<E> extends AbstractList<E>
        implements List<E>, RandomAccess, Cloneable, java.io.Serializable


public abstract class AbstractList<E> extends AbstractCollection<E> implements List<E> {



public abstract class AbstractCollection<E> implements Collection<E> {

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(' ');
        }
    }

从这里可以看到这些类或者接口之间的关系,在AbstractCollection类中重写了toString()方法。而后的类中只是继承。

原文地址:https://www.cnblogs.com/future-liu1121/p/7360053.html