Java源码解析之Iterable接口
作者:不会编程的派大星 发布时间:2023-04-17 08:06:57
这里我们给定一个集合strings
一、写法1–循环
for (int i = 0, len = strings.size(); i < len; i++) {
System.out.println(strings.get(i));
}
二、写法2–foreach循环
for (String var : strings) {
System.out.println(var);
}
三、写法3–Iterator
Iterator iterator = strings.iterator();
while (iterator.hasNext()) {
System.out.println(iterator.next());
}
对于以上三种遍历方式,相信大家都很熟悉了吧。for循环可以理解为就是通过下标来获取元素,这个特点就和数组很相似。foreach主要对类似链表的解耦提供遍历支持,链表没有下标,如果使用foreach循环的话会大大降低性能。Iterator就是我们今天 要讲述的主角,它实际上就是foreach。
那既然Java为集合提供了这么几种遍历方式,那如果是普通对象或者是任何对象,那又该怎么遍历呢?
四、Iterable
Iterable是迭代器的意思,作用是为集合类提供for-each循环的支持。由于使用for循环需要通过位置获取元素,而这种获取方式仅有数组支持,其他许多数据结构,比如链表,只能通过查询获取数据,这会大大的降低效率。Iterable就可以让不同的集合类自己提供遍历的最佳方式。
我们来看看Iterable文档声明,其中有一句话是这么说的:
Implementing this interface allows an object to be the target of the "for-each loop" statement.
它的作用就是为Java对象提供foreach循环,其主要方法是返回一个Iterator对象:
Iterator<T> iterator();
意思就是,如果想让任意一个Java对象支持foreach,只要实现iterable接口,然后就可以通过Iterator iterator = strings.iterator()
的方式,想集合那样遍历了。
五、Iterator
Iterator是foreach遍历的主体,我们来看看它是怎么实现的呢?
// 判断一个对象集合是否还有下一个元素
boolean hasNext();
// 获取下一个元素
E next();
// 删除最后一个元素。默认是不支持的,因为在很多情况下其结果不可预测,比如数据集合在此时被修改
default void remove(){...}
// 主要将每个元素作为参数发给action来执行特定操作
default void forEachRemaining(Consumer<? super E> action){...}
除此之外,Iterator还有一个子接口,施伟需要双向遍历数据时准备的,来看看它增加了那些方法吧
// 是否有前一个元素
boolean hasPrevious();
// 获取前一个元素
E previous();
// 获取下一个元素的位置
int nextIndex();
// 获取前一个元素的位置
int previousIndex();
// 添加一个元素
void add(E e);
// 替换当前元素值
void set(E e);
六、总结
在Java中有许多特性都是通过接口来实现的,foreach循环也是。foreach主要是解决for循环依赖下标的问题,为高效遍历更多的数据结提供了支持。
来源:https://blog.csdn.net/weixin_45827693/article/details/116571553


猜你喜欢
- Object是所有类的父类,任何类都默认继承Object。一、Object类中的方法1.clone方法保护方法,实现对象的浅复制,只有实现了
- 目录什么是异常?编译时还是运行时?“受检异常”究竟可不可取?我的观点什么是异常?要了解受检异常,首先要了解什么是异常。在Java中,异常是一
- 最近一直在对接接口,上游返回的都是 JSON 数据,我们需要将这些数据进行保存,我们可以解析成 Map 通过 key 的方式进行获取,然后
- 前言在上一篇文章中,我们分析了Spring中Bean的实例化过程,在结尾我们知道了虽然bean的实例化完成了,但是其中的属性还没有被注入,今
- 最近有小伙伴告诉我,在循环的判断条件只会计算一次,本金鱼不相信,于是就做了测试,本文记录我做的测试。先来写一个简单的代码, 就一个循环,循环
- 很多朋友问小编springboot项目中怎么集成Swagger呢?swagger世界上最好的api管理工具前言我们为什么要使用api管理工具
- 前言Android 7.0系统发布后,拿到能升级的nexus 6P,就开始了7.0的适配。发现在Android 7.0以上,在相机拍照和图片
- javabean与map的转换有很多种方式,比如:1、通过ObjectMapper先将bean转换为json,再将json转换为map,但是
- 消费逻辑上文 流式图表框架搭建框架搭建好之后着手开发下kafka的核心消费逻辑,流式图表的核心消费逻辑就是实现一个消费链接池维护消
- 本文实例讲述了Java实现的质因数分解操作。分享给大家供大家参考,具体如下:这里演示java通过递归实现质因数分解,代码如下:import
- MSMQ (Microsoft消息队列)是Windows中默认可用的消息队列。作为跨计算机系统发送和接收消息的可靠方法,MSMQ提供了一个可
- 其中包含两个jsp文件,分别为login.jsp和index.jsp代码如下:login.jsp<%@ page language=&
- 秒杀功能秒杀场景现在已经非常常见了,各种电商平台都有秒杀的产品,接下来我们模拟一个秒杀的项目,最终能够确保高并发下的线程安全。界面比较简单,
- 一、着色游戏概述近期群里偶然看到一哥们在群里聊不规则图像填充什么四联通、八联通什么的,就本身好学务实的态度去查阅了相关资料。对于这类着色的资
- 使用SlidingTabLayout需要准备2个类,分别是 SlidingTabLayout,与SlidingTabStrip,,放进项目中
- 本文实例讲述了Android仿微信语音聊天功能代码。分享给大家供大家参考。具体如下:项目效果如下:具体代码如下:AudioManager.j
- Activity类处于android.app包中,继承体系如下:1.java.lang.Object2.android.content.Co
- 定义:定义对象间一种一对多的依赖关系,使得当每一个对象改变状态,则所有依赖于它的对象都会得到通知并自动更新。类型:行为类模式类图: 
- 本文实例讲述了Android开发中ProgressDialog简单用法。分享给大家供大家参考,具体如下:网上一般对进度条的示例都是如何显示,
- 一、什么算异步?广义来讲,两个工作流能同时进行就算异步,例如,CPU与外设之间的工作流就是异步的。在面向服务的系统中,各个子系统之间通信一般