在 for (String key : map.keySet()) 或 iterator 遍歷過程中呼叫 map.put(),會導致迭代器的 modCount 與預期不符,拋出 ConcurrentModificationException。
// ❌ 遍歷時直接 put 新 key
for (String key : maps.keySet()) {
if (key.equals(target)) {
maps.get(key).add(value);
} else {
maps.put(newKey, newList); // 修改結構 → 拋出異常
}
}
List keysToAdd = new ArrayList<>();
for (String key : maps.keySet()) {
if (key.equals(target)) {
maps.get(key).add(value);
} else {
keysToAdd.add(newKey); // 記錄下來
}
}
for (String k : keysToAdd) {
maps.put(k, newList);
}
Iterator> it = maps.entrySet().iterator();
while (it.hasNext()) {
Map.Entry entry = it.next();
if (shouldRemove(entry.getKey())) {
it.remove(); // 唯一允許在遍歷中修改結構的操作
}
}
// 遍歷結束後再 put 新資料
// 線程安全且支援原子更新
ConcurrentHashMap map = new ConcurrentHashMap<>();
map.computeIfAbsent(key, k -> new ArrayList<>()).add(value);
記住:**fail-fast 迭代器是保護你,不是刁難你**。