zoukankan      html  css  js  c++  java
  • 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()方法。而后的类中只是继承。

  • 相关阅读:
    JDBC数据库连接池的实现
    在java项目中引入dll文件
    动态调用WebService(支持SaopHeader)
    获取CPU,硬盘,网卡信息
    js调用本地程序
    ClickOnce发布的一点小经验总结
    为程序设置快捷键
    构建返回友好信息的WebService
    使用DataReader分页的测试
    【bug】internal class GetCountOfEntitiesByCriterionHibernateCallback : IHibernateCallback<int>
  • 原文地址:https://www.cnblogs.com/future-liu1121/p/7360053.html
Copyright © 2011-2022 走看看