1. ConcurrentModificationExceptionの理由は、
最初に次のコードを確認してください。
public class Test2 {
public static void main(String[] args) {
ArrayList<String> **al** = new ArrayList<String>(); //集合对象
al.add("hello");
al.add("world");
al.add("java");
Iterator<String> **ite** = al.iterator(); //迭代器对象
while(ite.hasNext()) {
String str = ite.next();
if("world".equals(str)) {
**al**.add("sql");
}
}
System.out.println(al);
例外のスクリーンショット:
ArrayList al = new ArrayList(); //コレクションオブジェクト
Iteratorite = al.iterator(); // Iteratorオブジェクト
al.add( "sql"); //コレクションオブジェクトを使用して配列に要素を追加します
反復の基礎となるソースコードの分析:
private class Itr implements Iterator<E> {
int cursor; // index of next element to return
int lastRet = -1; // index of last element returned; -1 if no such
int expectedModCount = modCount;
// prevent creating a synthetic constructor
Itr() {}
public boolean hasNext() {
return cursor != size;
}
@SuppressWarnings("unchecked")
public E next() {
checkForComodification();
int i = cursor;
if (i >= size)
throw new NoSuchElementException();
Object[] elementData = ArrayList.this.elementData;
if (i >= elementData.length)
throw new ConcurrentModificationException();
cursor = i + 1;
return (E) elementData[lastRet = i];
}
Object [] elementData = ArrayList.this.elementData;
elementDataは、基になるデータ構造を指します。現時点では、指す2つの参照があります。要素をトラバースするときは、要素を追加する必要があります。システムは命令を区別できないため、例外(同時変更例外)を報告します。 、その理由は、イテレーターを使用してトラバースする場合、コレクションオブジェクトを使用するメソッドが許可されていないためです。
解決:
public ListIterator<E> listIterator() {
return new ListItr(0);
}
ListItr(0);は、ListIteratorのインターフェイスインスタンスです。
プライベートクラスListItrextendsItrはListIteratorを
実装します{ListItrはListIteratorの内部クラスです。ListItrはItrを継承し、ListIteratorインターフェイスを実装します。ソースコード分析は、ListIteratorメソッドが要素を可逆的にトラバースできるiteratorメソッドの拡張であることを示しています。
ソリューションコード(逆トラバーサル要素を追加):
import java.util.ArrayList;
import java.util.Iterator;
import java.util.ListIterator;
public class Test2 {
public static void main(String[] args) {
ArrayList<String> al = new ArrayList<String>(); //集合对象
al.add("hello");
al.add("world");
al.add("java"); //Iterator<String> ite =al.iterator(); //迭代器对象
ListIterator<String>ite = al.listIterator(); //ListIterator是Iterator接口的扩展,用于解决并发修改的异常
while(ite.hasNext()){
String str = ite.next();
if("world".equals(str)){
ite.add("sql"); //使用了集合对象对数组中元素进行添加
}
}
System.out.println(al);
//逆向遍历元素
while(ite.hasPrevious()){
System.out.println(ite.previous());
}
}
}