我是靠谱客的博主 会撒娇未来,最近开发中收集的这篇文章主要介绍Java中的迭代器Iterator和for-each循环,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

迭代器(Iterator)的工作就是循环一个序列,依次获得里面的对象,这里不再需要程序去关心序列的底层结构。

迭代器的接口一共就三个方法:

public interface Iterator {
boolean hasNext();
E next();
void remove();
} 

通过方法名很容易猜到它的目的,在这基础之上还有个ListIterator接口,它是Iterator的子接口,加入了双向迭代的概念。 


Collection与Iterator:


集合的基本接口Collection定义了生成迭代器的方法(它其实是从Iterable接口继承而来):

Iterator<T> iterator(); 

所以每个Collection都会有iterator()方法,即Collection是可迭代的,都能生成一个Iterator对象。

如果你只是简单的循环Collection,而不改变Collection对象,使用foreach语法将会更简洁。它就是使用迭代器的迭代来实现依次循环的。


迭代器与for循环

要使用foreach语法,必须是数组,或者该类必须实现Iterable接口才可以,语法如下:

for(T t : Iterable) { .... }

如果查看编译后的字节码,会发现foreach最终被编译器转为对iterator.next()的调用,这些jdk给隐藏起来了,当然我们在使用中也没有必要知道。

迭代器这些方法的具体实现,各个集合类实现都不一样,有自己的方法。如ArrayList是数组的存储,循环的是数组的方法,而LinkedList是链表,循环的是链表的方法。

很多人有时会讨论foreach和iterator的效率问题,其实他们的实现的过程是一样的。 如下面代码:

List list = new ArrayList();
for (Object obj : list) {
System.out.println(obj);
}

相当于: 

List list = new ArrayList();
Object obj;
for (Iterator iterator = list.iterator(); iterator.hasNext();) {
obj = iterator.next();
System.out.println(obj);
}

for循环与for-each循环

之前我还在纠结使用for循环get的方式,和使用foreach的方式哪种效率高,仔细研究了jdk的源码才明白。

这个要从具体实现的迭代器来看,如ArrayList由于是数组的存储方式,直接使用for循环的get效率会更快,因为不使用迭代的话,其内部机制跳过了中间的“生成迭代器,再调用get”的步骤,所以更快。而LinkedList是链式存储机制,它的每次get都要循环才能获取到,而使用iterator的话,只需要一次循环,所以使用foreach的迭代会高效很多。 

不过总体来说,效率差别不大的情况下(即使是百万级的数据迭代也就几十毫秒,如果真的有那么多的数据占内存中就要使用其他的方法机制了,而不是只用个List对象来存储),写代码使用foreach语法是首选,代码更优美,也不容易出错。

最后

以上就是会撒娇未来为你收集整理的Java中的迭代器Iterator和for-each循环的全部内容,希望文章能够帮你解决Java中的迭代器Iterator和for-each循环所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(42)

评论列表共有 0 条评论

立即
投稿
返回
顶部