为什么非连续容器的迭代器更快?

时间:2012-11-03 21:29:34

标签: java iterator implementation

Stack Overflow上的另一个主题“traditional for loop vs Iterator in Java”讨论了使用索引和使用迭代器之间的性能差异。最佳答案指出,处理LinkedList等容器时存在非常显着的差异(因子为60.000)。

我希望这与缓存有关。如果是这样,迭代器如何解决这个问题呢?如果它与缓存未命中无关,那么什么使非连续容器的迭代器更快?

1 个答案:

答案 0 :(得分:2)

链表的差异不是任何常数因素 - 它是采取O(1)或O(N)的“步骤”之间的差异。 (所以列表越大,差异越大。)

迭代器保留了“采取下一步”所需的任何状态。对于链接列表,采取下一步意味着只需遵循从一个节点到下一个节点的引用...而通过 index 访问元素意味着从头开始并执行相同的“下一步移动”步骤很多次。

将它与ArrayList进行比较,其中迭代器只需要记住当前索引,然后“随机访问”和“顺序”访问都只涉及直接到数组的右边元素。

所以它并非真正缓存 - 它保留了状态。迭代器是否比索引访问更快取决于索引的访问权限。在ArrayList的情况下,它很便宜。在LinkedList的情况下,它不是。