Java集合源码分析之Iterable概述

作者: 大大纸飞机 | 来源:发表于2018-04-28 17:57 被阅读396次

Iterable是迭代器的意思,作用是为集合类提供for-each循环的支持。由于使用for循环需要通过位置获取元素,而这种获取方式仅有数组支持,其他许多数据结构,比如链表,只能通过查询获取数据,这会大大的降低效率。Iterable就可以让不同的集合类自己提供遍历的最佳方式。

Iterable的文档声明仅有一句:

Implementing this interface allows an object to be the target of the "for-each loop" statement.

其主要方法是返回一个Iterator对象。

Iterator<T> iterator();

Iterator对象我们有时也会用到,经常使用的while(it.hasNext())中的hasNext方法就是在这里定义的。Iterator一共有四个方法:

// 判断一个对象集合是否还有下一个元素
boolean hasNext();

// 获取下一个元素
E next();

// 删除最后一个元素。默认是不支持的,因为在很多情况下其结果不可预测,比如数据集合在此时被修改
default void remove(){...}

// 主要将每个元素作为参数发给action来执行特定操作
default void forEachRemaining(Consumer<? super E> action){...}

Iterator还有一个子接口,是为需要双向遍历数据时准备的,我们在ArrayListLinkedList中都会看到它。其主要增加了以下几个方法:

// 是否有前一个元素
boolean hasPrevious();

// 获取前一个元素
E previous();

// 获取下一个元素的位置
int nextIndex();

// 获取前一个元素的位置
int previousIndex();

// 添加一个元素
void add(E e);

// 替换当前元素值
void set(E e);

Iterable的作用是很明显也很强大的,通过hasNext方法,可以减少诸如链表等结构的查询复杂度,forfor-each循环的主要区别也在此。

相关文章

网友评论

  • 5c95dd320126:如果你清楚数组和链表的区别,应该就可以回答以下问题了:

    for与foreach有何区别,哪个更高效?

    这个答案是不是
    对于数组来说 for 和 foreach 效率差不多。
    对于链表来说,foreach效率更高。

    对foreach的内部实现还是有些模糊。
    大大纸飞机:@05771 可以这样理解的,foreach内部原理就是Iterator了。我相信你理解了某个类,比如ArrayList或者LinkedList之后,就明白它的实现了
  • 小学留了三年:老铁,如果再加上如何使用的话就更完美了。
  • IT人故事会:老铁,经常看别人的分享.感谢别人的分享,感谢!关注了

本文标题:Java集合源码分析之Iterable概述

本文链接:https://www.haomeiwen.com/subject/rzbglftx.html