本文我们主要学习Java集合框架的根接口Collection,通过本文我们可以进一步了解Collection的属性及提供的方法。在介绍Collection接口之前我们不得不先学习一下Iterable,因为Collection接口继承了它。

Collection接口类图

从类图中我们看到Collection接口继承了Iterable接口

Iterable源码分析

由类图我们可以发现,Iterable接口有三个方法,其中两个方法使用default修饰的,这是jdk1.8的新特性,允许接口中有默认实现方法,其实现类中可以有选择的重写这部分方法,下面我们看一下每个方法的作用是什么:

#返回元素类型为T的迭代器,有了这个迭代器就可以对集合中元素进行遍历
Iterator<T> iterator(); #遍历集合中的元素并对元素进行执行操作,直到遍历完成或抛出异常
default void forEach(Consumer<? super T> action) {
Objects.requireNonNull(action);
for (T t : this) {
action.accept(t);
}
} #Spliterator(splitable iterator可分割迭代器),对集合进行并行遍历
default Spliterator<T> spliterator() {
return Spliterators.spliteratorUnknownSize(iterator(), 0);
}

Iterable接口总结:

默认为所有集合类添加了两个方法,

一个是遍历并处理集合元素

一个是可分割迭代器,与方法iterator相比,一个是顺序遍历,一个是并行遍历

Collection接口源码分析

    //查询操作,以下方法属于查询操作
#返回集合中元素数量,如果元素数量大于Integer.MAX_VALUE将返回Integer.MAX_VALUE
int size(); #如果集合中没有元素,将返回true,否则返回false
boolean isEmpty(); #如果集合中包含指定的元素,则返回true,否则false
boolean contains(Object o); #返回该集合中元素的迭代器。对于返回元素的顺序,没有任何保证。
Iterator<E> iterator(); #如果此集合对其迭代器返回的元素的顺序有任何保证,则该方法必须以相同的顺序返回元素。
#这个方法必须分配一个新数组,即使这个集合是由数组组成的。
#这个方法充当集合与数组之间转换的桥梁
Object[] toArray(); #返回一个包含集合中所有元素的数组
#如果集合中的元素类型与指定数组类型相匹配则直接按照元素中数组类型返回
#否则,将使用指定数组的运行时类型和该集合的大小分配新的数组。
#如果此集合对其迭代器返回的元素的顺序有任何保证,则该方法必须以相同的顺序返回元素。
#T:返回数组的类型
#a:如果该数组足够大可以容纳集合中所有元素,则使用该数组存储,否则将根据集合大小和元素类型重新创建一个数组
<T> T[] toArray(T[] a); // 修改操作,以下方法属于修改操作 #向集合中添加元素,如果该元素在集合中已经存在则返回false,否则返回true
#集合本身对添加的元素会有所限制,比如有些集合拒绝添加null
boolean add(E e); #从集合中删除指定元素,如果指定的元素存在集合中并完成了删除操作,则返回true
boolean remove(Object o); // 批量操作 #如果集合中包含指定的所有元素,则返回true
boolean containsAll(Collection<?> c); #将指定集合中的所有元素添加到此集合
#如果在运行过程中修改指定的集合,则该操作的行为是未定义的
boolean addAll(Collection<? extends E> c); #从当前集合中移除指定集合中的所有元素
boolean removeAll(Collection<?> c); # @since 1.8
#删除该集合中满足给定谓词的所有元素
#在迭代期间抛出的任何异常都会传递给调用者
default boolean removeIf(Predicate<? super E> filter) {
Objects.requireNonNull(filter);
boolean removed = false;
final Iterator<E> each = iterator();
while (each.hasNext()) {
if (filter.test(each.next())) {
each.remove();
removed = true;
}
}
return removed;
} #只保留集合中指定的元素
boolean retainAll(Collection<?> c); #清空集合中所有元素
void clear(); // 比较和散列 #比较指定对象与当前集合是否相等
#@see Object#equals(Object)
#@see Set#equals(Object)
#@see List#equals(Object)
boolean equals(Object o); #@see Object#hashCode()
#@see Object#equals(Object)
#返回当前对象的哈希值
int hashCode(); #@since 1.8
#创建一个集合的并行迭代器
@Override
default Spliterator<E> spliterator() {
return Spliterators.spliterator(this, 0);
} #@since 1.8
#将当前集合作为数据源,创建一个序列流
default Stream<E> stream() {
return StreamSupport.stream(spliterator(), false);
} #@since 1.8
#将当前集合作为数据源,创建一个可并行计算的序列流
default Stream<E> parallelStream() {
return StreamSupport.stream(spliterator(), true);
}

Java集合框架之接口Collection源码分析的更多相关文章

  1. Java集合框架之一:ArrayList源码分析

    版权声明:本文为博主原创文章,转载请注明出处,欢迎交流学习! ArrayList底层维护的是一个动态数组,每个ArrayList实例都有一个容量.该容量是指用来存储列表元素的数组的大小.它总是至少等于 ...

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

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

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

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

  4. 【集合框架】JDK1.8源码分析之ArrayList(六)

    一.前言 分析了Map中主要的类之后,下面我们来分析Collection下面几种常见的类,如ArrayList.LinkedList.HashSet.TreeSet等.下面通过JDK源码来一起分析Ar ...

  5. 【集合框架】JDK1.8源码分析之LinkedList(七)

    一.前言 在分析了ArrayList了之后,紧接着必须要分析它的同胞兄弟:LinkedList,LinkedList与ArrayList在底层的实现上有所不同,其实,只要我们有数据结构的基础,在分析源 ...

  6. 【集合框架】JDK1.8源码分析之Comparable && Comparator(九)

    一.前言 在Java集合框架里面,各种集合的操作很大程度上都离不开Comparable和Comparator,虽然它们与集合没有显示的关系,但是它们只有在集合里面的时候才能发挥最大的威力.下面是开始我 ...

  7. 【集合框架】JDK1.8源码分析之Collections && Arrays(十)

    一.前言 整个集合框架的常用类我们已经分析完成了,但是还有两个工具类我们还没有进行分析.可以说,这两个工具类对于我们操作集合时相当有用,下面进行分析. 二.Collections源码分析 2.1 类的 ...

  8. Java集合详解及List源码分析

    对于数组我们应该很熟悉,一个数组在内存中总是一块连续的存储空间,数组的创建使用new关键字,数组是引用类型的数据,一旦第一个元素的位置确定,那么后面的元素位置也就确定了,数组有一个最大的局限就是数组一 ...

  9. java集合【13】——— Stack源码分析走一波

    前言 集合源码分析系列:Java集合源码分析 前面已经把Vector,ArrayList,LinkedList分析完了,本来是想开始Map这一块,但是看了下面这个接口设计框架图:整个接口框架关系如下( ...

随机推荐

  1. mssql 数据库“查询处理器用尽了内部资源,无法生成查询计划。”问题的处理

    在项目中动态拼接sql语句,使用union all连接结果集,每个查询语句都使用了in(几百个数值).语句如: ,,,..............................) UNION ALL ...

  2. python 的面试题总汇

    函数作用域; LEGB : L>E>G>B L : local函数内部作用域 E : enclosing函数内部与内嵌函数之间 G : global全局作用域 B : build-i ...

  3. JSTreeShaking的webpack-deep-scope-plugin插件的应用

    webpack自身实现词法分析的JSTreeShaking webpack-depp-scope-plugin插件实现作用域分析的JSTreeShaking 一.webpack词法分析的JSTreeS ...

  4. React学习——子组件给父组件传值

    //子组件 var Child = React.createClass({ render: function(){ return ( <div> 请输入邮箱:<input onCha ...

  5. C# 斐波那契数列 第n项数字/前n项的和

    static void Main(string[] args) { int a = Convert.ToInt32(Console.ReadLine()); //求第n位数字是多少 Console.W ...

  6. OGG学习笔记03

    OGG学习笔记03-单向复制简单故障处理 环境:参考:OGG学习笔记02-单向复制配置实例实验目的:了解OGG简单故障的基本处理思路. 1. 故障现象故障现象:启动OGG源端的extract进程,da ...

  7. linux 删除文件空间未释放问题

    现象:我们测试环境上,导出数据文件时,由于作业报错,重复导出,空间使用到达100%,按理说,导出的文件时在相同的路径下,文件名也是一致的,会自动替换. 那么之前导出的文件会被删除,问题就出现在删除这一 ...

  8. 获得npm server 上 package 的版本信息

    通过这个命令可以获取package 的历史版本信息 npm view packagename   versions

  9. Intellij IDEA导入java项目看不到左边的项目目录结构

    1 重新import项目 然后导入完成,就可以了,再不行的话,删除.idea文件,重新import整个Project

  10. bootstap 表格自动换行 截取超长数据

    <table class="table" style="TABLE-LAYOUT:fixed;WORD-WRAP:break_word">