D - JDK17源码阅读 - 集合框架 - Collection<E> 接口 - 集合框架核心接口
提前
关于抽象的描述并不完全代表具体的实现,但是具体实现不会脱离抽象描述
关于这个接口,官方给的描述太多太多,不用看的太仔细,随意看看就好
集合层次结构中的根接口。 一个集合代表一组对象,称为它的元素。 一些集合允许重复元素,而另一些则不允许。 有些是有序的,有些是无序的。 JDK 不提供此接口的任何直接实现:它提供了更具体的子接口(如Set和List 。 此接口通常用于传递集合并在需要最大通用性的地方操作它们。
Bags或multisets (可能包含重复元素的无序集合)应该直接实现这个接口。
所有通用Collection实现类(通常通过其子接口之一间接实现Collection )应该提供两个“标准”构造函数:一个 void(无参数)构造函数,它创建一个空集合,以及一个具有单个参数类型的构造函数Collection ,它创建一个具有与其参数相同的元素的新集合。 实际上,后一个构造函数允许用户复制任何集合,生成所需实现类型的等效集合。 没有办法强制执行此约定(因为接口不能包含构造函数),但 Java 平台库中的所有通用Collection实现都符合。
某些方法被指定为可选的。 如果集合实现没有实现特定的操作,它应该定义相应的方法来抛出UnsupportedOperationException 。 这些方法在集合接口的方法规范中被标记为“可选操作”。一些集合实现对它们可能包含的元素有限制。 例如,有些实现禁止空元素,有些实现对其元素的类型有限制。 尝试添加不合格的元素会引发未经检查的异常,通常为NullPointerException或ClassCastException 。 尝试查询不合格元素的存在可能会引发异常,或者可能只是返回 false; 一些实现会表现出前一种行为,而另一些会表现出后者。 更一般地,尝试对不合格元素执行操作,其完成不会导致将不合格元素插入到集合中,这可能会引发异常,或者可能会成功,具体取决于实现的选择。 在此接口的规范中,此类异常被标记为“可选”。
由每个集合来确定自己的同步策略。 在没有更强大的实现保证的情况下,未定义的行为可能是由于在另一个线程正在改变的集合上调用任何方法; 这包括直接调用、将集合传递给可能执行调用的方法以及使用现有迭代器检查集合。
Collections Framework 接口中的许多方法都是根据equals方法定义的。 例如, contains(Object o)方法的规范说:“当且仅当此集合包含至少一个元素e使得(o==null ? e==null : o.equals(e))时才返回true .” 本说明书不应被解释为暗示调用Collection.contains具有非空参数o将导致o.equals(e)被调用的任何元件e 。 实现可以自由地实现优化,从而避免equals调用,例如,通过首先比较两个元素的哈希码。 ( Object.hashCode()规范保证哈希码不相等的两个对象不能相等。)更一般地说,各种集合框架接口的实现可以自由地利用底层Object方法的指定行为,只要实现者认为合适.
一些对集合执行递归遍历的集合操作可能会失败,但对于自引用实例,其中集合直接或间接包含自身的情况除外。 这包括clone() 、 equals() 、 hashCode()和toString()方法。 实现可以选择性地处理自引用场景,但是大多数当前的实现都没有这样做。
查看集合
大多数集合管理它们包含的元素的存储。 相比之下,视图集合本身不存储元素,而是依靠后备集合来存储实际元素。 视图集合本身未处理的操作被委托给后备集合。 视图集合的示例包括由Collections.checkedCollection 、 Collections.synchronizedCollection和Collections.unmodifiableCollection等方法返回的包装器集合。 视图集合的其他示例包括提供相同元素的不同表示的集合,例如,由List.subList 、 NavigableSet.subSet或Map.entrySet 。 对后备集合所做的任何更改都在视图集合中可见。 相应地,对视图集合所做的任何更改(如果允许更改)都将写入后备集合。 尽管从技术上讲它们不是集合, ListIterator Iterator和ListIterator实例也可以允许将修改写入后备集合,并且在某些情况下,对后备集合的修改在迭代期间对迭代器可见。
不可修改的集合
此接口的某些方法被认为是“破坏性的”并且被称为“mutator”方法,因为它们修改了它们操作的集合中包含的对象组。 如果此集合实现不支持该操作,则可以指定它们抛出UnsupportedOperationException 。 如果调用对集合没有影响,则此类方法应该(但不是必须)抛出UnsupportedOperationException 。 例如,考虑一个不支持add操作的集合。 如果在这个集合上调用addAll方法,并将一个空集合作为参数,会发生什么? 添加零元素没有任何影响,因此该集合可以简单地什么都不做并且不抛出异常。 但是,建议此类情况无条件抛出异常,因为仅在某些情况下抛出可能会导致编程错误。
不可修改的集合是一个集合,其所有的 mutator 方法(如上定义)都被指定为抛出UnsupportedOperationException 。 因此,不能通过调用其上的任何方法来修改这样的集合。 要使集合正确不可修改,从它派生的任何视图集合也必须不可修改。 例如,如果一个 List 是不可修改的,那么List.subList返回的 List 也是不可修改的。
不可修改的集合不一定是不可变的。 如果包含的元素是可变的,则整个集合显然是可变的,即使它可能是不可修改的。 例如,考虑两个包含可变元素的不可修改列表。 如果元素发生了变异,调用list1.equals(list2)的结果可能与一次调用不同,即使两个列表都是不可修改的。 但是,如果一个不可修改的集合包含所有不可变元素,则可以认为它是有效的不可变的。
不可修改的视图集合
不可修改的视图集合是不可修改的集合,它也是支持集合的视图。 它的 mutator 方法抛出UnsupportedOperationException ,如上所述,而读取和查询方法被委托给后备集合。 其效果是提供对后备集合的只读访问。 这对于组件向用户提供对内部集合的读取访问权限很有用,同时防止他们意外修改此类集合。 不可修改视图集合的示例是由Collections.unmodifiableCollection 、 Collections.unmodifiableList和相关方法返回的视图集合。
请注意,对后备集合的更改可能仍然是可能的,如果发生更改,它们将通过不可修改的视图可见。 因此,不可修改的视图集合不一定是不可变的。 但是,如果不可修改视图的后备集合实际上是不可变的,或者如果对后备集合的唯一引用是通过不可修改的视图,则可以认为该视图有效地不可变。
集合的可序列化
集合的可序列化是可选的。 因此,没有声明任何集合接口来实现java.io.Serializable接口。 然而,可序列化被认为是普遍有用的,因此大多数集合实现都是可序列化的。
作为公共类的集合实现(例如ArrayList或HashMap )被声明为实现Serializable接口,如果它们实际上是可序列化的。 一些集合实现不是公共类,例如不可修改的集合。 在这种情况下,此类集合的可序列化在创建它们的方法的规范中或在其他一些合适的地方进行了描述。 如果未指定集合的可序列化性,则无法保证此类集合的可序列化性。 特别是,许多视图集合是不可序列化的。
不能保证实现Serializable接口的集合实现是可序列化的。 原因是一般情况下,集合包含其他类型的元素,无法静态判断某个元素类型的实例是否真正可序列化。 例如,考虑一个可序列化的Collection<E> ,其中E没有实现Serializable接口。 集合可以是可序列化的,如果它只包含E的某些可序列化子类型的元素,或者它是空的。 因此,集合被称为有条件地可序列化,因为集合作为一个整体的可序列化性取决于集合本身是否可序列化以及所有包含的元素是否也是可序列化的。
SortedSet和SortedMap实例会出现另一种情况。 这些集合可以使用Comparator创建,该Comparator对集合元素或映射键进行排序。 仅当提供的Comparator也可序列化时,此类集合才可序列化。
此接口是Java Collections Framework的成员。
实现要求:
默认方法实现(继承或以其他方式)不应用任何同步协议。 如果Collection实现具有特定的同步协议,则它必须覆盖默认实现以应用该协议。
自:
1.2
请参见:
Set 、 List 、 Map 、 SortedSet 、 SortedMap 、 HashSet 、 TreeSet 、 ArrayList 、 LinkedList 、 Vector 、 Collections 、 Arrays 、 AbstractCollection
作者:
乔什·布洛赫,尼尔·加夫特
类型参数:
<E> – 此集合中元素的类型
public interface Collection<E> extends Iterable<E>
它继承于这个接口,关于这个接口,可以看看这篇博客亲~点我点我
关于它的
Iterator<E>
一个迭代器接口 在Iterable< T >这里存在它的描述
IntFunction<R>
一个函数式接口
Predicate<T>
一个函数式接口
Spliterator<T>
Stream<T>
逐个描述
大概描述
在这里跳过很多简单的方法,描述的并不完全,只是个大概描述,具体细节不进行描述,比如:[如何抛出异常,可能出现什么问题,应该如何实现这个方法]
返回类型 | 方法 | 描述 |
---|---|---|
int
|
size()
|
返回此集合中的元素数 |
boolean
|
isEmpty()
|
返回值:如果此集合不包含任何元素,则为true |
boolean
|
contains(Object o)
|
返回值:如果此集合包含指定的元素,则为true |
boolean
|
containsAll(Collection<?> c)
|
返回值:如果此集合包含指定集合中的所有元素,则为true |
Iterator<E>
|
iterator()
|
返回此集合中元素的迭代器 |
Object[]
|
toArray()
|
返回一个包含此集合中所有元素的数组 |
boolean
|
add(E e)
|
加入一个元素,返回值:如果此集合因调用而更改,则为true |
boolean
|
addAll(Collection<? extends E> c)
|
加入多个元素,返回值:如果此集合因调用而更改,则为true |
boolean
|
remove(Object o)
|
返回值:如果由于此调用而删除了元素,则为true |
boolean
|
removeAll(Collection<?> c)
|
此调用返回后,当前集合将不包含与指定集合相同的元素 返回值:如果此集合因调用而更改,则为true |
boolean
|
retainAll(Collection<?> c)
|
从该集合中删除所有未包含在指定集合中的元素 返回值:如果此集合因调用而更改,则为true |
void
|
clear()
|
从此集合中删除所有元素。 此方法返回后,集合将为空 |
int
|
hashCode()
|
返回此集合的哈希码值 |
T[] toArray(T[] a)
说白了,就是可以让它把集合 传入自己new的数组里,如果 new的数组不够大,它就在内部new一个新的数组返回
T[] toArray(IntFunction<T[]> generator)
参数是一个 函数式接口
为什么 [1] = null
因为在ArrayList
的实现里的toArray(T[] a)
,如果a.length > 当期集合的长度 , 那么a[当期集合长度]=null
boolean removeIf(Predicate<? super E> filter)
参数是一个 函数式接口
Predicate
简单描述一下方法,除了test(T)
其他方法都是 组合方法
方法 | 描述 |
---|---|
and | 是&&的意思, return (t) -> this.test(t) && 参数.test(t) |
or | 是||的意思, return (t) -> this.test(t) || 参数.test(t) |
negate | 是 ! 的意思, return (t) -> !this.test(t) |
not (静态) | 是 ! 的意思 , return 参数.negate() |
isEqual (静态) |
继续removeIf
根据条件删除元素,存在默认实现
这玩意蛮好用的
boolean equals(Object o)
Spliterator spliterator()
Stream stream()
Stream parallelStream()
特殊
Collections - 类
灰常强大的一个类
5千多行的一个类 , 不用专门去看,用到里面的方法就顺便看一下源码就好
这是它的 UML图 ,恐怖如斯
D - JDK17源码阅读 - 集合框架 - Collection<E> 接口 - 集合框架核心接口相关推荐
- 【源码阅读技巧一】查看类关系图,接口实现关系图(idea版本)Diagrams关系图
我们在阅读源码的时候,往往需要理清楚各个类,各个接口之间的关系,然后再去理解他的设计思路,有个大概理解,然后去阅读源码,就容易很多,那么今天就来讲一下如何使用idea来查看关系图: 一.查看类的父类, ...
- php微框架 flight源码阅读
Flight(https://github.com/mikecao/fl... 是一个可扩展的PHP微框架,快速.简单,能够快速轻松地构建RESTful web应用程序,在github上有2k sta ...
- mybatis源码阅读(六) ---StatementHandler了解一下
转载自 mybatis源码阅读(六) ---StatementHandler了解一下 StatementHandler类结构图与接口设计 BaseStatementHandler:一个抽象类,只是实 ...
- Pytorch TTA(预测增强) 源码阅读
Pytorch TTA 源码阅读 1.ttach/wrappers.py TTA主要调用的接口 继承了pytorch的nn.Module import torch import torch.nn as ...
- 【源码阅读】Java集合之一 - ArrayList源码深度解读
Java 源码阅读的第一步是Collection框架源码,这也是面试基础中的基础: 针对Collection的源码阅读写一个系列的文章,从ArrayList开始第一篇. ---@pdai JDK版本 ...
- java collection源码_jdk源码阅读Collection实例分析
jdk源码阅读Collection详解 见过一句夸张的话,叫做"没有阅读过jdk源码的人不算学过java".从今天起开始精读源码.而适合精读的源码无非就是java.io,.util ...
- 【Flink】Flink 源码阅读笔记(15)- Flink SQL 整体执行框架
1.概述 转载:Flink 源码阅读笔记(15)- Flink SQL 整体执行框架 在数据处理领域,无论是实时数据处理还是离线数据处理,使用 SQL 简化开发将会是未来的整体发展趋势.尽管 SQL ...
- android tcp socket框架_最流行的 Web 框架 Gin 源码阅读
最近公司大部分项目开始往golang换, api的框架选定使用gin, 于是将 gin的源码看了一遍, 会用几篇文章将gin的流程及流程做一个梳理, 下面进入正题. gin框架预览 上图大概是 gin ...
- CI框架源码阅读笔记4 引导文件CodeIgniter.php
到了这里,终于进入CI框架的核心了.既然是"引导"文件,那么就是对用户的请求.参数等做相应的导向,让用户请求和数据流按照正确的线路各就各位.例如,用户的请求url: http:// ...
最新文章
- linux学习之VNC远程控制(一)
- HDU - 7072 Boring data structure problem 双端队列 + 思维
- 安装后jdk1.8 配置环境变量以后 版本显示还是1.7
- CVPR 2020 | 旷视新方法优化解决遮挡行人重识别
- 精简linux (二)背景图片的设置 网络功能的实现
- 快排 递归与非递归实现 优化
- Rust: Integers: Recreation One
- m6000查看端口状态_M6000日常查看维护命令.doc
- IPLOOK 5G核心网重磅升级!网络切片切出5G“大蛋糕”
- 什么是ROM、EPROM、EEPROM、FLASH ROM、RAM?
- 三星堆的青铜机器人_三星堆“青铜大立人”,手里原来握的是什么东西,至今困扰考古界...
- 跟着猴博士复试概率论(第二部分)
- The page has expired due to inactivity Please refresh and try again
- Android 5.1 长按power键流程分析
- MyEclipse设置字体格式和大小,及字体推荐
- 华为服务器gpu芯片,GPU服务器推荐
- 2020年金属非金属矿山(露天矿山)主要负责人考试报名及金属非金属矿山(露天矿山)主要负责人考试资料
- SortedMap与TreeMap的一个典型应用
- Metasploit 实现木马生成、捆绑及免杀
- 中国定向公开赛海南昌江站开赛 600余名选手穿越雨林