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

标签:Java,Iterable,接口
0
投稿

猜你喜欢

  • Android PopupWindow实现遮罩层效果

    2022-02-04 13:28:46
  • Springboot之自定义全局异常处理的实现

    2022-11-12 04:49:23
  • java求余的技巧汇总

    2023-08-06 06:33:16
  • Android RecyclerView详解之实现 ListView GridView瀑布流效果

    2023-11-26 10:09:00
  • Android仿IOS UIAlertView对话框

    2023-09-28 09:00:12
  • java中面向对象的概念及知识点总结

    2022-07-14 03:14:01
  • 解决Android平台中应用程序OOM异常的方法

    2023-07-29 09:45:17
  • Java 数据结构与算法系列精讲之哈希算法实现

    2022-01-10 23:56:07
  • 解决Android从相册中获取图片出错图片却无法裁剪问题的方法

    2023-09-14 23:41:15
  • C#多态的三种实现方式(小结)

    2022-12-29 18:10:57
  • java中List接口与实现类介绍

    2022-11-17 02:54:40
  • 详解OpenGL Shader抗锯齿的实现

    2021-09-24 21:54:07
  • Mybatis-Plus查询中如何排除标识字段

    2023-11-23 20:38:46
  • C#中is和as用法实例分析

    2023-08-17 06:21:42
  • 解析Flink内核原理与实现核心抽象

    2023-11-25 10:30:04
  • Spring mvc拦截器实现原理解析

    2023-06-06 15:26:33
  • 手写redis@Cacheable注解 参数java对象作为key值详解

    2022-04-26 11:30:36
  • java操作mongodb之多表联查的实现($lookup)

    2023-08-08 10:24:07
  • Android开发中解析xml文件XmlUtils工具类与用法示例

    2023-03-26 01:05:45
  • aop的实现原理_动力节点Java学院整理

    2022-04-02 16:09:21
  • asp之家 软件编程 m.aspxhome.com