`
thecloud
  • 浏览: 881141 次
文章分类
社区版块
存档分类
最新评论

for循环 增强for循环 iterator遍历集合的区别与用法

 
阅读更多

1.手先增强for循环和iterator遍历的效果是一样的,也就说
增强for循环的内部也就是调用iteratoer实现的,但是增强for循环 有些缺点,例如不能在增强循环里动态的删除集合内容。不能获取下标等。
2.ArrayList由于使用数组实现,因此下标明确,最好使用普通循环。
3.而对于 LinkedList 由于获取一个元素,要从头开始向后找,因此建议使用 增强for循环,也就是iterator。

对于ArrayList,Vector其核心是一个数组,如果明确知道List的实例是ArrayList,Vector,当然用for(inti=0;i<lst.size();i++){}这种方式是最快的.当然用Iterator的话,其实是相关无几,Iterator基本上都是指针操作,Iterator本身的处理会增加一点点的开销,跟踪一下源码就可以知道.

Iterator好处:通用,对于所有集合,使用Iterator性能都一样,客户端自身不维护遍历集合的"指针",所有的内部状态(如当前元素位置,是否有下一个元素)都由Iterator来维护,而这个Iterator由集合类通过工厂方法生成,因此,它知道如何遍历整个集合。
客户端从不直接和集合类打交道,它总是控制Iterator,向它发送"向前","向后","取当前元素"的命令,就可以间接遍历整个集合。

for(i=0;...)方法有一个缺点:如果List的实例是LinkedList等非"数组"存储方式的时候,遍历集合的开销会差别很大!就以LinkedList来说,以下是get(i)方法来取元素的主要代码,我们可以看到,LinkedList内的get(i)方法,用了循环方式来返回元素,性能肯定会差.

Java code
?
1
2
3
4
5
6
7
8
9
10
11
12
13
if(index<0||index>=size)
thrownewIndexOutOfBoundsException("Index:"+index+
",Size:"+size);
Entry<E>e=header;
if(index<(size>>1)){
for(inti=0;i<=index;i++)
e=e.next;
}else{
for(inti=size;i>index;i--)
e=e.previous;
}
returne;
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics