从这篇文章中,
手写计数循环大约快 3 倍
比用于迭代数组列表的增强 for 循环。
首先,“手写计数循环”是什么意思?他们没有明确说明这意味着什么。其次,为什么这仅适用于数组列表而不适用于其他集合?
首先,“手写计数循环”是什么意思?
我想他们的意思是
for(int i=0;i<list.size();i++) {
list.get(i);
}
其次,为什么这仅适用于数组列表而不适用于其他集合?
ArrayList 支持高效的随机访问,移除 Iterator 可以带来小的改进。(或者如果你有一个不做任何其他事情的循环,则相对来说会有很大的改进)
对于其他集合,例如 LinkedList,使用迭代器会更快,因为get(n)
它更慢。对于 Set 没有get(n)
这个问题的所有答案(在我写这篇文章时有三个答案)都是错误的。
对于 Android,您不应该对手写循环执行此操作!
for(int i=0;i<list.size();i++) {
list.get(i);
}
以上是错误的!
循环必须如下所示(大小被临时复制到它自己的变量中):
int size = list.size();
for(int i=0;i<size;i++) {
list.get(i);
}
否则循环的每次迭代都会有一个查找惩罚!如果您仔细阅读问题中链接的文章,您会看到谷歌也推荐这种模式。
手写计数循环看起来像同一篇文章中的zero()
循环one()
:
List<Foo> foos = new ArrayList<Foo>();
// populate the list...
for (int i=0; i<foos.size(); i++) {
Foo foo = foos.get(i);
// do something with foo
}
这是一个手写的计数循环。他们的意思是您手动编写了一个循环来计算数组中的每个元素。
for (int i = 0; i < mArray.length; ++i) {
考虑到它们的底层实现,这适用于数组列表。因为增强的 for 循环必须通用,它不能假设某些事情;例如索引起点和终点。