我在理解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());
}
答案 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()会发生变化。我假设你打算让ctr
和i
保持一致。它相当于
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循环吗?
没有。您的循环
first,intValue()
,循环索引为ctr
,但myCollection.get(i)
,您获取temp
并保留item
未定义),myCollection
,添加到它,同时不断检查不断增长的大小,所以它size()
正在增长),但OutOfMemoryError
。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有助于你的循环表现良好。