概述
迭代器(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循环所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复