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语法是首选,代码更优美,也不容易出错。

  • 8
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值