使用ArrayLists优化for循环

时间:2012-04-11 20:07:18

标签: java arraylist

来自this文章,

  

手写计数循环快约3倍

比用于迭代arraylists的增强for循环。

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

4 个答案:

答案 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循环必须一般地工作,所以它不能假定某些东西;例如索引的起点和终点。

相关问题