当在使用ArrayList
迭代时,如果同时对其进行修改操作,就会抛出ConcurrentModificationException
异常。解决这个问题的方法有以下几种:
Iterator
接口的iterator()
方法获取迭代器,并使用hasNext()
和next()
方法遍历元素。如果需要移除元素,可以使用remove()
方法。这种方法不会抛出ConcurrentModificationException
异常。ArrayList list = new ArrayList<>();
Iterator iterator = list.iterator();
while (iterator.hasNext()) {
Integer element = iterator.next();
// 对元素进行操作
if (condition) {
iterator.remove();
}
}
CopyOnWriteArrayList
:CopyOnWriteArrayList
是ArrayList
的线程安全版本,它通过在修改时创建一个副本来解决并发修改问题。使用CopyOnWriteArrayList
可以避免ConcurrentModificationException
异常。CopyOnWriteArrayList list = new CopyOnWriteArrayList<>();
for (Integer element : list) {
// 对元素进行操作
if (condition) {
list.remove(element);
}
}
synchronized
关键字同步访问:使用synchronized
关键字对ArrayList
进行同步,确保同一时间只有一个线程可以对其进行修改。这种方法需要手动管理同步,比较繁琐。ArrayList list = new ArrayList<>();
synchronized (list) {
for (Integer element : list) {
// 对元素进行操作
if (condition) {
list.remove(element);
}
}
}
以上是几种常见的解决ArrayList
上的ConcurrentModificationException
异常的方法。根据具体的需求和场景选择合适的方法。