首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Java中传统for循环与Iterator/foreach的性能比较

Java中传统for循环与Iterator/foreach的性能比较
EN

Stack Overflow用户
提问于 2009-12-10 15:39:16
回答 5查看 59.8K关注 0票数 62

在比较传统的for循环和迭代器时,在遍历ArrayList、HashMap和其他集合时,是否有任何性能测试结果?

或者简单地说,为什么我应该在for循环上使用迭代器,或者反之亦然?

EN

回答 5

Stack Overflow用户

发布于 2015-02-05 20:19:54

是的,它确实对不是基于随机访问的集合(如LinkedList )产生了影响。在内部,链表是由指向下一个(从头节点开始)的节点实现的。

链表中的get(i)方法从头节点开始,遍历所有的链接直到第i个节点。当您使用传统的for循环在链表上迭代时,每次都会从头节点重新开始,这样整个遍历就变成了二次时间。

代码语言:javascript
复制
for( int i = 0; i< list.size(); i++ ) {
    list.get(i); //this starts everytime from the head node instead of previous node
}

而for each循环遍历从链表获得的迭代器并调用它的next()方法。迭代器维护最后一次访问的状态,因此并不是每次都从head开始。

代码语言:javascript
复制
for( Object item: list ) {
    //item element is obtained from the iterator's next method.
}
票数 3
EN

Stack Overflow用户

发布于 2009-12-10 16:02:43

在i++语法上使用迭代器的一个最好的原因是,并不是所有的数据结构都支持随机访问,更不用说让它表现良好了。您还应该对列表或集合接口进行编程,这样,如果您后来确定另一个数据结构会更有效,您将能够在不进行大规模操作的情况下将其交换出来。在这种情况下(对接口进行编码的情况),您不一定知道实现细节,更明智的做法可能是将其推迟到数据结构本身。

票数 1
EN

Stack Overflow用户

发布于 2009-12-10 16:07:26

我之所以坚持使用for each,原因之一是它简化了嵌套循环,尤其是在2+维度循环上。你最终可能会操作的所有i,j和k可能很快就会变得混乱。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1879255

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档