在Java中进行迭代时如何在List中添加元素?


问题内容

假设我有一个清单,例如:

List<String> list = new ArrayList<>();
list.add("a");
list.add("h");
list.add("f");
list.add("s");

在遍历此列表时,我想在列表末尾添加一个元素。但是我不想遍历新添加的元素,也就是我想遍历列表的初始大小。

for (String s : list)
     /* Here I want to add new element if needed while iterating */

有人可以建议我该怎么做吗?


问题答案:

您不能为此使用foreach语句。foreach在内部使用迭代器:

此类的迭代器和listIterator方法返回的迭代器是快速失败的:如果在创建迭代器之后的任何时间以任何方式对列表进行结构修改,则除了通过迭代器自己的remove或add方法之外,迭代器都会抛出ConcurrentModificationException。

(来自ArrayList javadoc)

在foreach语句中,您无权访问迭代器的add方法,在任何情况下,它都不是所需的添加类型,因为它不会在末尾追加。您需要手动遍历列表:

int listSize = list.size();
for(int i = 0; i < listSize; ++i)
  list.add("whatever");

请注意,这仅对允许随机访问的列表有效。您可以通过检查列表是否实现RandomAccess标记接口来检查此功能。ArrayList具有随机访问权限。链表则没有。