teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

2

補足

2015/09/29 09:35

投稿

swordone
swordone

スコア20675

answer CHANGED
@@ -12,4 +12,9 @@
12
12
  0. next()によって"C"が取り出され,Iteratorの現在位置は1加算され"3",remove()でリストのサイズは2になる
13
13
  0. hasNext()はサイズ≠位置なのでtrue.ループ継続する
14
14
  0. 次のnext()でリスト側の変更回数がremove()によって1回多いことが判明,例外発生
15
- こういうことになります.
15
+ こういうことになります.
16
+
17
+ 追記・補足
18
+ [ArrayListのJavadoc](https://docs.oracle.com/javase/jp/7/api/java/util/ArrayList.html)に次のような記述があります.
19
+ > このクラスの iterator および listIterator メソッドによって返されるイテレータは、フェイルファストです。イテレータの作成後に、イテレータ自体の remove または add メソッド以外の方法でリストが構造的に変更されると、イテレータは ConcurrentModificationException をスローします。このように、並行して変更が行われると、イテレータは、将来の予測できない時点において予測できない動作が発生する危険を回避するために、ただちにかつ手際よく例外をスローします。
20
+ > 通常、非同期の並行変更がある場合、確かな保証を行うことは不可能なので、イテレータのフェイルファストの動作を保証することはできません。フェイルファストイテレータは最善努力原則に基づき、ConcurrentModificationException をスローします。したがって、正確を期すためにこの例外に依存するプログラムを書くことは誤りです。「イテレータのフェイルファストの動作はバグを検出するためにのみ使用すべきです」。

1

色々修正

2015/09/29 09:35

投稿

swordone
swordone

スコア20675

answer CHANGED
@@ -4,12 +4,12 @@
4
4
 
5
5
  前者:
6
6
  0. "B"が取り出される直前,Iteratorの現在位置は"B"の位置である"1"
7
- 0. next()によって"B"が取り出され,remove()でリストのサイズは2に,Iteratorの現在位置は1加算され"2"
7
+ 0. next()によって"B"が取り出され,Iteratorの現在位置は1加算され"2",remove()でリストのサイズは2になる
8
8
  0. 次のループでhasNext()はサイズ=現在位置によりfalseを返す.ループを抜けるため変更回数チェックがされず例外は発生しない
9
9
 
10
10
  後者:
11
11
  0. "C"が取り出される直前,Iteratorの現在位置は"C"の位置である"2"
12
- 0. next()によって"C"が取り出され,remove()でリストのサイズは2に,Iteratorの現在位置は1加算され"3"
12
+ 0. next()によって"C"が取り出され,Iteratorの現在位置は1加算され"3",remove()でリストのサイズは2になる
13
- 0. hazNext()はサイズ≠位置なのでtrue.ループ継続する
13
+ 0. hasNext()はサイズ≠位置なのでtrue.ループ継続する
14
14
  0. 次のnext()でリスト側の変更回数がremove()によって1回多いことが判明,例外発生
15
15
  こういうことになります.