Java Silverを勉強している者です。
現在「Java APIの主要なクラスの操作」という章の問題を解いているのですが、
解説を読んでも分からない部分があったため、こちらで質問させていただきます。
【質問】以下の2つのコードは、なぜ同じ動きにならないのでしょうか?
以下、それぞれのコードの結果です。
1つ目のコードでは、「A」のみが表示されます。
Java
1import java.util.ArrayList; 2 3public class Chapter09 { 4 public static void main(String[] args) { 5 ArrayList<String> list = new ArrayList<>(); 6 list.add("A"); 7 list.add("B"); 8 list.add("C"); 9 10 for (String str : list) { 11 if ("B".equals(str)) { 12 list.remove(str); 13 } else { 14 System.out.println(str); 15 } 16 }
2つ目のコードでは「ConcurrentModificationException」が発生します。
Java
1import java.util.ArrayList; 2 3public class Chapter09 { 4 public static void main(String[] args) { 5 ArrayList<String> list = new ArrayList<>(); 6 list.add("A"); 7 list.add("B"); 8 list.add("C"); 9 list.add("D"); 10 list.add("E"); 11 12 for (String str : list) { 13 if ("C".equals(str)) { 14 list.remove(str); 15 } 16 } 17 18 for (String str : list){ 19 System.out.println(str); 20 } 21 } 22}
2つ目のコードの解説には、「ArrayListはスレッドセーフなクラスではないため、2つのスレッドで並行処理ができない」と記載されていました。
ただし、それであれば、なぜ1つめのコードでは例外がスローされなかったのかが分かりません。
また、2つ目のコードを下記のように書き換えると「ABCE」ときちんと実行されるのも疑問です。
Java
1import java.util.ArrayList; 2 3public class Chapter09 { 4 public static void main(String[] args) { 5 ArrayList<String> list = new ArrayList<>(); 6 list.add("A"); 7 list.add("B"); 8 list.add("C"); 9 list.add("D"); 10 list.add("E"); 11 12 for (String str : list) { 13 if ("D".equals(str)) { // CをDに変更 14 list.remove(str); 15 } 16 } 17 18 for (String str : list){ 19 System.out.println(str); 20 } 21 } 22}
全く理解できず困っていますので、ご教授いただければ幸いです。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/05/05 04:28
2019/05/05 04:32 編集