现在观察如下的代码:
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()方法。而后的类中只是继承。