对于每个循环问题

时间:2011-03-15 17:27:19

标签: java arraylist foreach

我在理解for-each循环时遇到了问题。我熟悉w / for-each的典型结构,其中有每个元素的内置计数器和赋值语句。但是,在下面的代码中,“new”关键字意味着什么?它只执行一次吗?

for(Integer item : new ArrayList<Integer>(myCollection)){
    myCollection.add(first.intValue() + item.intValue());
}

这相当于以下for循环吗?

for(int ctr = 0; ctr < myCollection.size(); ctr++){
    Integer temp = myCollection.get(ctr);
    myCollection.add(first.intValue() + item.intValue());
}

5 个答案:

答案 0 :(得分:4)

new关键字意味着它将创建一个新的ArrayList,就像它在代码中的任何其他地方一样。

代码与以下内容基本相同。在for-each循环中使用new没什么特别的。

List<Integer> list = new ArrayList<Integer>(myCollection);
for(Integer item : list){
    myCollection.add(first.intValue() + item.intValue());
}

它与您的替代循环不同,因为当您向其添加内容时,size()会发生变化。我假设你打算让ctri保持一致。它相当于

for(int i = 0, size = myCollection.size(); i < size; i++){
    myCollection.add(first.intValue() + myCollection.get(i).intValue());
}
我认为

相同
for(int i = 0, size = myCollection.size(); i < size; i++)
    myCollection.add(first + myCollection.get(i));

答案 1 :(得分:2)

第一个代码块会创建一个新的ArrayList Integers,将myCollection的内容复制到其中,然后迭代生成的ArrayList

由于原始myCollection在循环内被修改,因此需要复制。

第二个代码块与第一个代码块不等同,因为它在迭代它时向myCollection添加了元素。由于这种相互作用,它不会达到您的预期,并会导致无限循环。

答案 2 :(得分:0)

您提供的两个代码非常相似,但主要区别(new关键字)是您在第一个代码中创建原始列表的副本。这是必需的,因为在循环内部,您将向列表中添加更多项目,从而增加其大小。这样,循环将永远不会退出,最终你将获得内存。

使用for(;;)的等效代码如下:

List<Integer> auxList = new ArrayList<Integer>(myCollection);
for(int ctr = 0; ctr < auxList.size(); ctr++){
    myCollection.add(first.intValue() + auxList.get(ctr));
}

或者,您可以简单地预先计算大小以避免此验证码:

int size = myCollection.size();
for(int ctr = 0; ctr < size; ctr++){
    myCollection.add(first.intValue() + myCollection.get(ctr));
}

除此之外,唯一的区别是foreach方法使用迭代器而不是按索引访问元素。

希望它有所帮助!

答案 3 :(得分:0)

  

它只执行一次吗?

  

这相当于以下for循环吗?

没有。您的循环

  1. 有三个错误(first,intValue(),循环索引为ctr,但myCollection.get(i),您获取temp并保留item未定义),
  2. 迭代myCollection,添加到它,同时不断检查不断增长的大小,所以它
  3. 不会终止(size()正在增长),但
  4. 除外
  5. 最终会抛出OutOfMemoryError
  6. 但是,它等同于

    for (int i = 0, n = myCollections.size(); i < n; i++) {
        Integer item = myCollection.get(i);
        myCollection.add(first.intValue() + item.intValue());
    }
    

答案 4 :(得分:0)

你的for循环

for(Integer item : new ArrayList<Integer>(myCollection)){
    myCollection.add(first.intValue() + item.intValue());
}

编译为与

相同的代码(模数变量名)
for (Iterator<Integer> iterator = new ArrayList<Integer>(myCollection).iterator();
     it.hasNext(); ) {
    Integer item = iterator.next();
    myCollection.add(first.intValue() + item.intValue());
}

如果myCollection的大小不会改变(并且myCollection是List),那么这将是相同的(仅创建临时列表的效率较低)

for(int ctr = 0; ctr < myCollection.size(); ctr++){
    Integer temp = myCollection.get(i);
    myCollection.add(first.intValue() + temp.intValue());
}

...但是你正在循环中更改myCollection,所以第二个循环永远不会到达结尾(假设其中至少有一个元素)。

所以你的ArrayList有助于你的循环表现良好。