回答編集履歴

1

修正と補足

2015/11/04 03:02

投稿

swordone
swordone

スコア20669

test CHANGED
@@ -12,11 +12,13 @@
12
12
 
13
13
  ```
14
14
 
15
+ (ただし、拡張for文の場合はこのiteratorにアクセスする術は存在しない)
16
+
15
- この場合、for文のなか同じコレクションを参照するオブジェクトがListとIteratorの2つ存在する状態になります。
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