JavaのArrayLIstのスレッドセーフについて質問です。
Java SIlver 黒本より
ソース1
Java
1Arraylist<String> list = new ArrayList<>(); 2 3list.add("A"); 4list.add("B"); 5list.add("C"); 6 7for (String str : list){ 8 9 if("B".equals(str)){ 10 list.remove(str); 11}else{ 12System.out.println(str); 13} 14 15}
ソース2
Java
1Arraylist<String> list = new ArrayList<>(); 2 3list.add("A"); 4list.add("B"); 5list.add("C"); 6list.add("D"); 7list.add("E"); 8 9for (String str : list){ 10 11 if("C".equals(str)){ 12 list.remove(str); 13} 14 15} 16 17for (String str : list){ 18System.out.println(str); 19}
*クラスの宣言とmainメソッドは省略しました。
このソース1の実行した結果として
A
が出力。
ソース2は実行時に例外がスローされるとあります。
ConcurrentModificationException←これ
その理由として、ループで読みだしている最中にremoveメソッドを呼び出しているからとあります。
しかし、ソース1でもremoveメソッドを呼び出しているのにソース1では例外がスローされません。これはなぜでしょうか?
私なりの考察。
ソース1では拡張for文2回目のループでremoveメソッドが処理され3買い目のループは要素がなくなり2回目で終わり、残りの要素に影響されない。
ソース2では拡張for文3回目のループでremoveメソッドが処理され4回目ループの際の"E"がまだ残っているため要素数の順番に影響があるから?
よろしくお願いします。
回答4件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。