回答編集履歴
1
修正と補足
test
CHANGED
@@ -12,11 +12,13 @@
|
|
12
12
|
|
13
13
|
```
|
14
14
|
|
15
|
+
(ただし、拡張for文の場合はこのiteratorにアクセスする術は存在しない)
|
16
|
+
|
15
|
-
この場合、for文の
|
17
|
+
この場合、for文の中で同じコレクションを参照するオブジェクトがListとIteratorの2つ存在する状態になります。
|
16
18
|
|
17
19
|
このように、Iteratorで反復処理をしている間は、Iterator自身の変更メソッド以外でリストに変更が加えられた場合(Listの方から変更を加えるような場合)にIteratorはできるだけ早く例外を発生させる仕組みになっています。
|
18
20
|
|
19
|
-
ArrayListがiterator()メソッドで生成するIteratorを調べてみると、hasNext()メソッドは「現在のカーソル位置の数値とリスト総数が同じでない場合trueを返す」という実装になっています。next()やremove()の操作の時に、もとのリストでIteratorが想定していない変更が加えられていた場合に、例外を発生させる仕組みになっています。
|
21
|
+
ArrayListがiterator()メソッドで生成するIterator(例外ログ中のArrayList$Itrがこれ)を調べてみると、hasNext()メソッドは「現在のカーソル位置の数値とリスト総数が同じでない場合trueを返す」という実装になっています。next()やremove()の操作の時に、もとのリストでIteratorが想定していない変更が加えられていた場合に、例外を発生させる仕組みになっています(例外ログのcheckForComodification)。
|
20
22
|
|
21
23
|
1と3のコードはリスト操作の結果、カーソル位置とリスト総数が一致しないためループが続行し、next()を呼んだ時に例外が発生しますが、2の場合はリスト操作の結果、**たまたま**カーソル位置とリスト総数が一致したため、次のループに入らずに、next()も呼ばれないために、例外が発生していないのです。
|
22
24
|
|