zoukankan      html  css  js  c++  java
  • JDK1.7源码分析01-Collection

    同步发布:http://www.yuanrengu.com/index.php/20180221.html

    Java的集合类主要由两个接口派生而出:Collection和Map。Collection是一个接口,它主要的两个分支为List和Set,Map的介绍会在后面的系列中进行详细的分析。如下图所示为Collection接口、子接口及其实现类的继承树。

    源码分析如下:

    package java.util;
    
    /**
     * Collection继承了迭代器的接口,即整个集合类都采用了迭代器模式
     */
    public interface Collection<E> extends Iterable<E> {
        // Query Operations
    
        /**
         * 返回集合的大小。
         * 如果集合的大小超过Integer.MAX_VALUE,则返回Integer.MAX_VALUE
         */
        int size();
    
        /**
         * 判断集合是否为空
         */
        boolean isEmpty();
    
        /**
         * 判断集合中是否有元素o。
         * 这里要特别注意下元素o是否与集合里的元素类型兼容,以及o是否为null
         */
        boolean contains(Object o);
    
        /**
         * 返回集合中元素的迭代器,但不能保证返回顺序(除非集合指定了顺序)
         */
        Iterator<E> iterator();
    
        /**
         * 返回一个数组(包含集合中所有的元素)。
         * 如何集合中的元素是有序的,则返回的数组中的元素也是有序的。
         * 这个方法可用于集合与数组之间的转换
         */
        Object[] toArray();
    
        /**
         * 以数组形式返回指定数组类型的集合元素
         */
        <T> T[] toArray(T[] a);
    
        // Modification Operations
    
        /**
         * 用于向集合里添加元素
         * 如果集合对象被添加操作改变了则返回true
         */
        boolean add(E e);
    
        /**
         * 删除元素
         */
        boolean remove(Object o);
    
        // Bulk Operations
    
        /**
         * 用来判断是否含有指定集合c中的所有元素
         */
        boolean containsAll(Collection<?> c);
    
        /**
         * 将指定集合c中的所有元素添加至调用者的集合中
         */
        boolean addAll(Collection<? extends E> c);
    
        /**
         * 删除集合中所包含的c里面的元素
         */
        boolean removeAll(Collection<?> c);
    
        /**
         * 保留与集合c中相同的元素(即移除与指定集合不同的元素)
         * 相当于把调用该方法的集合变成该集合和集合c的交集
         */
        boolean retainAll(Collection<?> c);
    
        /**
         * 清除集合里的所有元素,集合长度变为0
         */
        void clear();
    
    
        // Comparison and hashing
    
        /**
         * 判断与指定元素是否相等
         */
        boolean equals(Object o);
    
        /**
         * 返回集合的哈希码值
         */
        int hashCode();
    }
    

    Collection继承了Iterable,如图所示:

    Iterable源码分析如下:

    /**
     * 迭代器接口
     */
    public interface Iterable<T> {
    
        /**
         * 返回元素类型为T的迭代器
         */
        Iterator<T> iterator();
    }
    

    其中Iterator的源码如下:

    /**
     * 迭代器接口类
     */
    public interface Iterator<E> {
    
        /**
         * 如果被迭代的集合元素还没有被遍历,则返回true
         */
        boolean hasNext();
    
        /**
         * 返回集合里的下一个元素
         */
        E next();
    
        /**
         * 删除集合里上一次next方法返回的元素
         */
        void remove();
    }
    

    Iterator仅用于遍历集合,Iterator本身并不提供装对象的能力。如果需要创建Iterator对象,则必须有一个被迭代的集合。Iterator必须依附于Collection对象,如有一个Iterator对象,则必然有一个与之关联的Collection对象。特别要注意的是,当使用Iterator对集合元素进行迭代时,Iterator并不是把集合元素本身传给了迭代变量,而是把集合元素的值传给了迭代变量,所以修改迭代变量的值对集合元素本身没有任何影响。  

     

      

  • 相关阅读:
    webpack4.x相关笔记整理
    vue原理探索--响应式系统
    git常用命令备忘
    小程序开发知识点及坑点总结
    无异常日志,就不能排查问题了???
    【从单体架构到分布式架构】(三)请求增多,单点变集群(2):Nginx
    【从单体架构到分布式架构】(二)请求增多,单点变集群(1):负载均衡
    【从单体架构到分布式架构】(一)万丈高楼平地起:环境准备
    一个接口查询关联了十几张表,响应速度太慢?那就提前把它们整合到一起
    docker基础:容器操作命令
  • 原文地址:https://www.cnblogs.com/heyonggang/p/8477215.html
Copyright © 2011-2022 走看看