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

 

  

JDK1.7源码分析01-Collection的更多相关文章

  1. JDK1.8源码分析01之学习建议(可以延伸其他源码学习)

    序言:目前有个计划就是准备看一下源码,来提升自己的技术实力.同时现在好多面试官都喜欢问源码,问你是否读过JDK源码等等? 针对如何阅读源码,也请教了我的老师.下面就先来看看老师的回答,也许会有帮助呢. ...

  2. 【JUC】JDK1.8源码分析之ArrayBlockingQueue(三)

    一.前言 在完成Map下的并发集合后,现在来分析ArrayBlockingQueue,ArrayBlockingQueue可以用作一个阻塞型队列,支持多任务并发操作,有了之前看源码的积累,再看Arra ...

  3. 集合之TreeSet(含JDK1.8源码分析)

    一.前言 前面分析了Set接口下的hashSet和linkedHashSet,下面接着来看treeSet,treeSet的底层实现是基于treeMap的. 四个关注点在treeSet上的答案 二.tr ...

  4. 【1】【JUC】JDK1.8源码分析之ArrayBlockingQueue,LinkedBlockingQueue

    概要: ArrayBlockingQueue的内部是通过一个可重入锁ReentrantLock和两个Condition条件对象来实现阻塞 注意这两个Condition即ReentrantLock的Co ...

  5. 【集合框架】JDK1.8源码分析HashSet && LinkedHashSet(八)

    一.前言 分析完了List的两个主要类之后,我们来分析Set接口下的类,HashSet和LinkedHashSet,其实,在分析完HashMap与LinkedHashMap之后,再来分析HashSet ...

  6. 【集合框架】JDK1.8源码分析之HashMap(一) 转载

    [集合框架]JDK1.8源码分析之HashMap(一)   一.前言 在分析jdk1.8后的HashMap源码时,发现网上好多分析都是基于之前的jdk,而Java8的HashMap对之前做了较大的优化 ...

  7. 【集合框架】JDK1.8源码分析之ArrayList详解(一)

    [集合框架]JDK1.8源码分析之ArrayList详解(一) 一. 从ArrayList字表面推测 ArrayList类的命名是由Array和List单词组合而成,Array的中文意思是数组,Lis ...

  8. 集合之LinkedHashSet(含JDK1.8源码分析)

    一.前言 上篇已经分析了Set接口下HashSet,我们发现其操作都是基于hashMap的,接下来看LinkedHashSet,其底层实现都是基于linkedHashMap的. 二.linkedHas ...

  9. 集合之HashSet(含JDK1.8源码分析)

    一.前言 我们已经分析了List接口下的ArrayList和LinkedList,以及Map接口下的HashMap.LinkedHashMap.TreeMap,接下来看的是Set接口下HashSet和 ...

  10. 【1】【JUC】JDK1.8源码分析之ReentrantLock

    概要: ReentrantLock类内部总共存在Sync.NonfairSync.FairSync三个类,NonfairSync与FairSync类继承自Sync类,Sync类继承自AbstractQ ...

随机推荐

  1. 【转】查询SQLSERVER执行过的SQL记录

    --创建时间 QS.creation_time, --查询语句 ), (( THEN DATALENGTH(st.text) ) ) AS statement_text, --执行文本 ST.text ...

  2. Centos7-卸载自带的jdk 安装jdk8

    卸载JDK Centos7一般都会带有自己的openjdk,我们一般都回用oracle的jdk,所以要卸载 步骤一:查询系统是否以安装jdk #rpm -qa|grep java 或    #rpm ...

  3. 《UNIX实用教程》读书笔记

    原著:<Just Enough UNIX>  Fifth Edition  [美]Paul K.Andersen 译著:<UNIX实用教程> 第5版 宋虹 曾庆冬 段桂华 杨路 ...

  4. linkin大话面向对象--枚举

    枚举类(enum) 其实我们使用到枚举的地方还是很多的,其实我们可以完全人工的来实现枚举的功能.比如说我现在手里的项目我就是自己实现的枚举,说白了,枚举就是一个类的多例模式. 1,使用enum声明,默 ...

  5. ClearCase新增文件

    原文地址:http://blog.csdn.net/ace_fei/article/details/7531376 大家应该都知道在clearcase上新增文件是通过以下过程来生成的: clearto ...

  6. C# 多线程复习笔记

    编码的日子其实也有一段时间了,但是,作为一个客户端程序,因为自己是做游戏开发的,一直没有对线程这个概念比较模糊吧. 记录下线程的整理学习路线.原文:http://www.cnblogs.com/min ...

  7. Nginx+Geoserver部署所遇问题总结

    文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/ 1.背景 该问题的最终解决离不开公司大拿whs先生的指点,先表示感谢. ...

  8. oracle游标的知识点

    游标: 就是一个结果集(ResultSet) 游标语法: CURSOR 光标名 [(参数名 数据类型[,参数名 数据类型])] IS SELECT 语句; eg. cursor c1 is selec ...

  9. Python 定位桌面

    通过注册表寻找桌面路径: (用内置的winreg) import winreg key = winreg.OpenKey(winreg.HKEY_CURRENT_USER, \             ...

  10. 编译安装 python 2.7

    下载python2.7 Python-2.7.6.tgz 下载链接:http://pan.baidu.com/s/1c0AJDDI 配置./configure 编译make 安装 make insta ...