回答編集履歴
2
抜けがあったので修正
answer
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
|
3
3
|
Listからイテレータ操作中に安全に要素をremoveする場合、このような書き方が正しいです。
|
4
4
|
```Java
|
5
|
-
Iterator<String> itr = list;
|
5
|
+
Iterator<String> itr = list.iterator();
|
6
6
|
while(itr.hasNext()){
|
7
7
|
str = itr.next();
|
8
8
|
if("C".equals(str)){
|
1
追記と修正
answer
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
ConcurrentModificationExceptionが発生するかしないかは「時の運」がからんでいます。監視のタイミングの気まぐれによって起こるといっても過言ではありません。ちなみに、ソース1もソース2も、どちらも「スレッドセーフでないListの、イテレータ操作中のremove」という点においてConcurrentModificationExceptionが発生する可能性は
|
1
|
+
ConcurrentModificationExceptionが発生するかしないかは「時の運」がからんでいます。監視のタイミングの気まぐれによって起こるといっても過言ではありません。ちなみに、ソース1もソース2も、どちらも「スレッドセーフでないListの、イテレータ操作中のremove」という点においてConcurrentModificationExceptionが発生する可能性をはらんでいます。
|
2
2
|
|
3
3
|
Listからイテレータ操作中に安全に要素をremoveする場合、このような書き方が正しいです。
|
4
4
|
```Java
|
@@ -10,4 +10,8 @@
|
|
10
10
|
}
|
11
11
|
}
|
12
12
|
```
|
13
|
-
拡張for文において、「ConcurrentModificationExceptionの起こらない安全なremove方法」は存在しません。イテレータを自分で用意して、イテレータのremoveを使いましょう。
|
13
|
+
拡張for文において、「ConcurrentModificationExceptionの起こらない安全なremove方法」は存在しません。イテレータを自分で用意して、イテレータのremoveを使いましょう。
|
14
|
+
|
15
|
+
#追記
|
16
|
+
存在しないとは言いましたが、Collections.synchronizedListを使えば拡張for内で安全にremove可能な同期Listに置き換えることができます。ただし、あまり理解せずにこれに頼るのはよくないです。速度も遅くなりますし、デッドロックの発生の危険性もあります。
|
17
|
+
[http://qiita.com/mountcedar/items/3a4d147d12e8b38cf6d0](http://qiita.com/mountcedar/items/3a4d147d12e8b38cf6d0)
|