Java集合框架之接口Collection源码分析
本文我们主要学习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源码分析的更多相关文章
- Java集合框架之一:ArrayList源码分析
版权声明:本文为博主原创文章,转载请注明出处,欢迎交流学习! ArrayList底层维护的是一个动态数组,每个ArrayList实例都有一个容量.该容量是指用来存储列表元素的数组的大小.它总是至少等于 ...
- 【集合框架】JDK1.8源码分析之ArrayList详解(一)
[集合框架]JDK1.8源码分析之ArrayList详解(一) 一. 从ArrayList字表面推测 ArrayList类的命名是由Array和List单词组合而成,Array的中文意思是数组,Lis ...
- 【集合框架】JDK1.8源码分析之HashMap(一) 转载
[集合框架]JDK1.8源码分析之HashMap(一) 一.前言 在分析jdk1.8后的HashMap源码时,发现网上好多分析都是基于之前的jdk,而Java8的HashMap对之前做了较大的优化 ...
- 【集合框架】JDK1.8源码分析之ArrayList(六)
一.前言 分析了Map中主要的类之后,下面我们来分析Collection下面几种常见的类,如ArrayList.LinkedList.HashSet.TreeSet等.下面通过JDK源码来一起分析Ar ...
- 【集合框架】JDK1.8源码分析之LinkedList(七)
一.前言 在分析了ArrayList了之后,紧接着必须要分析它的同胞兄弟:LinkedList,LinkedList与ArrayList在底层的实现上有所不同,其实,只要我们有数据结构的基础,在分析源 ...
- 【集合框架】JDK1.8源码分析之Comparable && Comparator(九)
一.前言 在Java集合框架里面,各种集合的操作很大程度上都离不开Comparable和Comparator,虽然它们与集合没有显示的关系,但是它们只有在集合里面的时候才能发挥最大的威力.下面是开始我 ...
- 【集合框架】JDK1.8源码分析之Collections && Arrays(十)
一.前言 整个集合框架的常用类我们已经分析完成了,但是还有两个工具类我们还没有进行分析.可以说,这两个工具类对于我们操作集合时相当有用,下面进行分析. 二.Collections源码分析 2.1 类的 ...
- Java集合详解及List源码分析
对于数组我们应该很熟悉,一个数组在内存中总是一块连续的存储空间,数组的创建使用new关键字,数组是引用类型的数据,一旦第一个元素的位置确定,那么后面的元素位置也就确定了,数组有一个最大的局限就是数组一 ...
- java集合【13】——— Stack源码分析走一波
前言 集合源码分析系列:Java集合源码分析 前面已经把Vector,ArrayList,LinkedList分析完了,本来是想开始Map这一块,但是看了下面这个接口设计框架图:整个接口框架关系如下( ...
随机推荐
- Vue生命周期及业务场景使用
vue里的生命周期是什么? vue实例从创建到销毁的过程称之为vue的生命周期 vue的生命周期各阶段都做了什么? beforeCreate 实例创建前:这个阶段实例的data.methods是读不到 ...
- tftp服务器的搭建和使用
一.tftp介绍 TFTP(Trivial File Transfer Protocol,简单文件传输协议)是TCP/IP协议族中的一个用来在客户机与服务器之间进行简单文件传输的协议,==提供不复 ...
- 不支持javascript的浏览器将JS脚本显示为页面内容
不支持javascript的浏览器将JS脚本显示为页面内容.为了防止这种情况发生,您可以使用这样的HTML注释标记:<html ><体><script type=“tex ...
- [CSS] w3c 盒模型 和 IE 盒模型
- 从无建立一个vue项目
node.js安装 首先安装Node,官网地址 :https://nodejs.org/en/download/ ,进去下载关于符合自己电脑的下载. 具体的Node安装步骤参考地址: https:// ...
- 工作总结 [ActionName("ss123")] 更改路由中Action名称 获取或设置操作的名称
- navicat连接阿里云mysql
1.服务器控制台在安全组配置3306端口 2.进入 /etc/ssh/sshd_config 在最下面 加入下面代码 KexAlgorithms diffie-hellman-group1-sha1, ...
- Binlog_master
二进制日志 记录导致数据改变或潜在导致数据改变的SQL语句 记录已提交的日志 不依赖于存储引擎类型 功能:通过"重放"日志文件中的事件来生成数据副本 注意:建议二进制日志和数据文件 ...
- 前端入门Js笔记
T 001 ____________--信息页面展示 需求分析: 有一个页面,在页面上有很多文字信息,且格式不一. 技术分析: html: 文字标签: 字体标签: 标题标签: 其他标签: 排版标签: ...
- Python lambda 知识点
作者说学会了lambda后,你会用上瘾的,因为让代码复用和简洁. 初识lamdba不太好理解,尤其是它能当着一个变量传递给函数,不过多学着写几个例子就好了,下面是我的学习笔记. lambda 操作符( ...