Java源码解析之Iterable接口

 更新时间:2021年05月21日 17:27:42   作者:不会编程的派大星  
遍历集合我相信大部分coder都会遇到,也经常使用,而Java给我们提供了多种选择,接下来就让我们一起来看看吧,需要的朋友可以参考下

这里我们给定一个集合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循环依赖下标的问题,为高效遍历更多的数据结提供了支持。

到此这篇关于Java源码解析之Iterable接口的文章就介绍到这了,更多相关Java Iterable接口内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Spring中@PropertySource的使用方法和运行原理详解

    Spring中@PropertySource的使用方法和运行原理详解

    这篇文章主要介绍了Spring中@PropertySource的使用方法和运行原理详解,PropertySource注解可以方便和灵活的向Spring的环境容器(org.springframework.core.env.Environment Environment)中注入一些属性,这些属性可以在Bean中使用,需要的朋友可以参考下
    2023-11-11
  • JVM中的守护线程示例详解

    JVM中的守护线程示例详解

    这篇文章主要给大家介绍了关于JVM中守护线程的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-01-01
  • Java基础教程之对象引用

    Java基础教程之对象引用

    这篇文章主要介绍了Java基础教程之对象引用,“对象引用”(object reference)是一个重要重要概念,涉及内存,需要的朋友可以参考下
    2014-09-09
  • Redis内存数据库示例分析

    Redis内存数据库示例分析

    Redis本身的内容比较复杂。如果你上来,你应该研究一个细节点,比如连接池和数据结构。虽然可以直接了解某一点的详细来源内容,甚至尽快解决一些意外,但是容易淹没在失眠的细节中,整体控制不了Redis
    2022-12-12
  • java读取文件和写入文件的方式(简单实例)

    java读取文件和写入文件的方式(简单实例)

    下面小编就为大家带来一篇java读取文件和写入文件的方式(简单实例)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-10-10
  • Java基础之数组模拟循环队列

    Java基础之数组模拟循环队列

    这篇文章主要介绍了Java基础之数组模拟循环队列,文中有非常详细的代码示例,对正在学习java基础的小伙伴们也有非常好的帮助,需要的朋友可以参考下
    2021-04-04
  • java反射方式创建代码详解

    java反射方式创建代码详解

    在本篇文章里小编给大家整理的是一篇关于java反射方式创建代码详解内容,对此有兴趣的朋友们可以学习下。
    2021-01-01
  • RocketMQ中消费者概念和消费流程详解

    RocketMQ中消费者概念和消费流程详解

    这篇文章主要介绍了RocketMQ中消费者概念和消费流程详解,RocketMQ是一款高性能、高可靠性的分布式消息中间件,消费者是RocketMQ中的重要组成部分,消费者负责从消息队列中获取消息并进行处理,需要的朋友可以参考下
    2023-10-10
  • Java编码辅助工具Mapstruct用法详解

    Java编码辅助工具Mapstruct用法详解

    这篇文章主要介绍了Java编码辅助工具Mapstruct用法详解,手动编码setter/getter各个对应属性,会显得臃肿繁琐。通过Mapstruct框架可简单方便地完成这一工作。,需要的朋友可以参考下
    2019-06-06
  • Spring Boot自定义错误视图的方法详解

    Spring Boot自定义错误视图的方法详解

    这篇文章主要介绍了Spring Boot自定义错误视图的方法详解,需要的朋友可以参考下
    2020-08-08

最新评论