如何在java中迭代时在List中添加元素?

说我有一个像这样的列表:

List 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在内部使用迭代器:

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

(来自ArrayList javadoc)

在foreach语句中,您无权访问迭代器的add方法,并且在任何情况下仍然不是您想要的add类型,因为它最终不会附加。 您需要手动遍历列表:

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

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

只需迭代旧式方法,因为您需要显式索引处理:

 List myList = ... ... int length = myList.size(); for(int i = 0; i < length; i++) { String s = myList.get(i); // add items here, if you want to } 

迭代列表的副本并将新元素添加到原始列表中。

 for (String s : new ArrayList(list)) { list.add("u"); } 

请参见如何制作ListList类型的ArrayList对象的副本?

您可以迭代原始列表的副本(克隆):

 List copy = new ArrayList(list); for (String s : copy) { // And if you have to add an element to the list, add it to the original one: list.add("some element"); } 

请注意,甚至无法在迭代时向列表添加新元素,因为它会导致ConcurrentModificationException

我这样做是通过将元素添加到新的空tmp列表,然后使用addAll()将tmp列表添加到原始列表。 这可以防止不必要地复制大型源列表。

想象一下当OP的原始列表中有几百万个项目时会发生什么; 有一段时间你会把内存吸两倍。

除了节省资源之外,这种技术还可以防止我们不得不求助于80s风格的for循环并使用有效的数组索引,这些索引在某些情况下可能没有吸引力。