Stack Overflow上的另一个主题“traditional for loop vs Iterator in Java”讨论了使用索引和使用迭代器之间的性能差异。最佳答案指出,处理LinkedList
等容器时存在非常显着的差异(因子为60.000)。
我希望这与缓存有关。如果是这样,迭代器如何解决这个问题呢?如果它与缓存未命中无关,那么什么使非连续容器的迭代器更快?
答案 0 :(得分:2)
链表的差异不是任何常数因素 - 它是采取O(1)或O(N)的“步骤”之间的差异。 (所以列表越大,差异越大。)
迭代器保留了“采取下一步”所需的任何状态。对于链接列表,采取下一步意味着只需遵循从一个节点到下一个节点的引用...而通过 index 访问元素意味着从头开始并执行相同的“下一步移动”步骤很多次。
将它与ArrayList
进行比较,其中迭代器只需要记住当前索引,然后“随机访问”和“顺序”访问都只涉及直接到数组的右边元素。
所以它并非真正缓存 - 它保留了状态。迭代器是否比索引访问更快取决于索引的访问权限。在ArrayList
的情况下,它很便宜。在LinkedList
的情况下,它不是。