在Java中,您可以在迭代时修改List吗?

我知道在Java中,不应该在迭代时修改Collection ,例如删除或添加元素。 但是如何更改List中的元素呢? 例如,如果有的话

 List letters = new ArrayList(); letters.add("A"); letters.add("B"); letters.add("C"); int i = 0; for (String letter : letters) { letters.set(i, "D"); i++; } 

所以,我不是在谈论修改存储在元素中的对象; 我在谈论改变对象是什么 。 List的大小没有被更改,但索引处的对象正在改变,所以从技术上来说,List正在被修改。 我的老板声称这段代码很好(而且看起来确实有效),但我仍然认为它不正确。 使用ListIterator的set(E e)方法做一个不同的方法会更好吗?

在遍历它时修改列表中的元素的想法没有任何问题(不要修改列表本身,不建议这样做),但它可以更好地表达如下:

 for (int i = 0; i < letters.size(); i++) { letters.set(i, "D"); } 

最后,整个列表将以字母"D"作为其内容。 在这种情况下使用增强的for循环不是一个好主意,你没有使用迭代变量,除此之外你不能使用迭代变量修改列表的内容。

请注意,上面的代码段没有修改列表的结构 - 意思是:没有添加或删除元素,列表的大小保持不变。 简单地将一个元素替换为另一个元素并不算作结构修改。 这是@ZouZou在评论中引用的文档的链接 ,它指出:

结构修改是添加或删除一个或多个元素或显式调整后备数组大小的任何操作; 仅设置元素的值不是结构修改

使用CopyOnWriteArrayList
如果要删除它,请执行以下操作:

 for (Iterator it = userList.iterator(); it.hasNext() ;) { if (wordsToRemove.contains(word)) { it.remove(); } }