| English | 意味 |
|---|---|
| ConcurrentModificationException/kənˈkʌrənt ˌmɒdɪfɪˈkeɪʃn ekˈsepʃn/ | ConcurrentModificationException |
Choose a traversal that matches the intended change
- An ArrayList contains [2, 3, 4]. You want to double every stored value, while keeping the number of elements unchanged.
- An indexed loop can use list.set(i, 2 * list.get(i)). Assigning x = 2*x in for (int x : list) changes only the local loop variable.
list [2, 3, 4] から start して、for (int x : list) { x = 2 * x; } を実行します。list.get(1) の値は何ですか?
難易度 2/5 · 140 コイン + 今日初回完了時に小ボーナス付与
ローカルプリミティブ x に代入しても、格納された整数は上書きされません。中央のリスト要素は 3 のままです。
Looping over a list
- Traverse an ArrayList just like an array, but with its methods. Indexed:
for (int i = 0; i < list.size(); i++) { ... list.get(i) ... } - For-each:
for (String s : list) { ... s ... }— clean for reading values.size()(notlength) bounds the indexed loop.
The same patterns
- Sum, count, min/max, and search all work the same as with arrays. Just swap
a[i]forlist.get(i)anda.lengthforlist.size(). - The accumulator and max/count logic is identical. Everything you learned for array traversal carries over.
Reading vs. modifying
- An enhanced loop copies each element value into its loop variable. For
Integerelements read asint x, assigning toxdoes not replace a list element; an indexed loop can replace it withset(i, x). - For structural changes (adding/removing), use the indexed loop carefully. Reading is simple; removing while looping needs extra care (next lesson).
インデックスによるArrayListの合計計算
size()で境界設定、get(i)で読み取り(list = [10,20,30])。
インデックス付きArrayListループの正しい条件は...
難易度 1/5 · 100 コイン + 今日初回完了時に小ボーナス付与
ArrayListではsize()を使用し、配列ではlengthを使用します。
Why should a program avoid direct structural changes during an ArrayList enhanced-for traversal?
難易度 1/5 · 100 コイン + 今日初回完了時に小ボーナス付与
ArrayList fail-fast behaviour is best-effort. Avoid unsafe traversal rather than relying on a guaranteed exception.
配列の反復パターン(合計、カウント、最大値)はArrayListでも同じように機能します。
難易度 1/5 · 100 コイン + 今日初回完了時に小ボーナス付与
a[i]/a.lengthをlist.get(i)/list.size()に置き換えるだけです。
リストを反復しながら安全に要素を削除するには、...を使用すべきです。
難易度 1/5 · 100 コイン + 今日初回完了時に小ボーナス付与
for-eachでは構造的な修改ができず、インデックス付きループでは(注意して)可能です。
走査中に構造変更を行わなければ、enhanced loop(強化forループ)は ArrayList
難易度 1/5 · 100 コイン + 今日初回完了時に小ボーナス付与
このループは保存された各参照を読み取ります。走査中の構造変更は別の問題であり、この記述はすべての可能な要素に対するすべての操作が安全であることを保証するものではありません。
Don't modify during for-each
- Adding or removing during a for-each loop may trigger a ConcurrentModificationException 并发修改异常; fail-fast detection is best-effort. The for-each loop assumes the list doesn't change structure underneath it.
- To remove while traversing, use an indexed loop (and manage the index). Reading with for-each is suitable when the list is not structurally changed during traversal. Also check element requirements: unboxing a null Integer still throws an exception.
Bound an indexed ArrayList loop with list.size(), not .length, and never structurally modify during a for-each. Calling add/remove inside a for (x : list) may trigger a ConcurrentModificationException, but detection is not guaranteed. To delete while traversing, use an indexed loop — and remember remove(i) shifts later elements, so don't blindly i++ past the shifted element.
After the indexed doubling update, what is list.get(1)?
難易度 2/5 · 140 コイン + 今日初回完了時に小ボーナス付与
The middle stored value 3 is replaced by 6. Reassigning a primitive loop variable would leave it at 3.
非nullな Student エントリについて、for (Student s : students) 内で s.addScore(5) を呼び出すと、リストの要素を追加または削除することなく、保存された学生情報を更新できます。
難易度 1/5 · 100 コイン + 今日初回完了時に小ボーナス付与
コピーされた参照は可変な Student オブジェクトを指しています。リスト構造を変更せずに、それらのフィールドは変更可能です。
Summing an ArrayList
- Indexed:
for (int i = 0; i < list.size(); i++) { sum += list.get(i); } - For-each:
for (int x : list) { sum += x; }(autoboxing/unboxing handles Integer↔int). - Both total the list; for-each is cleaner for read-only.
Carry the reasoning to a new case
- Adding or removing directly during enhanced traversal is unsafe; fail-fast exceptions are best-effort, not a guaranteed correctness check.
- A list of mutable Student objects can be traversed with
for (Student s : students) { s.addScore(5); }, assuming non-null entries. This changes each object's state without changing list structure; assigning a different reference toswould not replace the stored element.
Traverse an ArrayList with an indexed loop (i < list.size(), list.get(i)) or an enhanced loop that receives each element value. The array patterns (sum, count, min/max, search) all carry over. Avoid direct structural changes during an enhanced traversal: a ConcurrentModificationException may detect the bug, but is not guaranteed. Use a carefully managed indexed loop for the removal pattern taught next; changing a referenced object's fields is different from changing list structure.