本文我们主要学习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. DispatcherTimer和Timer的区别

    两者区别是 Timer在非UI线程跑的,DispatcherTimer是在UI线程跑的, DispatcherTimer 可以直接更新UI Timer必须使用this.Dispatcher.Begin ...

  2. 服务端相关知识学习(六)Zookeeper client

    Zookeeper的client是通过Zookeeper类提供的.前面曾经说过,Zookeeper给使用者提供的是一个类似操作系统的文件结构,只不过这个结构是分布式的.可以理解为一个分布式的文件系统. ...

  3. Ubuntu 忘记系统登录密码,如何修改密码

    Ubuntu 忘记系统登录密码,如何修改密码. 1.重新启动,按ESC键进入Boot Menu,选择recovery mode(一般是第二个选项). 2.在#号提示符下用cat /etc/shadow ...

  4. O041、Resize Instance 操作详解

    参考https://www.cnblogs.com/CloudMan6/p/5548294.html   Resize 的作用是调整instance的vCPU.内存和磁盘资源.   Instance  ...

  5. Js的原型和原型链讲解

    原型:每个对象都会在其内部初始化一个属性,就是prototype 原型链:当我们访问一个对象的属性时,如果这个对象内部不存在这个属性,那么他就会去prototype中去找,这个prototype中会有 ...

  6. haproxy实现ssl套接字加密

    概述 如果你的应用使用SSL证书,则需要决定如何在负载均衡器上使用它们. 单服务器的简单配置通常是考虑客户端SSL连接如何被接收请求的服务器解码.由于负载均衡器处在客户端和更多服务器之间,SSL连接解 ...

  7. windows 下Nginx 入门

    验证配置是否正确: nginx -t 查看Nginx的版本号:nginx -V 启动Nginx:start nginx 快速停止或关闭Nginx:nginx -s stop 正常停止或关闭Nginx: ...

  8. 【Day2】1.循环结构

     视频地址(全部) https://edu.csdn.net/course/detail/26057 课件地址(全部) https://download.csdn.net/download/gentl ...

  9. mysql_jdbc连接说明

    mysql JDBC Driver 常用的有两个,一个是gjt(Giant Java Tree)组织提供的mysql驱动,其JDBC Driver名称(JAVA类名)为:org.gjt.mm.mysq ...

  10. 05.Zabbix自动化监控

    1.Zabbix自动发现(被动) 网络发现官方手册 网络发现由两个阶段组成:发现discovery和动作actions 1.单击配置->自动发现->启动默认的Local network 2 ...