【发布时间】:2014-08-09 15:29:06
【问题描述】:
我在我的 android 项目中为 List 使用 for each 循环时遇到了一些麻烦。错误是由迭代器造成的(或者我最好说“错误是我造成的 - 不知道如何使用迭代器”^^)。循环遍历列表以在画布上绘制子弹对象。当其中一颗子弹离开屏幕时,我删除了这个对象。
使用“正常”的 for 循环解决了错误:
for (int ii = 0; ii < bulletList_P1.size(); ii++)
bulletList_P1.get(ii).draw(canvas);
这个实现会带来错误:
for (Bullet bullet : bulletList_P1)
bullet.draw(canvas);
我在 stackoverflow 上找到了 THIS。我的问题的不同之处在于,在这种情况下会创建新对象——我现在的问题是当对象被删除(从列表中删除)时如何处理这种情况。
使用一种或另一种实现的性能差异会有多大?
【问题讨论】:
-
问题其实是一模一样的。当您使用 for-each 循环对其进行迭代时,您无法在结构上修改集合。时期。只要您不使用
LinkedList,性能很可能是相同的。我还想指出,您的“正常” for 循环有可能跳过元素。另外,你在哪里移除子弹?在draw()? -
您可以使用
iterator删除for-each循环中的元素。这个问题已经回答了stackoverflow.com/questions/6958478/… -
阅读ForLoopWorking 以更好地了解如何处理上一节提到的删除场景.....
-
@RaulRene 这仍然会导致
ConcurrentModificationException,因为 for-each 循环产生自己的迭代器。您必须使用while循环或常规for循环。 -
@MartinPfeffer 是的。那里有足够的信息供人们找出你的问题,但你应该更清楚你得到的错误。阅读“I found THIS here on stackoverflow”不如“I get a
ConcurrentModificationExceptionhere is my stack trace”有用。您还向我们展示了代码示例,但都没有包含足够的细节来重现问题。
标签: java android loops for-loop foreach