java中容器继承体系

首先上图

 

源码解析 

打开Collection接口源码,能够看到Collection接口是继承了Iterable接口。

public interface Collection<E> extends Iterable<E> {
    /**
     * ......
     */
}
 

 以下是Iterable接口源码及注释

/**
 * Implementing this interface allows an object to be the target of the "for-each loop" statement.
 * 实现这个接口允许一个对象成为for-each循环语句的目标
 */
public interface Iterable<T> {
    // 返回一个内部元素为T类型的迭代器(JDK1.5只有这个接口)
    Iterator<T> iterator();
    
    // 遍历内部元素,action意思为动作,指可以对每个元素进行操作(JDK1.8添加)
    default void forEach(Consumer<? super T> action) {
        Objects.requireNonNull(action);
        for (T t : this) {
            action.accept(t);
        }
    }
    
    // 创建并返回一个可分割迭代器(JDK1.8添加),分割的迭代器主要是提供可以并行遍历元素的迭代器,可以适应现在cpu多核的能力,加快速度。
    //(划重点:并行遍历元素 并行!)
    default Spliterator<T> spliterator() {
        return Spliterators.spliteratorUnknownSize(iterator(), 0);
    }
}
 

Iterable接口定义了三个方法,其中两个提供了默认实现,只有iterator()是要求实现类必须实现的方法。
那么当某个类实现了Iterable接口就可以使用foreach进行迭代。同时Iterable中又封装了Iterator接口,那么这个类也可以使用Iterator迭代器。
因而有三种方式可以迭代Iterable实现类的对象:
1、for-each循环

List<String> list = new ArrayList><();
list.add("AAA");
list.add("BBB");
list.add("CCC");
for( String element : list ){
    System.out.println( element.toString() );
}
 

2、获取Iterable实现类对象的迭代器(Iterator)

Iterator<String> iterator = list.iterator();
while(iterator.hasNext()) {
    String element = iterator.next();
    System.out.println( element );
}
 

3、调用IterableforEach()方法

list.forEach( (element) -> {
    System.out.println( element );
});
 

 Iterator

通过上面我们可以看到,在iterable中我们有一个方法iterator可以返回一个Iterator的类。这个类的作用就是实现迭代。下面我们来看一下这个类的方法以及继承体系。

虽然在架构层级中并未包含,Iterator接口(迭代器)也是集合大家庭中的一员。Iterator主要是为了方便遍历集合中的所有元素(相当于是定义了遍历元素的范式)。

iterator源码

public interface Iterator<E> {
    // 是否有下一个元素
    boolean hasNext(); 
    
    // 获取下一个元素
    E next();   
    
    // 移除元素
    default void remove() {
        throw new UnsupportedOperationException("remove");
    }
        
    // 对剩下的所有元素进行处理,action则为处理的动作,意为要怎么处理
    default void forEachRemaining(Consumer<? super E> action) {
        Objects.requireNonNull(action);
        while (hasNext())
        action.accept(next());
    }
}
 

同样Iterator也是一个接口,目的是在于把不同集合的遍历方式抽象出来,这样我们使用迭代器遍历的时候,就不需要关注于集合内部结构,能够使用Iterator的内部方法直接遍历(也就是说,不管是针对List还是Set的遍历,我们都能够直接使用Iterator遍历拿到集合元素,而不需要关心是List还是Set)。那么这个时候,如果使用的数据结构有所变化,我们不需要去维护原有遍历集合的代码,因此也可以理解Iterator是有将集合与集合的遍历做了一个解耦。

Iterable Iterator两兄弟的区别

Iterable接口是为了达到实现该接口的类,可以使用foreach循环的目的。
Iterator接口是基于迭代器模式,实现了对聚合类的存储和遍历的分离。
两者所强调的内容不同:

Iterable接口强调的是实现Iterable接口可使用foreach语法遍历,也可以使用迭代器遍历。
Iterator接口强调其实现类可使用迭代器遍历

参考链接:https://blog.csdn.net/weixin_45663027/article/details/134135420

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

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

相关文章

makefileGDB使用

一、makefile 1、make && makefile makefile带来的好处就是——自动化编译&#xff0c;一旦写好&#xff0c;只需要一个make命令&#xff0c;整个工程完全自动编译&#xff0c;极大的提高了软件开发的效率 下面我们通过如下示例来进一步体会它们的作用&#xff1a; ①…

使用 Python 实现一个飞书/微信记账机器人,酷B了!

Python飞书文档机器人 今天的主题是&#xff1a;使用Python联动飞书文档机器人&#xff0c;实现一个专属的记账助手&#xff0c;这篇文章如果对你帮助极大&#xff0c;欢迎你分享给你的朋友、她、他&#xff0c;一起成长。 也欢迎大家留言&#xff0c;说说自己想看什么主题的…

代码随想录第天 78.子集 90.子集II

LeetCode 78 子集 题目描述 给你一个整数数组 nums &#xff0c;数组中的元素 互不相同 。返回该数组所有可能的子集&#xff08;幂集&#xff09;。 解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。 示例 1&#xff1a; 输入&#xff1a;nums [1,2,3] 输出&…

LeetCode 2581.统计可能的树根数目:换根DP(树形DP)

【LetMeFly】2581.统计可能的树根数目&#xff1a;换根DP(树形DP) 力扣题目链接&#xff1a;https://leetcode.cn/problems/count-number-of-possible-root-nodes/ Alice 有一棵 n 个节点的树&#xff0c;节点编号为 0 到 n - 1 。树用一个长度为 n - 1 的二维整数数组 edges…

debian/ubuntu 编译安装nginx php

debian/ubuntu 编译安装nginx php tar -zxvf nginx-1.9.9.tar.gz apt-get install libpcre3 libpcre3-dev ./configure --prefix/work/nginx-1.9.9 --with-pcre make make install service iptables stop #关闭防火墙, 可能不需要 修改nginx运行用户为tboqi 抱着log目录可…

【通信基础知识】完整通信系统的流程图及各模块功能详解

2024.2.29 抱歉最近在写毕设大论文&#xff0c;因此没有太多时间更新。然而&#xff0c;在写论文的过程中&#xff0c;发现自己对通信系统的了解还不够全明白&#xff0c;因此差了一些硕博论文总结了一个完整的通信系统流程图。若有不对的地方请多多指正//部分内容有参考ChatGP…

【Elasticsearch管理】网络配置

文章目录 HTTP高级网络设置高级TCP设置 TransportTCP传输概要文件Transport跟踪 线程池fixed线程池fixed_auto_queue_sizescaling处理器设置 HTTP Elasticsearch只在默认情况下绑定到本地主机。对于运行本地开发服务器(如果在同一台机器上启动多个节点&#xff0c;甚至可以运行…

YOLOv7基础 | 第2种方式:简化网络结构之yolov7.yaml(由104层简化为30层)

前言:Hello大家好,我是小哥谈。通过下载YOLOv7源码可知,原始的yolov7.yaml文件是拆开写的,比较混乱,也不好理解,并且为后续改进增添了很多困难。基于此种情况,笔者就给大家介绍一种将yolov7.yaml文件简化的方法,将104层简化为30层,并且参数量和计算量和原来是一致的,…

内存占用构造方法

#使用虚拟内存构造内存消耗 mkdir /tmp/memory mount -t tmpfs -o size5G tmpfs /tmp/memory dd if/dev/zero of/tmp/memory/block #释放消耗的虚拟内存 rm -rf /tmp/memory/block umount /tmp/memory rmdir /tmp/memory #内存占用可直接在/dev/shm目录下写文件

《极客时间 - 左耳听风》【文章笔记个人思考】

《极客时间 - 左耳听风》原文链接&#xff1a;https://time.geekbang.org/column/intro/100002201?tabcatalog 10 | 如何成为一个大家愿意追随的Leader&#xff1f; 10 | 如何成为一个大家愿意追随的Leader&#xff1f; 这里的Leader是在技术上取得优势&#xff0c;而不是行政…

2024年2月个人工作生活总结

本文为 2024年2月工作生活总结。 研发编码 一些警告修正记录 这个月修正了个人所负责的工程警告&#xff0c;这些警告其实是前人的代码遗留的&#xff0c;我续写的代码&#xff0c;除printf函数的%d、%ld格式&#xff0c;都在写的过程中改了。 下面记录一些典型的警告及应对…

NLP(一)——概述

参考书: 《speech and language processing》《统计自然语言处理》 宗成庆 语言是思维的载体&#xff0c;自然语言处理相比其他信号较为特别 word2vec用到c语言 Question 预训练语言模型和其他模型的区别? 预训练模型是指在大规模数据上进行预训练的模型&#xff0c;通常…

测试环境搭建整套大数据系统(七:集群搭建kafka(2.13)+flink(1.13.6)+dinky(0.6)+iceberg)

一&#xff1a;搭建kafka。 1. 三台机器执行以下命令。 cd /opt wget wget https://dlcdn.apache.org/kafka/3.6.1/kafka_2.13-3.6.1.tgz tar zxvf kafka_2.13-3.6.1.tgz cd kafka_2.13-3.6.1/config vim server.properties修改以下俩内容 1.三台机器分别给予各自的broker_id…

git操作学习记录,简单易上手

配置git 的账户邮箱 $ git config --global user.name "Firstname Lastname" $ git config --global user.email "your_emailexample.com"代码回溯 git rest --hard [commit哈希值]git log命令只能查看以当前状态为终点的历史日志 git reflog命令&#x…

Python+neo4j构建豆瓣电影知识图谱

文章目录 数据来源数据整理导入节点和关系导入使用Subgraph批量导入节点和关系 多标签实体和实体去重 数据来源 http://www.openkg.cn/dataset/douban-movie-kg 该网址拥有丰富的中文知识图谱数据集&#xff0c;OpenKG(Open Knowledge Graph)&#xff0c;可供研究人员使用研究…

【golang】25、图片操作

用 “github.com/fogleman/gg” 可以画线, 框 用 “github.com/disintegration/imaging” 可以变换颜色 一、渲染 1.1 框和字 import "github.com/fogleman/gg"func DrawRectangles(inPath string, cRects []ColorTextRect, fnImgNameChange FnImgNameChange) (st…

Python爬虫——Urllib库-3

目录 ajax的get请求 获取豆瓣电影第一页的数据并保存到本地 获取豆瓣电影前十页的数据 ajax的post请求 总结 ajax的get请求 获取豆瓣电影第一页的数据并保存到本地 首先可以在浏览器找到发送数据的接口 那么我们的url就可以在header中找到了 再加上UA这个header 进行请…

Facebook的元宇宙实践:数字化社交的新前景

近年来&#xff0c;元宇宙&#xff08;Metaverse&#xff09;这一概念备受瞩目&#xff0c;被认为是数字化社交的未来趋势之一。而在众多科技巨头中&#xff0c;Facebook&#xff08;现更名为Meta&#xff09;一直处于元宇宙发展的前沿。在本文中&#xff0c;我们将深入探讨Fac…

万字带你走过数据库的这激荡的三年

本文收集了卡内基梅隆大学计算机科学系数据库学副教授 Andy Pavlo 从 2021 到 2023 连续三年对数据库领域的回顾&#xff0c;希望通过连续三年的回顾让你对数据库领域的技术发展有所了解。 关于 Andy Pavlo&#xff1a;卡内基梅隆大学计算机科学系数据库学副教授&#xff0c;数…

vuepress项目侧边栏菜单配置使用

第一种菜单配置&#xff0c;自定义菜单名称 {text: 菜单名称,// 是否折叠collapsible: true,children: [{text: "自定义md菜单名称",sidebarDepth: 2,link: "/xxx/aa.md",children: [],}],},第二种菜单配置 标题自动生成菜单&#xff0c;使用需要搭配sideb…