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