在比较传统的for循环和迭代器时,在遍历ArrayList、HashMap和其他集合时,是否有任何性能测试结果?
或者简单地说,为什么我应该在for循环上使用迭代器,或者反之亦然?
发布于 2015-02-05 20:19:54
是的,它确实对不是基于随机访问的集合(如LinkedList )产生了影响。在内部,链表是由指向下一个(从头节点开始)的节点实现的。
链表中的get(i)方法从头节点开始,遍历所有的链接直到第i个节点。当您使用传统的for循环在链表上迭代时,每次都会从头节点重新开始,这样整个遍历就变成了二次时间。
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开始。
for( Object item: list ) {
//item element is obtained from the iterator's next method.
}
发布于 2009-12-10 16:02:43
在i++语法上使用迭代器的一个最好的原因是,并不是所有的数据结构都支持随机访问,更不用说让它表现良好了。您还应该对列表或集合接口进行编程,这样,如果您后来确定另一个数据结构会更有效,您将能够在不进行大规模操作的情况下将其交换出来。在这种情况下(对接口进行编码的情况),您不一定知道实现细节,更明智的做法可能是将其推迟到数据结构本身。
发布于 2009-12-10 16:07:26
我之所以坚持使用for each,原因之一是它简化了嵌套循环,尤其是在2+维度循环上。你最终可能会操作的所有i,j和k可能很快就会变得混乱。
https://stackoverflow.com/questions/1879255
复制相似问题