26

我想避免得到ConcurrentModificationException. 我该怎么做?

4

5 回答 5

54

您可以ListIterator在迭代过程中使用支持删除/添加方法的 a。

ListIterator<Book> iter = books.listIterator();
while(iter.hasNext()){
    if(iter.next().getIsbn().equals(isbn)){
        iter.add(new Book(...));
    }
}
于 2012-07-24T04:53:52.667 回答
13

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

int originalLength = list.length();
for (int i = 0; i < originalLength; i++) {
  MyType mt = list.get(i);
  //... processing
  //... insertions
}
于 2012-07-24T04:43:28.163 回答
7

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

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

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

于 2012-07-24T04:52:53.073 回答
2

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

List<MyType> originalList = ...
List<MyType> newList = new ArrayList<>(originalList);

for(MyType type : originalList)
{
  // Some decisions
  newList.add(new MyType());
}
于 2012-07-24T04:35:33.940 回答
2

有三种方法可以避免上述异常

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

  2. 您可以在迭代时锁定列表,方法是将其放入同步块中。不推荐这种方法,因为它会失去多线程的好处。

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

于 2012-07-24T04:37:33.143 回答