同步发布: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. 数据库复习总结(2)-SQLServer的管理

    1.需要安装SQLServer2008或者SQLServer2012,若要使用SQLServer管理工具进行开发还要安装SQL Server Management Studio,还可以使用Visual ...

  2. springMVC controller配置方式总结

    第一种:不配置controller 的bean.(注解的方式) 在dispatch-servlet.xml中,在beans节点下配置context:component-scan节点 <!-- 启 ...

  3. ExtJS是一种主要用于创建前端用户界面,是一个基本与后台技术无关的前端ajax框架。

    ExtJS是一种主要用于创建前端用户界面,是一个基本与后台技术无关的前端ajax框架.

  4. -------- ROOTKIT 核心技术——系统服务调度表挂钩调试(PART III) --------

    ---------------------------------------------------------------------------------------- 本篇开始进行真枪实弹的 ...

  5. 使用axios post 提交数据,后台获取不到提交的数据解决方案

    一.问题发现 前后端分离使用vue开发,结合axios进行前后端交互数据,一开始使用 get 请求,获取数据,没有发现任何问题,当使用 post请求 传参时,发现,数据明明已经提交,在打开F12 开发 ...

  6. docker 安装NexusRepository Manager

    今天学习了一下docker 感觉这东西要学习好多的命令,但是自己又是喜欢这种命令,感觉linux总是高一个等级的东西,这几天学习使用docker安装各种东西,下面记录一些我安装nexus的步骤,还是不 ...

  7. linkin大话设计模式--策略模式

    linkin大话设计模式--策略模式 Strategy [ˈstrætədʒi]  策略 策略模式用于封装系列的算法,这些算法通常被封装在一个称为Context的类中,客户端程序可以自由的选择任何一种 ...

  8. JavaWeb项目架构之Redis分布式日志队列

    架构.分布式.日志队列,标题自己都看着唬人,其实就是一个日志收集的功能,只不过中间加了一个Redis做消息队列罢了. 前言 为什么需要消息队列? 当系统中出现"生产"和" ...

  9. linux中的&&和||(linux中=和==效果是一样的)

    1. 命令1 && 命令2 命令1执行成功在执行命令2 2. 命令1 || 命令2 命令1执行失败后在执行命令2 我觉得这完全就是判断呀.

  10. 1、突然对jQuery的心血来潮

    起因 随着饿百新零售项目一期的告一段落,算是暂时从加班的修罗场里面解放出来了,于是就想搞点事情,正好看项目js库的时候发现了躺在角落的jQuery,想到当初看源码的时候断断续续的没有看完一直是心头的遗 ...