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并不是把集合元素本身传给了迭代变量,而是把集合元素的值传给了迭代变量,所以修改迭代变量的值对集合元素本身没有任何影响。  

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏水击三千

浅谈JavaScript的面向对象程序设计(三)

  前面已经对JavaScript的面向对象程序设计作了简单的介绍,包括了对象的属性、对象的工厂模式、构造函数和原型等。通过介绍,这些创建对象的方法依然有不少优...

24050
来自专栏个人分享

Scala语法笔记

JAVA中,举例你S是一个字符串,那么s(i)就是该字符串的第i个字符(s.charAt(i)).Scala中使用apply的方法

22220
来自专栏mathor

1小时掌握c++面向对象编程

使用对象指针实参仅将对象的地址值传递给形参,而不进行副本的拷贝,这样可以提高运行效率,减少时间开销

8110
来自专栏吾爱乐享

java之学习int和String的相互转换

9710
来自专栏猿人谷

const用法小结

常类型是指使用类型修饰符const说明的类型,常类型的变量或对象的值是不能被更新的。因此,定义或说明常类型时必须进行初始化。 概述 1. const有什么...

18970
来自专栏机器学习算法与Python学习

python: sort, sorted, reverse

python语言中的列表排序方法有三个:reverse反转/倒序排序、sort正序排序、sorted可以获取排序后的列表。在更高级列表排序中,后两中方法还可以加...

38480
来自专栏黑泽君的专栏

final关键字、多态、抽象类、接口的小复习

--------------------------------------- 1:final关键字可以干什么?有什么特点?   最终的意思。可以修饰类,方法...

10820
来自专栏猿人谷

运算符重载

  C++中预定义的运算符的操作对象只能是基本数据类型。但实际上,对于许多用户自定义类型(例如类),也需要类似的运算操作。这时就必须在C++中重新定义这些运算符...

23670
来自专栏流媒体

C++类大小和静态成员/方法

10050
来自专栏水击三千

浅谈JavaScript的面向对象程序设计(二)

  前面介绍通过Object构造函数或者字面量创建单个对象,但是通过这个的方法创建对象有明显的缺点:调用同一个接口创建多个实例,会产生大量的重复代码。怎么样解决...

25060

扫码关注云+社区

领取腾讯云代金券