Javaのsilverの問題を解いていたのですが二種類の問題の答えに疑問を持ちました。
###一つ目の問題
次のプログラムをコンパイル、実行した時の結果として、正しいものを選びなさい。
package sample;
import java.util.ArrayList;
public class Main_2 {
public static void main(String[] args) { ArrayList<String> list = new ArrayList<>(); list.add("A"); list.add("B"); list.add("C"); list.add("D"); list.add("E"); for (String str : list) { if ("B".equals(str)) { list.remove(str); }else { System.out.println(str); } } for (String str : list) { System.out.println(str); } }
}
A.「A」「B」「D」「E」と表示される
B.「A」「B」「C」「D」「E」と表示される
C.「A」「B」「E」と表示される
D.コンパイルエラーが発生する
E.実行時に例外が発生する <ー正解
###二つ目の問題
次の問題を、コンパイルして。実行した時の結果として、正しいものを選びなさい。
package sample;
import java.util.ArrayList;
public class Main {
public static void main(String[] args) { ArrayList<String> list = new ArrayList<>(); list.add("A"); list.add("B"); list.add("C"); for (String str : list) { if ("B".equals(str)) { list.remove(str); }else { System.out.println(str); } } }
}
A.「A」「C」と表示される
B.「A」「B」「C」と表示される
C.「A」だけ表示される <ー正解
D.コンパイルエラーが発生する
E.実行時に例外がスローされる
##疑問
一つ目の問題の答えの理由は、
ArrayListはスレッドセーフなクラスではないため、
2つのスレッドで並行処理をしている時、片方のスレッドがArrayListから読み出しをしている最中に、
もう片方がスレッドが同じArrayListのインスタンスから要素を削除してしまう可能性があるため、
読み出しの最中に削除しようとすると例外がスローされるから。
そのため、拡張for文で要素を取り出しつつその途中で、removeメソッドを使って削除してしまっています。
removeメソッドを実行するタイミングで、例外がスローされるため選択肢Eが正解です。
とありました。
であるのならば、二つ目の問題も例外がスローされていてもおかしくないと感じました。
実際に、プログラムを実行してみても問題と同じ結果が出力されたので間違いではないと思いましたが、
いまいちピンとこないです。
これはどのような違いがあるのでしょうか?
回答1件
あなたの回答
tips
プレビュー