Java面试八股之Iterator接口和Iterable接口

1. Java为什么不直接实现Iterator接口,而是实现Iterable?

这道题算是一道比较基础的题,面试官肯定也不是想让回答得多深入,只是考查对迭代器的了解程度,最好是看过源码,实际上迭代器的源码并不难。我们把注释折叠起来,Iterator接口的源码就是以下几行。

我们在面试中回答这个问题,可以从以下几个思路去回答。

  1. 分离职责:

Iterator接口定义了遍历集合元素的具体操作方法,如hasNext()、next()等,它负责提供遍历集合元素的能力,出现在Iterable接口的iterator()方法的返回值中。

Iterable接口包含方法iterator(),它的作用是为集合提供一个创建其迭代器实例的工厂方法。这意味着Iterable接口并不直接参与迭代过程,而是作为一个工厂角色,将迭代细节委托给具体的Iterator实现。

  1. 面向对象设计原则:

单一职责原则:Iterable接口专注于暴露一个创建迭代器的入口,而Iterator接口专注于定义迭代行为。这样,每个接口都专注于一项职责,提高了代码的模块化程度和可维护性。

依赖倒置原则:Iterable接口与Iterator接口的分离使得集合类(Iterable的实现)不需要直接依赖具体的迭代器实现细节,只需知道它能返回一个实现了Iterator接口的对象即可。这降低了耦合度,使得集合类的实现可以灵活地更换迭代器实现,有利于代码复用和扩展。

  1. 支持泛型与foreach语法:

Iterable接口在Java 5引入泛型后,定义为Iterable<T>,它明确指定了迭代器返回元素的类型。这使得集合类可以通过实现Iterable接口,为用户提供类型安全的迭代器,避免运行时类型转换错误。

自Java 5起,Java语言引入了for-each循环(也称为增强for循环),它可以直接作用于实现了Iterable接口的对象。通过实现Iterable而非Iterator,集合类能够无缝地支持这种简洁高效的遍历语法,提升了代码的可读性和易用性。

  1. API设计一致性与扩展性:

Iterable接口作为Java集合框架的顶层接口之一,是所有可迭代集合的通用接口。集合类统一实现Iterable接口,有利于保持API的一致性,使得客户端代码可以以统一的方式处理各种不同的集合类型。

若直接让集合类实现Iterator接口,将迭代器方法直接暴露在集合类上,可能会导致API设计混乱,也不利于后续扩展新的迭代器实现(如并行迭代器)。通过Iterable与Iterator的分离,可以更容易地为集合类添加新的迭代器实现,只需提供一个新的Iterator子类,而无需修改集合类本身。

这样的设计使得集合类与迭代器之间的耦合度降低,代码结构更加清晰,同时也为用户提供了一种更简洁、类型安全的遍历集合元素的方式。

 如果大家需要视频版本的讲解,欢迎关注我的B站:

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

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

相关文章

LIUNX文件系统

目录 1.磁盘的物理结构 2.CHS定位法 3.磁盘的逻辑存储 4.系统层面 inode.block[15] 创建文件的流程 查找文件的流程 了解文件系统&#xff0c;首先要了解磁盘是如何存储和读取数据的。 1.磁盘的物理结构 可以理解这个盘上有很多的小磁铁&#xff0c;通过旋转盘面和摆动…

葡韵饼店:云上清明节,千里寄哀思

清明&#xff0c;又称踏青节、祭祖节、行清节&#xff0c;节期在仲春与暮春之交&#xff0c;源自于上古时代的祖先信仰和春祭礼俗&#xff0c;兼具人文与自然两大内涵。 每当到了这个时候&#xff0c;人们都会携带祭祀物品&#xff0c;与家人们齐聚结伴&#xff0c;登山祭祖&am…

【Python】用python实现编译脚本

这个脚本可以自动扫描目录下的.c和.s文件并编译&#xff0c;同时生成hex和bin文件 &#xff0c;可以代替Makefile工作。cortex-m 单片机 # -*- coding: gbk -*-import os import sys import time修改编译脚本之后需要全编译一次# CC gcc CC C:\\ARM_GCC\\bin\\arm-none-eabi-…

支付宝支付之SpringBoot整合支付宝创建自定义支付二维码

文章目录 自定义支付二维码pom.xmlapplication.yml自定义二维码类AlipayService.javaAlipayServiceImpl.javaAlipayController.javaqrCode.html 自定义支付二维码 继&#xff1a;SpringBoot支付入门 pom.xml <dependency><groupId>org.springframework.boot<…

PHP中常见的@注释的含义

api: 提供给第三方使用的接口 author: 标明作者 param: 参数 return: 返回值 todo: 待办 version: 版本号 inheritdoc: 文档继承 property: 类属性 property-read: 只读属性 property-write: 只写属性 const: 常量 deprecated: 过期方法 example: 示例 final: 标识类是终态, 禁…

前端开发该不该“跳槽”到鸿蒙?

前言 面对互联网行业的激烈竞争&#xff0c;许多人都深感2023年已是不易&#xff0c;而展望2024年&#xff0c;似乎更是难上加难。这一切的根源&#xff0c;皆因行业多年发展后&#xff0c;人才市场的饱和现象愈发严重。那么&#xff0c;作为前端开发者&#xff0c;我们究竟该…

速看!2024年强基计划报考流程及常见问答

01什么是强基计划&#xff1f; 为加强基础学科拔尖创新人才选拔培养&#xff0c;教育部在深入调研、总结高校自主招生和上海等地高考综合改革试点经验的基础上&#xff0c;制定出台了《关于在部分高校开展基础学科招生改革试点工作的意见》&#xff08;也称“强基计划”&#…

SpringBoot启动加载自己的策略类到容器中使用?

使用InitializingBean接口 springboot中在启动的会自动把所有的实现同一个接口的类&#xff0c;都会转配到标注Autowired的list里面 而且实现了InitializingBean接口&#xff0c;在启动的赋值的时候&#xff0c;我们会把所有的策略类&#xff0c;重放到map中&#xff0c;我们在…

c++ 11 添加功能 变量类型推导

1.概要 变量类型推导 2.代码 #include <iostream> #include <map> using namespace std; int main() { std::map<std::string, std::string> m{ {"a", "apple"}, {"b","banana"} }; // 使用迭代器遍历…

发布订阅模式以及mitt源码实现

发布订阅模式以及mitt源码实现 前言&#xff1a;我为什么要写他&#xff1f; 场景1: 我在写一个组件&#xff0c;但是层层传递之后&#xff0c;全是属性/事件的传递。中间有很多缘由&#xff0c;vuex 又不适合&#xff0c;最后选择了eventBus&#xff0c;但是vue3 已经不再提供…

【尚硅谷】Git与GitLab的企业实战 学习笔记

目录 第1章 Git概述 1. 何为版本控制 2. 为什么需要版本控制 3. 版本控制工具 4. Git简史 5. Git工作机制 6. Git和代码托管中心 第2章 Git安装 第3章 Git常用命令 1. 设置用户签名 1.1 基本语法 1.2 案例实操 2. 初始化本地库 2.1 基本语法 2.2 案例实操 3. 查…

【运输层】TCP 的流量控制和拥塞控制

目录 1、流量控制 2、TCP 的拥塞控制 &#xff08;1&#xff09;拥塞控制的原理 &#xff08;2&#xff09;拥塞控制的具体方法 1、流量控制 一般说来&#xff0c;我们总是希望数据传输得更快一些。但如果发送方把数据发送得过快&#xff0c;接收方就可能来不及接收&#x…

milvus服务安装bash脚本指令理解

下拉镜像&#xff1a;docker pull milvusdb/milvus:v2.4.0-rc.1下载文件&#xff1a;https://hub.yzuu.cf/milvus-io/milvus/blob/master/scripts/standalone_embed.sh安装启动&#xff1a;bash standalone_embed.sh start详细解释下这段代码&#xff1a;wait_for_milvus_runni…

伪代码——基础语法入门

1、简介 伪代码是一种用来描述算法或程序逻辑的抽象化编码方式&#xff0c;它不依赖于任何特定的编程语言语法&#xff0c;而是使用类似自然语言的形式来描述算法步骤。通常用于算法设计、教学和沟通&#xff0c;伪代码可以更直观地表达问题的解决方案&#xff0c;而不必受限于…

Ubuntu 22.04 配置VirtualBox安装Windows 10虚拟机

Ubuntu 22.04 配置VirtualBox安装Windows 10虚拟机 文章目录 Ubuntu 22.04 配置VirtualBox安装Windows 10虚拟机1.安装virtualbox2.下载Window.iso文件并载入3.问题解决3.1 Kernel driver not installed (rc-1908)3.2 VT-x is disabled in the BIOS for all CPU modes 4.安装Wi…

【python】python 模块学习之--Fabric

基础一&#xff1a; #!/usr/bin/env pythonfrom fabric.api import *env.userrootenv.hosts[218.78.186.162,125.208.12.56]env.passwords{ root218.78.186.162:22:XXX,root125.208.12.56:22:XXXX0}runs_once ####runs_once代表只执行一次def local_tas…

在开源框架使用自有数据集的方法-以增量学习工具箱PyCIL为例

回答多位朋友提出的&#xff0c;如何在开源框架使用自有数据集。思路是理解开源代码的设计方法&#xff0c;根据其设计方法增加相应的代码。 具体方法如下&#xff1a; 1.查看开源代码提供者的说明 https://github.com/G-U-N/PyCIL#datasets&#xff0c;这里提供了入手的起点…

带你实现一个github注册页面的星空顶

带你实现一个github注册页面的星空顶 github的注册页面可以说是非常的好看&#xff0c;如果没有看过的可以看下面的图片&#xff1a; 那么要如何实现下面的这个效果呢&#xff1f; 首先我们研究一下他的这个官网 首先我看到的后面的这个背景&#xff0c;是不是一个纯色的背景…

Linux安装Docker完整教程及配置阿里云镜像源

官网文档地址 安装方法 1、查看服务器内核版本 Docker要求CentOS系统的内核版本高于3.10 uname -r #通过 uname -r 命令查看你当前的内核版本2、首先卸载已安装的Docker&#xff08;如果有&#xff09; 2.1 确保yum包更新到最新 yum update2.2 清除原有的docker&#xff0c…

02_Fixture定位,Caliper卡尺工具,几何学工具

Fixture定位工具 需求: 测量工件的尺寸 使用Caliper(卡尺)工具 这个时候需要借助Fixture工具 VisionPro中的图像空间 “” 图像的当前空间&#xff0c;即CogImage中的“SelectedSpaceName”表示的名字空间 “#” 像素空间&#xff0c;即坐标原点为图片左上角的坐标空间&am…