当咱们想要遍历集合时,Java为咱们提供了多种选择,一般有如下三种写法:java
for (int i = 0, len = strings.size(); i < len; i++) { System.out.println(strings.get(i)); }
for (String var : strings) { System.out.println(var); }
Iterator iterator = strings.iterator(); while (iterator.hasNext()) { System.out.println(iterator.next()); }
那么以上三种遍历方式有何区别呢?for循环咱们很熟悉了,就是根据下标来获取元素,这个特性与数组十分吻合,不熟悉的朋友能够阅读前面讲解数组的文章。foreach则主要对相似链表的结构提供遍历支持,链表没有下标,因此使用for循环遍历会大大下降性能。Iterator就是咱们今天要讲述的主角,它实际上就是foreach。数组
那么,为何集合能够进行foreach遍历,而咱们本身定义的Java对象却不能够呢?有没有办法让任何对象都支持这种遍历方式?下面的内容会告诉咱们答案。数据结构
Iterable是迭代器的意思,做用是为集合类提供for-each循环的支持。因为使用for循环须要经过位置获取元素,而这种获取方式仅有数组支持,其余许多数据结构,好比链表,只能经过查询获取数据,这会大大的下降效率。Iterable就可让不一样的集合类本身提供遍历的最佳方式。oop
Iterable的文档声明仅有一句:性能
Implementing this interface allows an object to be the target of the "for-each loop" statement.学习
它的做用就是为Java对象提供foreach循环,其主要方法是返回一个Iterator
对象:this
Iterator<T> iterator();
也就是说,若是想让一个Java对象支持foreach,只要实现Iterable接口,而后就能够像集合那样,经过Iterator iterator = strings.iterator()
方式,或者使用foreach,进行遍历了。code
Iterator是foreach遍历的主体,它的代码实现以下:对象
// 判断一个对象集合是否还有下一个元素 boolean hasNext(); // 获取下一个元素 E next(); // 删除最后一个元素。默认是不支持的,由于在不少状况下其结果不可预测,好比数据集合在此时被修改 default void remove(){...} // 主要将每一个元素做为参数发给action来执行特定操做 default void forEachRemaining(Consumer<? super E> action){...}
Iterator
还有一个子接口,是为须要双向遍历数据时准备的,在后续分析ArrayList
和LinkedList
时都会看到它。它主要增长了如下几个方法:blog
// 是否有前一个元素 boolean hasPrevious(); // 获取前一个元素 E previous(); // 获取下一个元素的位置 int nextIndex(); // 获取前一个元素的位置 int previousIndex(); // 添加一个元素 void add(E e); // 替换当前元素值 void set(E e);
在Java中有许多特性都是经过接口来实现的,foreach循环也是。foreach主要是解决for循环依赖下标的问题,为高效遍历更多的数据结构提供了支持。若是你清楚数组和链表的区别,应该就能够回答如下问题了:
for与foreach有何区别,哪一个更高效?
【感谢您能看完,若是可以帮到您,麻烦点个赞~】
更多经验技术欢迎前来共同窗习交流: 一点课堂-为梦想而奋斗的在线学习平台 http://www.yidiankt.com/
![关注公众号,回复“1”免费领取-【java核心知识点】]
QQ讨论群:616683098
QQ:3184402434
想要深刻学习的同窗们能够加我QQ一块儿学习讨论~还有全套资源分享,经验探讨,等你哦!