本文我们主要学习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. warning LNK4076: 无效的增量状态文件“../×××.ilk”;正在非增量链接

      VS编译警告:warning LNK4076: 无效的增量状态文件“../×××.ilk”;正在非增量链接 解决方法:删除程序提示的输出目录的×××.ilk,重新编译,即可

  2. centos7---ansible批量部署

    CentOS7系统 ansible自动化部署多台服务器部署   Ansible工作机制  从图中可以看出ansible分为以下几个部份: 1> Control Node:控制机器2> In ...

  3. react+antd引入 阿里图标

    import iconfont from '../../../../assets/fonts/iconfont.js' const Iconfont = Icon.createFromIconfont ...

  4. dhcpd.conf配置文件几例

    例1   ddns-update-style interim; ignore client-updates; subnet 192.168.222.0 netmask 255.255.255.0 { ...

  5. 解决myeclipse没有代码提示的问题

    今天和室友安装了一样的myeclipse版本,结果室友的自动提示功能有,我的输入“.”后却不能提示,这对我们敲代码简直来说是一个折磨,不能自动提示,本来还以为是系统问题,一个是win7,一个是win1 ...

  6. 2.2.EJB_Bean

    1.EJB中的三种Bean 1.会话bean(sessionbean) 负责与客户端交互.是编写业务逻辑的地方.在会话Bean中可以通过jdbc直接操作数据厍.但大多数情况下都是通过实体bean来完 ...

  7. mongo批量插入问题(insert_many,bulk_write),spark df转json传入mongo

    https://blog.csdn.net/nihaoxiaocui/article/details/95060906 https://xuexiyuan.cn/article/detail/173. ...

  8. notepad++ 二进制插件

    https://jingyan.baidu.com/article/6fb756ec457aca241858fba6.html winhex

  9. 差分约束详解&&洛谷SCOI2011糖果题解

    差分约束系统: 如果一个系统由n个变量和m个约束条件组成,形成m个形如ai-aj≤k的不等式(i,j∈[1,n],k为常数),则称其为差分约束系统(system of difference const ...

  10. vs调试时,不显示局部变量

    为了测试一个函数的返回值,就在某个函数里加了一个局部变量,调试却不显示所添加变量的信息. 你一定设置成了release 模式.改为debug就可以了. 比较弱智的问题,mark一下.