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这一块,但是看了下面这个接口设计框架图:整个接口框架关系如下( ...
随机推荐
- 面试常考的js题目(三)
1.查找两个节点的最近的一个共同父节点,可以包括节点自身 function commonParentNode(oNode1, oNode2) { if(oNode1.contains(oNode2)) ...
- git 的用法和命令
学无止境,精益求精! 十年河东,十年河西,莫欺少年穷! 学历代表你的过去,能力代表你的现在,学习代表你的将来! 很久没写博客了,都是工作太忙闹的,索性今儿转发一篇!省的博客园太冷清了... Git图形 ...
- HBASE学习笔记(五)
一.HBase的RowKey设计原则 1.我们知道HBase是三维有序存储的,通过RowKey(行键),ColumnKey(Column family和qualifier)和TimeStamp(时间戳 ...
- ES6入门四:对象字面量扩展与字符串模板字面量
简洁属性与简洁方法 计算属性名与[[prototype]] super对象(暂时保留解析) 模板字面量(模板字符串) 一.简洁属性与简洁方法 ES6中为了不断优化代码,减低代码的耦合度在语法上下了很大 ...
- js定时器 离开当前页面任然执行的问题
今天在博客上看到有人问 js定时器-----离开当前页面原本匀速运动的div加速了,回到页面若干时间恢复匀速??? 他是js定时器控制一个盒子做旋转动画 离开页面后js还在执行 但是盒子这个dom却被 ...
- <%%> <%! %> <%=%> <%-- --%> jsp中jstl一些运用
<%%> 这里面可以添加java代码片段<%! %> 这里添加java方法 主要是用来声明变量的 <%=%> 将变量或表达式值输出到页面<%-- --%> ...
- docker 概念 | 安装 | 基本使用
Docker 是世界领先的软件容器平台,所以想要搞懂Docker的概念我们必须先从容器开始说起. 一 先从认识容器开始 先来看看容器较为官方的解释 一句话概括容器:容器就是将软件打包成标准化单元,以用 ...
- frp 路由穿透(github开源穿透软件)
server配置(windows):下载: https://github.com/fatedier/frp/releases [common] # 服务器端端口 bind_port = # 客户端连接 ...
- Repeater循环页面上的控件
List<string> list = new List<string>(); for (int k = 0; k < RepeaterList.Items.Count; ...
- PostMan 中使用Datas 文件一次Run 只能使用一个
PostMan 一次run 只能有一个文件. Note that you can only use one data file for one run.