【java】Collection源码阅读(JDK 8)

news2025/7/15 10:19:05

在这里插入图片描述

package java.util;
 
import java.util.function.Predicate;
import java.util.stream.Stream;
import java.util.stream.StreamSupport;
 
/**
 * 集合层次结构的根接口,一个集合表示一组对象,称为元素
 * JDK不提供任何该接口的直接实现,JDK提供实现特定情况的子接口,Set,List
 *
 * 所有通用Collection实现类通常需要通过一个间接实现Collection接口的子接口来实现,
 * 而且需要提供两个标准的构造函数,没有参数的构造函数(空参构造),创建一个空集合;
 * 以及包含Collection类型的单个参数的构造函数,使用与其参数相同的元素创建一个新集合。
 * @author  Josh Bloch
 * @author  Neal Gafter
 * @see     Set
 * @see     List
 * @see     Map
 * @see     SortedSet
 * @see     SortedMap
 * @see     HashSet
 * @see     TreeSet
 * @see     ArrayList
 * @see     LinkedList
 * @see     Vector
 * @see     Collections
 * @see     Arrays
 * @see     AbstractCollection
 * @since 1.2
 */
public interface Collection<E> extends Iterable<E> {
    // 查询操作
 
    /**
     * 返回此集合中的元素数。如果这个集合 包含多于<tt> Integer.MAX_VALUE </ tt>的元素,返回 <tt> Integer.MAX_VALUE </ tt>。
     *
     * @return 此集合中的元素数量
     */
    int size();
 
    /**
     * 如果此集合不包含任何元素,则返回<tt> true </ tt>
     * @return <tt>true</tt> 如果此集合不包含任何元素
     */
    boolean isEmpty();
 
    /**
     *
     * 如果集合中包含至少一个指定对象,返回true
     * @param o 要测试其在此集合中的存在的元素
     * @return <tt>true</tt>  如果集合中包含该元素
     *
     * @throws ClassCastException 如果指定元素的类型 与集合内元素类型不兼容
     * @throws NullPointerException 如果指定的元素为null且此 collection不允许null元素
     *
     */
    boolean contains(Object o);
 
    /**
     * 返回此集合中元素的迭代器。无法保证元素的返回顺序
     *(除非此集合是某个提供保证的类的实例)。
     *
     * @return an <tt>Iterator</tt> 覆盖此集合中的元素
     */
    Iterator<E> iterator();
 
    /**
     * 返回包含此集合中所有元素的数组。
     * 如果此集合对其迭代器返回的元素的顺序做出任何保证,则此方法必须以相同的顺序返回元素。
     *
     * 返回的数组将是“安全的”,因为此集合不会保留对它的引用。
     * (换句话说,即使此集合由数组支持,此方法也必须分配新数组)。
     *  调用者因此可以自由修改返回的数组。
     *
     * @return 包含此集合中所有元素的数组
     */
    Object[] toArray();
 
    /**
     * 返回包含此集合中所有元素的数组;
     * 返回数组的运行时类型是指定数组的运行时类型。
     * 如果集合适合指定的数组,则返回元素到指定的数组中。
     * 否则,将使用指定数组的运行时类型和此集合的大小分配新数组。
     *
     * 此集合适合指定的数组,如果有空余空间(即,数组的元素多于此集合),则紧跟集合结尾的数组中的元素将设置为<tt> null </ TT>。
     * (如果调用者知道此集合不包含任何<tt> null </ tt>元素,则此选项仅用于确定此集合的长度<i> </ i>。)
     *
     * 如果此集合对其迭代器返回的元素的顺序做出任何保证,则此方法必须以相同的顺序返回元素。
     *
     * @param <T> 包含集合的数组的运行时类型
     * @throws ArrayStoreException 如果指定数组的运行时类型不是此集合中每个元素的运行时类型的超类型
     * @throws NullPointerException 如果指定的数组为null
     */
    <T> T[] toArray(T[] a);
 
    // 修改操作
 
    /**
     * 将元素e添加到集合中
     * 如果集合不允许重复元素,且集合中已经含有该元素,返回false
     * false-添加失败
     */
    boolean add(E e);
 
    /**
     * 从该 collection 中移除指定元素的单个实例,如果集合中存在指定元素返回true。
     */
    boolean remove(Object o);
 
 
    // 批量操作
 
    /**
     * 如果此 collection 包含指定 collection 中的所有元素,则返回 true。
     */
    boolean containsAll(Collection<?> c);
 
    /**
     * 将指定 collection 中的所有元素都添加到此 collection 中
     */
    boolean addAll(Collection<? extends E> c);
 
    /**
     * 移除此 collection 中那些也包含在指定 collection 中的所有元素(可选操作)。
     */
    boolean removeAll(Collection<?> c);
 
    /**
     *
     * 删除此集合中满足给定布尔值函数的所有元素。在迭代期间或通过布尔值函数抛出的错误或运行时异常被中继到调用者。
     * 默认使用迭代器进行删除元素
     *
     * @param filter 一个布尔值函数,它返回{@code true}表示要删除的元素
     * @return {@code true} 如果删除了任何元素
     * @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);
 
    /**
     * 移除此 collection 中的所有元素。
     */
    void clear();
 
 
    // 比较和散列
 
    /**
     *  比较此 collection 与指定对象是否相等。通过覆盖,实现list与list相等,set与set相等
     */
    boolean equals(Object o);
 
    /**
     * 返回此 collection 的哈希码值。
     */
    int hashCode();
 
    /**
     *
     * Spliterator是一个可分割迭代器(splitable iterator),可以和iterator顺序遍历迭代器一起看。jdk1.8发布后,对于并行处理的能力大大增强,Spliterator就是为了并行遍历元素而设计的一个迭代器,jdk1.8中的集合框架中的数据结构都默认实现了spliterator
     *
     * 在此集合中的元素上创建{@link Spliterator}。
     *
     * 后续如果讲到了{@link Spliterator}再进行补充下面的三个方法
     *
     *
     * Implementations should document characteristic values reported by the
     * spliterator.  Such characteristic values are not required to be reported
     * if the spliterator reports {@link Spliterator#SIZED} and this collection
     * contains no elements.
     *
     * <p>The default implementation should be overridden by subclasses that
     * can return a more efficient spliterator.  In order to
     * preserve expected laziness behavior for the {@link #stream()} and
     * {@link #parallelStream()}} methods, spliterators should either have the
     * characteristic of {@code IMMUTABLE} or {@code CONCURRENT}, or be
     * <em><a href="Spliterator.html#binding">late-binding</a></em>.
     * If none of these is practical, the overriding class should describe the
     * spliterator's documented policy of binding and structural interference,
     * and should override the {@link #stream()} and {@link #parallelStream()}
     * methods to create streams using a {@code Supplier} of the spliterator,
     * as in:
     * <pre>{@code
     *     Stream<E> s = StreamSupport.stream(() -> spliterator(), spliteratorCharacteristics)
     * }</pre>
     * <p>These requirements ensure that streams produced by the
     * {@link #stream()} and {@link #parallelStream()} methods will reflect the
     * contents of the collection as of initiation of the terminal stream
     * operation.
     *
     * @implSpec
     * The default implementation creates a
     * <em><a href="Spliterator.html#binding">late-binding</a></em> spliterator
     * from the collections's {@code Iterator}.  The spliterator inherits the
     * <em>fail-fast</em> properties of the collection's iterator.
     * <p>
     * The created {@code Spliterator} reports {@link Spliterator#SIZED}.
     *
     * @implNote
     * The created {@code Spliterator} additionally reports
     * {@link Spliterator#SUBSIZED}.
     *
     * <p>If a spliterator covers no elements then the reporting of additional
     * characteristic values, beyond that of {@code SIZED} and {@code SUBSIZED},
     * does not aid clients to control, specialize or simplify computation.
     * However, this does enable shared use of an immutable and empty
     * spliterator instance (see {@link Spliterators#emptySpliterator()}) for
     * empty collections, and enables clients to determine if such a spliterator
     * covers no elements.
     *
     * @return a {@code Spliterator} over the elements in this collection
     * @since 1.8
     */
    @Override
    default Spliterator<E> spliterator() {
        return Spliterators.spliterator(this, 0);
    }
 
    /**
     * Returns a sequential {@code Stream} with this collection as its source.
     *
     * <p>This method should be overridden when the {@link #spliterator()}
     * method cannot return a spliterator that is {@code IMMUTABLE},
     * {@code CONCURRENT}, or <em>late-binding</em>. (See {@link #spliterator()}
     * for details.)
     *
     * @implSpec
     * The default implementation creates a sequential {@code Stream} from the
     * collection's {@code Spliterator}.
     *
     * @return a sequential {@code Stream} over the elements in this collection
     * @since 1.8
     */
    default Stream<E> stream() {
        return StreamSupport.stream(spliterator(), false);
    }
 
    /**
     * Returns a possibly parallel {@code Stream} with this collection as its
     * source.  It is allowable for this method to return a sequential stream.
     *
     * <p>This method should be overridden when the {@link #spliterator()}
     * method cannot return a spliterator that is {@code IMMUTABLE},
     * {@code CONCURRENT}, or <em>late-binding</em>. (See {@link #spliterator()}
     * for details.)
     *
     * @implSpec
     * The default implementation creates a parallel {@code Stream} from the
     * collection's {@code Spliterator}.
     *
     * @return a possibly parallel {@code Stream} over the elements in this
     * collection
     * @since 1.8
     */
    default Stream<E> parallelStream() {
        return StreamSupport.stream(spliterator(), true);
    }
}

Collection

type: interface

public interface Collection extends Iterable

类文档

该接口是集合大类中的根接口。一个集合代表着一组对象,该对象被称为元素。一些集合允许重复的元素,而另一些集合不允许。一些集合是有序的,另一些是无序的。JDK不提供任何该接口的直接实现:提供了更具体的子类的实现,如:Set、List。该接口提供了最大程度的通用性用于操作和抽象的表示集合。

原文中为:This interface is typically used to pass collections around and
manipulate them where maximum generality is desired.
机器翻译为:该接口通常用于传递集合并操作它们,其中需要最大的通用性。 但是我认为 pass collections around
翻译成传递不好,我翻译为抽象或者表示。

背包(bags:一种数据结构 类似栈)和多集(multisets:一种数据结构 无序且允许元素重复)应该直实现承该接口。

所有通用的Collection实现类(通常是实现Collection的子接口)应该提供梁总标准的构造方法:
一个是空参的构造方法:该方法创建一个空集合,
另一个是具有一个Collection类型参数的构造方法,使用具有参数的元素进行创建。
实际上,第二种构造方法允许用户复制任意集合来生成目标类型的等效集合。
当然,没有任何方法保证强制执行这个约定(Collection是一个接口,接口中不能包含构造函数)
但是Java平台内所有的通用Collection的实现类都是符合上述约定的。

在这个接口中有一些“破坏性”的方法,
当调用某种集合不支持的操作进行修改集合的时候会抛出(UnsupportedOperationException java.lang包下)
如果操作被调用后对集合本身没有影响,这种情况下可以但不是必须要抛出该异常。
例如:对不可修改的集合调用addAll(Collection)方法添加空集可以引发该异常,但不是必须的。
(注意这里是添加空集合,表示不添加任何数据,所以没有影响,如果是添加有数据的集合,那就要抛出异常)

Collection的一些实现类限制他包含的元素。
例如:一些实现类禁制null元素,还有一些实现类限制元素的数据类型。
如果尝试添加一个不支持的类型将会抛出UncheckedException,例如空指针异常(NullPointerException),类强制转换异常(ClassCaseException)。
如果尝试查询一个不合法的元素可能会抛出异常,或者仅仅是返回false.
通俗来说,对于尝试使用一个非法元素去操作集合,但是对结果没有任何影响时,有可能会抛出异常,也有可能顺利执行该方法。
此部分在接口的规范中标记为’可选’。

由每种集合自行决定他们自己的同步策略。
在没有有力的保障下的实现类,未知的行为来自该集合的一些方法被其他线程调用导致的数据改变。
包括直接调用、将集合传递给可能执行调用的方法、使用现有迭代器检索集合。

在集合框架接口下的一些方法都是根据equals方法定义的。但是这并不代表制真的就是使用这个方法。
子类自由决定使用更加优化的方法,进而笔迷使用equals。
参考contains(Object o);方法
更一般地说,各种集合框架接口的实现可以自由地利用底层对象方法的指定行为,只要实现者认为合适。

对于自引用的集合,使用递归思想进行操作会失败并且抛出异常。
这包括clone()、equals()、hashcode()和tostring()方法。
实现可以选择性地处理自引用场景,但是大多数当前实现类不这样做。

该接口是Java集合框架的一员。

对实现类的限制:

  • 对于默认方法(接口中使用default关键字标识的方法)不具有任何同步处理,子类如果需要进行同步处理,应该覆盖相应方法。

  • 所有子类行该拥有两种构造方法

因此我们知道,如果我们需要的定制一个新的集合类并实现Collecti接口,应该有两种构造器

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/396162.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Elasticsearch 核心技术(六):内置的 8 种分词器详解 + 代码示例

❤️ 博客主页&#xff1a;水滴技术 &#x1f680; 支持水滴&#xff1a;点赞&#x1f44d; 收藏⭐ 留言&#x1f4ac; &#x1f338; 订阅专栏&#xff1a;大数据核心技术从入门到精通 文章目录一、内置分词器1. Standard&#xff08;标准分词器&#xff09;英文示例中文示例…

八.异常控制流ECF

1.异常异常位于硬件和OS的交界部分系统调用是为应用程序提供到OS的入口点的异常进程和信号位于应用和OS的交界部分非本地跳转是ECF的应用层形式1.1 异常表异常是控制流中的突变&#xff0c;用来响应处理器状态的某些变化状态变化称为事件系统中可能的每种类型的异常都分配了一个…

虹科教您 | 在Windows环境下安装PCAN View及通讯测试指南

应用简介 PCAN-View软件是一款简化的CAN监视软件&#xff0c;可用于显示、发送、和记录CAN数据通讯。报文可手动和定期发送&#xff0c;用户可设置比特率。在处理期间显示总线系统错误和CAN硬件的存储器过满。示踪功能可用于记录和保存CAN数据通讯。本文档的作用在于&#xff…

软件测试的几个关键步骤,你需要知道

记得2年前刚毕业的时候听说了软件测试这个行业&#xff0c;当时也去百度仔细进行了一番搜索&#xff0c;评价基本千篇一律的看好。 看好的原因在于&#xff0c;专家认为未来的互联网市场用户体验至上&#xff0c;而产品质量与用户体验有紧密的联系&#xff0c;自从近年产品经理…

eyoucms field 获取channelartlist标签的字段值

【基础用法】 标签&#xff1a;field 描述&#xff1a;获取channelartlist标签里的字段值&#xff0c;field标签只能在channelartlist标签里使用。 用法&#xff1a; {eyou:channelartlist typeid栏目ID typeson row20} <a href{eyou:field nametypeurl /}>{eyou:fi…

SCCM 应用程序管理

Microsoft System Center Configuration Manager &#xff08;SCCM&#xff09; 被认为是管理 Microsoft 应用程序的示例性工具。它可以无缝地进行补丁管理和软件部署。但处理第三方应用程序不是它的游戏。因此&#xff0c;除了补丁管理之外&#xff0c;Patch Connect Plus 还为…

接口里面可以写实现方法吗【可以】 、接口可以多继承吗【可以】

比如下面这道题&#xff1a; 问: 接口里面可以写方法吗&#xff1f; 答: 当然可以啊&#xff0c;默认就是抽象方法。 . 问&#xff1a; 那接口里面可以写实现方法吗&#xff1f; 答&#xff1a; 不可以&#xff0c;所有方法必须是抽象的。 . 问&#xff1a; 你确定吗&#xff1…

Java面试题--SpringRefresh流程

Spring refresh 概述 Spring 容器是一个管理 bean 的容器&#xff0c;可以创建、注入和管理 bean 及其依赖关系。Spring 容器可以根据应用程序配置和运行时条件创建、初始化和销毁 bean。refresh() 函数是 Spring 容器中的一种功能&#xff0c;可以重新加载和刷新容器中的配置…

什么?同步代码块失效了?-- 自定义类加载器引起的问题

一、背景 最近编码过程中遇到了一个非常奇怪的问题&#xff0c;基于单例对象的同步代码块似乎失效了&#xff0c;百思不得其姐。 下面给出模拟过程和最终的结论。 二、场景描述和模拟 2.1 现象描述 Database实现单例&#xff0c;在 init 方法中使用同步代码块来保证 data不…

Revit中图纸要怎么布局呢?

1、明确图纸布局原则。 2、在图纸上锁定视图的位置 在图纸上放置视图(或明细表)并根据需要对其定位后&#xff0c;可以将其锁定到位&#xff0c;这样就不会在无意中移动它。如果想要解锁视图&#xff0c;单击锁定图标即可&#xff0c;如图1所示。 3、在图纸上旋转视图 可以在图…

imx6 usb增强信号强度

USB信号 参考&#xff1a;官方文档 USB信号完整性取决于许多因素&#xff0c;如电路设计、PCB布局、堆叠和阻抗。每个产品可能彼此不同&#xff0c;因此客户需要微调参数&#xff0c;以获得最佳的信号质量。 测试板已经路由出两个USB端口:一个OTG1&#xff0c;一个主机。每个端…

xcode14安装swift package设置github账户token

这里写目录标题登录github账户,复制token打开xcode添加github账户选择swift package登录github账户,复制token 登录github点击上面菜单自己的头像,settings->Developer settings->Personal access tokens->Tokens (classic)->Generate new token (classic) Note名…

Spring 响应式编程-读书笔记

序言 大家好&#xff0c;我是比特桃。本文为《Spring 响应式编程》的读书笔记&#xff0c;响应式技术栈可以创建极其高效、易于获取且具有回弹性的端点&#xff0c;同时响应式可以容忍网络延迟&#xff0c;并以影响较小的方式处理故障。响应式微服务还可以隔离慢速事务并加速速…

判断推理之图形推理

考点一动态位置变化&#xff08;一&#xff09;平移1.特征&#xff1a;图形在平面上的移动&#xff0c;图形本身的大小和形状不发生改变。2.方向&#xff1a;直线&#xff08;上下、左右、斜对角线&#xff09;&#xff0c;绕圈&#xff08;顺时针、逆时针&#xff09;3.距离&a…

聚观早报 |王兴宣布美团网约车业务调整;软银Arm被曝4月申请上市

今日要闻&#xff1a;王兴宣布美团网约车业务调整&#xff1b;钉钉收购协同办公厂商「我来 wolai」&#xff1b;软银旗下Arm被曝4月申请上市&#xff1b;小米汽车完成冬测&#xff1b;淘特负责人否认将被合并到淘宝 王兴宣布美团网约车业务调整 美团创始人王兴发布内部信&#…

蓝桥杯入门即劝退(二十六)组合问题(回溯算法)

-----持续更新Spring入门系列文章----- 如果你也喜欢Java和算法&#xff0c;欢迎订阅专栏共同学习交流&#xff01; 你的点赞、关注、评论、是我创作的动力&#xff01; -------希望我的文章对你有所帮助-------- 专栏&#xff1a;蓝桥杯系列 一、题目描述 给定两个整数 n …

css:使用filter和backdrop-filter实现高斯模糊效果

背景 今天接到一个需求是&#xff0c;使用高斯模糊的效果对一个页面进行模糊处理&#xff0c;正好借这个机会来整理一下 css3 中高斯模糊的两个 API API介绍 filter 说明&#xff1a; 该 API 是一个过滤器&#xff0c;不仅能实现高斯模糊&#xff0c;还有很多比如颜色偏移、…

【Linux】网络基础(1)

前言 相信没有网络就没有现在丰富的世界。本篇笔记记录我在Linux系统下学习网络基础部分知识&#xff0c;从关于网络的各种概念和关系开始讲起&#xff0c;逐步架构起对网络的认识&#xff0c;对网络编程相关的认知。 我的上一篇Linux文章呀~ 【Linux】网络套接字编程_柒海啦的…

利用 socket.io 实现前后端实时交互

官网地址&#xff1a;Socket.IO 项目结构&#xff1a; 服务端&#xff08;node&#xff09;代码&#xff1a; 首先安装 express&#xff0c;socket.io npm i express socket.io -S/server/index.js // 官网用例&#xff1a;https://socket.io/zh-CN/docs/v4/server-initial…

数据库-基础篇-6-多表查询(内连接、外连接、自连接)

一、多表关系 1.概述&#xff1a;项目开发中&#xff0c;在进行数据库表结构设计时&#xff0c;会根据业务需求及业务模块之间的关系&#xff0c;分析并设计表结构&#xff0c;由于业务之间相互关联&#xff0c;所以各个表结构也存在着各种联系&#xff0c;基本上分为三种&…