在 Java 中,使用 List
的 remove()
方法在循环遍历时直接删除元素可能会导致 ConcurrentModificationException
。这是因为当你在遍历一个集合(如 List
)时,修改它的结构(例如添加、删除元素)会使得迭代器失效,进而引发这个异常。
以下是一个可能引发 ConcurrentModificationException
的示例代码:
List<String> list = new ArrayList<>();
list.add("apple");
list.add("banana");
list.add("cherry");for (String item : list) {if (item.equals("banana")) {list.remove(item); // 这里可能会抛出 ConcurrentModificationException}
}
要避免这个问题,你可以使用以下几种方法:
-
使用迭代器的
remove()
方法:在循环中使用迭代器的remove()
方法可以安全地删除元素。List<String> list = new ArrayList<>(); list.add("apple"); list.add("banana"); list.add("cherry");Iterator<String> iterator = list.iterator(); while (iterator.hasNext()) {String item = iterator.next();if (item.equals("banana")) {iterator.remove();} }
-
使用
ListIterator
:如果你需要在循环中进行多次修改,可以使用ListIterator
,它提供了更多的操作选项,包括插入、删除和替换元素。List<String> list = new ArrayList<>(); list.add("apple"); list.add("banana"); list.add("cherry");ListIterator<String> listIterator = list.listIterator(); while (listIterator.hasNext()) {String item = listIterator.next();if (item.equals("banana")) {listIterator.remove();} }
-
复制原始列表并在副本上进行操作:如果你只是需要删除某些元素,而不需要在循环中添加或修改其他元素,可以先复制原始列表,然后在副本上进行删除操作。
List<String> originalList = new ArrayList<>(); originalList.add("apple"); originalList.add("banana"); originalList.add("cherry");List<String> tempList = new ArrayList<>(originalList); for (String item : originalList) {if (item.equals("banana")) {tempList.remove(item);} }// 现在 tempList 不包含 "banana",而 originalList 保持不变
总之,直接在循环中使用 List
的 remove()
方法可能会导致 ConcurrentModificationException
。为了避免这个问题,应该使用迭代器的 remove()
方法、ListIterator
或者复制原始列表并在副本上进行操作。