Iterable与Collection源码学习
接口 - Iterable<T> - 可迭代
描述
实现本接口的类,其对象可以被迭代.同时支持forEach语法
方法
Iterator<T> iterator()
类型
抽象方法
描述
返回一个用于执行迭代的java.util.Iterator对象
代码
Iterator<T> iterator();
default void forEach(Consumer<? super T> action)
类型
抽象默认方法
描述
遍历所有元素并分别传递给action方法
代码
default void forEach(Consumer<? super T> action) {
Objects.requireNonNull(action);
for (T t : this) {
action.accept(t);
}
}
default Spliterator<T> spliterator()
类型
抽象默认方法
描述
返回一个Spliterator<T>对象
代码
default Spliterator<T> spliterator() {
return Spliterators.spliteratorUnknownSize(iterator(), 0);
}
接口 - Collection<E>
继承
Iterable
实现
描述
规定了所有集合需要实现的方法
方法
int size()
类型
抽象方法
描述
返回当前集合的元素数量.当超过Integer.MAX_VALUE时,返回Integer.MAX_VALUE.
代码
int size();
isEmpty()
类型
抽象方法
描述
当前集合中不包含任何元素时,返回true
代码
boolean isEmpty();
contains(Object o)
类型
抽象方法
描述
当前集合中包含一个或以上的指定元素时,返回true.否则返回false
代码
boolean contains(Object o);
toArray()
类型
抽象方法
描述
返回一个包含当前集合中所有元素的数组.如果当前集合是有序集合,则这个数组中的元素顺序应该与此有序集合中的顺序相同.
同时,返回的数组必须是一个新端的数组.可以让调用者自由的修改返回数组的结构.而不影响本集合.
代码
Object[] toArray();
toArray(T[] a)
类型
抽象方法
描述
与toArray()相似.返回数据类型使用运行时类型(也就是这里的T).
当参数a可以容纳当前集合中的元素时,此方法会将当前集合内的元素放入参数a中,并在防止最后一个元素的再后面的一个位置设置为null.
当参数a无法容纳当前集合中的元素时,会返回一个新数组
代码
<T> T[] toArray(T[] a);
add(E e)
类型
抽象方法
描述
添加元素到当前集合中.当集合被修改时,将会返回true.否则返回false
在源码的注释中,提到了对于null,重复元素,与一些特殊情况下的处理措施.如不再返回false而是抛出异常等.这要看具体的实现了.
代码
boolean add(E e);
remove(Object o)
类型
抽象方法
描述
删除集合中的指定元素.当集合被更改时,返回true
代码
boolean remove(Object o);
containsAll(Collection<?> c)
类型
抽象方法
描述
给定集合中的所有元素均在当前集合中存在时,返回true
代码
boolean containsAll(Collection<?> c);
addAll(Collection<? extends E> c)
类型
抽象方法
描述
添加给定集合中的全部元素到当前集合中
这里源码注释中提出了一些为确认的情况.
- 参数
c在操作中被改变(这里一般是多线程共用一个对象时引起的). - 参数
c就是当前集合(OOM~).
代码
boolean addAll(Collection<? extends E> c);
removeAll(Collection<?> c)
类型
抽象方法
描述
删除当前集合中的出现在参数c集合中的全部元素
代码
boolean removeAll(Collection<?> c);
removeIf(Predicate<? super E> filter)
类型
抽象默认方法
描述
根据Predicate(断言),删除全部元素
这里直接使用iterator(),进行迭代,断言,删除操作
代码
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;
}
retainAll(Collection<?> c)
类型
抽象方法
描述
删除掉当前集合中,不包含在参数c集合中的全部元素
代码
boolean retainAll(Collection<?> c);
clear()
类型
抽象方法
描述
清除集合中的全部元素
代码
void clear();
equals(Object o)
类型
抽象方法
描述
以重写的方式,将java.lang.Object.equals方法设置为抽象方法.约束子类实现equals方法
代码
boolean equals(Object o);
hashCode()
类型
抽象方法
描述
以重写的方式,将java.lang.Object.hashCode方法设置为抽象方法.约束子类实现hashCode方法
代码
int hashCode();
Iterable与Collection源码学习的更多相关文章
- Java集合专题总结(1):HashMap 和 HashTable 源码学习和面试总结
2017年的秋招彻底结束了,感觉Java上面的最常见的集合相关的问题就是hash--系列和一些常用并发集合和队列,堆等结合算法一起考察,不完全统计,本人经历:先后百度.唯品会.58同城.新浪微博.趣分 ...
- 源码学习之ASP.NET MVC Application Using Entity Framework
源码学习的重要性,再一次让人信服. ASP.NET MVC Application Using Entity Framework Code First 做MVC已经有段时间了,但看了一些CodePle ...
- JDK源码学习系列05----LinkedList
JDK源码学习系列05----LinkedList 1.LinkedList简介 LinkedList是基于双向链表实 ...
- JDK源码学习系列04----ArrayList
JDK源码学习系列04----ArrayList 1. ...
- 【 js 基础 】【 源码学习 】源码设计 (持续更新)
学习源码,除了学习对一些方法的更加聪明的代码实现,同时也要学习源码的设计,把握整体的架构.(推荐对源码有一定熟悉了之后,再看这篇文章) 目录结构:第一部分:zepto 设计分析第二部分:undersc ...
- Spring源码学习-容器BeanFactory(三) BeanDefinition的创建-解析Spring的默认标签
写在前面 上文Spring源码学习-容器BeanFactory(二) BeanDefinition的创建-解析前BeanDefinition的前置操作中Spring对XML解析后创建了对应的Docum ...
- Underscore.js 源码学习笔记(上)
版本 Underscore.js 1.9.1 一共 1693 行.注释我就删了,太长了… 整体是一个 (function() {...}()); 这样的东西,我们应该知道这是一个 IIFE(立即执行 ...
- 【 js 基础 】【 源码学习 】源码设计 (更新了backbone分析)
学习源码,除了学习对一些方法的更加聪明的代码实现,同时也要学习源码的设计,把握整体的架构.(推荐对源码有一定熟悉了之后,再看这篇文章) 目录结构:第一部分:zepto 设计分析 第二部分:unders ...
- Asp.NetCore源码学习[2-1]:日志
Asp.NetCore源码学习[2-1]:日志 在一个系统中,日志是不可或缺的部分.对于.net而言有许多成熟的日志框架,包括Log4Net.NLog.Serilog 等等.你可以在系统中直接使用这些 ...
随机推荐
- 第九次作业——DFA最小化,语法分析初步
老师:MissDu 提交作业 1.将DFA最小化:教材P65 第9题 答: 2.构造以下文法相应的最小的DFA S→ 0A|1B A→ 1S|1 B→0S|0 3.自上而下语法分析,回溯产生的原因是 ...
- 获取iOS设备的型号
获取iOS设备的型号 需要#import "sys/utsname.h" structutsname systemInfo; uname(&systemIn ...
- 带你从头到尾捋一遍MySQL索引结构(2)
前言 Hello我又来了,快年底了,作为一个有抱负的码农,我想给自己攒一个年终总结.索性这次把数据库中最核心的也是最难搞懂的内容,也就是索引,分享给大家. 这篇博客我会谈谈对于索引结构我自己的看法,以 ...
- java的传参究竟是按值传递的还是按引用传递的
这里来弄清楚Java的传参究竟是按值传递的还是按引用传递的. 形参和实参 传参的概念里,有形参和实参的区分.形参是定义方法名和方法体的时候使用的参数,目的是用来接收调用该方法的时候传入的参数:实参是调 ...
- CentOS 8安装
1.VMware workstation14Pro安装 下载蓝点网,序列号也有,直接输入,永久激活 2.CentOS8下载 CentOS8下载地址:清华源 3.CentOS8安装
- 【Vuejs】335-(超全) Vue 项目性能优化实践指南
点击上方"前端自习课"关注,学习起来~ 前言 Vue 框架通过数据双向绑定和虚拟 DOM 技术,帮我们处理了前端开发中最脏最累的 DOM 操作部分, 我们不再需要去考虑如何操作 D ...
- 据说60%的Java程序员不明白分布式一致性?这次彻底搞懂!
前言 在计算机科学领域,分布式一致性是一个相当重要且被广泛探索与论证问题,首先来看三种业务场景. 1.火车站售票 假如说我们的终端用户是一位经常坐火车的旅行家,通常他是去车站的售票处购买车票,然后拿着 ...
- tomcat session共享
1.版本 redis3.2 nginx tomcat8.5 2.下载jar包 tomcat-cluster-redis-session-manager 解压后大家可以看看 readMe.tx ...
- Windows下mysql-5.7.28下载、安装、配置教程
最近需要更换mysql数据库的版本,写一篇文章,记录一下 一.下载mysql数据库 mysql的下载共有两种,一种是zip压缩文件,另一种是msi安装程序 官方5.7版本zip压缩文件下载页面 官方5 ...
- 小公举-linux的计算器
1.一个方便的linux计算器,精巧而强大bc 2..进行简单的四则运算 3.连续的四则运算 4.大数运算 5.求次幂和余数 6.如果要执行小数计算呢,需要设置scale=number ,number ...