同步发布: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. python通过scapy模块进行arp断网攻击

    前言: 想实现像arpsoof一样的工具 arp断网攻击原理: 通过伪造IP地址与MAC地址实现ARP欺骗,在网络发送大量ARP通信量.攻击者 只要持续不断发送arp包就能造成中间人攻击或者断网攻击. ...

  2. 百万级别QPS轻量级PHP框架Steeze介绍

    系统简介   Steeze是一个优雅.简洁而又高效的PHP开源框架,在整合了知名框架ThinkPHP和Laravel优点的同时,重写了底层架构,增强了功能实现. 支持swoole模型运行,支持容器.模 ...

  3. jquery自定义进度条与h5原生进度条

      介绍一款自定义的进度条 <div class="box-nine"> <div class="progress"> <!--一 ...

  4. 【笔记】css浮动的一些个人见解

    看<css 权威指南>已经有差不多两个月时间了,正好最近读到浮动这一章写一写个人对立面的概念的一些见解吧. 说之前还真不得不说这本书卖之前以为会说得通俗易懂读后才发现其实有些概念从文意上理 ...

  5. VMware虚拟机上建立HTTP服务步骤

    1.使用xshell连接虚拟机,也可直接在虚拟机中敲命令. 以下是xshell上的命令: 首先安装HTTPD包 [root@one ~]# mount /dev/sr0 /mnt[root@one ~ ...

  6. python 函数返回多个参数的赋值方法

    #定义函数 def Get_Counter_AllMeasureValue(self, inst_dg_address): """ get all measure val ...

  7. cmd 指令

    dir  展示当前文件夹内的文件 mkdir 创建文件夹 c:  访问C盘 (d: f:) cd\ 返回主文件 cd .. 返回上一文件夹 cd test  打开文件夹 访问文件夹 rd 删除文件夹 ...

  8. Tomcat服务器的Web安全的解决方法

    .概述 在任何一种WEB应用开发中,不论大中小规模的,每个开发者都会遇到一些需要保护程序数据的问题,涉及到用户的LOGIN ID和PASSWORD.那么如何执行验证方式更好呢?实际上,有很多方式来实现 ...

  9. linkin大话面向对象--闭包和回调

      先来理解2个概念:闭包和回调   什么是闭包? 闭包是一个可调用的对象,它记录了一些信息,这些信息来自于创建他的作用域.通过这个定义,可以看出内部类是面向对象的闭包,因为他不仅包含了外部类对象的信 ...

  10. Spring 当 @PathVariable 遇上 【. # /】等特殊字符

    @PathVariable注解应该不是新鲜东西了Spring3.0就开始有了 URL中通过加占位符把参数传向后台 举个栗子,如下比较要说的内容比较简单就大概齐的写一下 画面侧 $.ajax({ typ ...