この質問はJDK 1.8.0_74についてです。クラスはjava.util.ArrayList$Itr
です。ある人がArrayList#iterator()
メソッドを呼び出すと、この(内部)クラスのインスタンスが返されます。 [1]ライン#851でcheckForComodification
コールのために、私はまた、ライン#853ArrayList.Itr#next()はこの行でConcurrentModificationExceptionをスローしますか?
(i >= size)
チェック[2]を理解し、私は理論的根拠を理解
850 public E next() {
851 checkForComodification();
852 int i = cursor;
853 if (i >= size)
854 throw new NoSuchElementException();
855 Object[] elementData = ArrayList.this.elementData;
856 if (i >= elementData.length)
857 throw new ConcurrentModificationException();
858 cursor = i + 1;
859 return (E) elementData[lastRet = i];
860 }
:具体的には、私の質問はItr
上next()
方法についてです
しかし、の856番のチェックが守っている状況は何ですか?シングルスレッドのコードで
、私はいくつかのコードがライン#857にConcurrentModificationException
で失敗作ることができないのです。
[1]:イテレータの作成後に構造変更が失敗した:
static void coMod() {
ArrayList<Integer> list = new ArrayList<>(4);
list.add(1);
list.add(2);
Iterator<Integer> itr = list.iterator();
list.remove(0); //structural modification after iterator creation
if (itr.hasNext()) {
System.out.println("wait, there's more!");
itr.next(); // modification while iterating --
// fails at java.util.ArrayList$Itr.next(ArrayList.java:851)
}
}
[2]:イテレータは終了
static void noHasNext() {
ArrayList<Integer> list = new ArrayList<>(4);
Iterator<Integer> itr = list.iterator();
itr.next(); // unguarded next call --
// fails at java.util.ArrayList$Itr.next(ArrayList.java:854)
}
"シングルスレッドコード" - ここで重要な要素かもしれません... –
「ArrayList」はスレッドセーフではありません。それでそのチェックをする必要がありますか? –
これはちょうどデバッグ用の小道具です - 実際、Javadocのイントロでは次のように言及しています。https://docs.oracle.com/javase/8/docs/api/java/util/ArrayList.html –