6

这篇文章中,

手写计数循环大约快 3 倍

比用于迭代数组列表的增强 for 循环。

首先,“手写计数循环”是什么意思?他们没有明确说明这意味着什么。其次,为什么这仅适用于数组列表而不适用于其他集合?

4

4 回答 4

7

首先,“手写计数循环”是什么意思?

我想他们的意思是

for(int i=0;i<list.size();i++) {
    list.get(i);
}

其次,为什么这仅适用于数组列表而不适用于其他集合?

ArrayList 支持高效的随机访问,移除 Iterator 可以带来小的改进。(或者如果你有一个不做任何其他事情的循环,则相对来说会有很大的改进)

对于其他集合,例如 LinkedList,使用迭代器会更快,因为get(n)它更慢。对于 Set 没有get(n)

于 2012-04-11T20:11:25.100 回答
5

这个问题的所有答案(在我写这篇文章时有三个答案)都是错误的。

对于 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);
}

否则循环的每次迭代都会有一个查找惩罚!如果您仔细阅读问题中链接的文章,您会看到谷歌也推荐这种模式。

于 2013-06-10T07:25:59.660 回答
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
}
于 2012-04-11T20:09:45.623 回答
0

这是一个手写的计数循环。他们的意思是您手动编写了一个循环来计算数组中的每个元素。

for (int i = 0; i < mArray.length; ++i) {

考虑到它们的底层实现,这适用于数组列表。因为增强的 for 循环必须通用,它不能假设某些事情;例如索引起点和终点。

于 2012-04-11T20:10:46.450 回答