Java – 在迭代时向列表添加元素

我想避免得到ConcurrentModificationException 。 我该怎么办?

您可以使用ListIterator ,它在迭代过程中支持remove / add方法。

 ListIterator iter = books.listIterator(); while(iter.hasNext()){ if(iter.next().getIsbn().equals(isbn)){ iter.add(new Book(...)); } } 

您可以使用带索引的for循环,而不是使用迭代器。 例如:

 int originalLength = list.length(); for (int i = 0; i < originalLength; i++) { MyType mt = list.get(i); //... processing //... insertions } 

您想使用ListIterator 。 您可以从任何类型的列表中获取其中一个,但为了提高效率,您可能希望从LinkedList获取一个。

 import java.util.*; class TestListIterator { public static void main(String[]args) { List L = new LinkedList(); L.add(0); L.add(1); L.add(2); for (ListIterator i = L.listIterator(); i.hasNext(); ) { int x = i.next(); i.add(x + 10); } System.out.println(L); } } 

打印[0, 10, 1, 11, 2, 12] 0,10,1,11,2,12 [0, 10, 1, 11, 2, 12]

创建一个新列表,并填充该列表。

 List originalList = ... List newList = new ArrayList<>(originalList); for(MyType type : originalList) { // Some decisions newList.add(new MyType()); } 

有三种方法可以避免上述exception

  1. 您可以将列表转换为数组,然后迭代数组。 这种方法适用于中小型列表,但如果列表很大,则会对性能产生很大影响。

  2. 您可以通过将列表放在同步块中来锁定列表。 不推荐这种方法,因为它将停止multithreading的好处。

  3. 如果您使用的是JDK1.5或更高版本,则可以使用ConcurrentHashMap和CopyOnWriteArrayList类。 这是推荐的方法。