来自this文章,
手写计数循环快约3倍
比用于迭代arraylists的增强for循环。
首先,“手写计数循环”是什么意思?他们没有明确说明这意味着什么。其次,为什么这只适用于arraylists而不是其他集合呢?
答案 0 :(得分:6)
首先,“手写计数循环”是什么意思?
我认为他们的意思是
for(int i=0;i<list.size();i++) {
list.get(i);
}
其次,为什么这只适用于arraylists而不是其他集合呢?
ArrayList支持高效的随机访问,删除Iterator可以做一些小的改进。 (如果你有一个没有做任何其他事情的循环,那么会有很大的相对改善)
对于其他收藏品,例如LinkedList,使用迭代器更快,因为get(n)
更慢。对于Set,没有get(n)
答案 1 :(得分:4)
这个问题的所有答案(在我写这篇文章的时候有三个答案)都是错的。
对于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);
}
否则循环的每次迭代都会有查找惩罚!如果您仔细阅读了问题中链接的文章,您会看到谷歌也推荐这种模式。
答案 2 :(得分:0)
手写的计数循环看起来像同一篇文章中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
}
答案 3 :(得分:0)
这是一个手写的计数循环。它们的意思是你手动编写了一个循环来计算数组中的每个元素。
for (int i = 0; i < mArray.length; ++i) {
这适用于arraylists,因为它们的底层实现。因为增强的for循环必须一般地工作,所以它不能假定某些东西;例如索引的起点和终点。