並行処理(ConcurrentHashMap.merge)難易度 標準無料
次のコードの出力として正しいものを選べ。
1 import java.util.*;
2 import java.util.concurrent.*;
3 public class Q10 {
4 public static void main(String[] a) {
5 ConcurrentHashMap<String, Integer> m = new ConcurrentHashMap<>();
6 for (String w : List.of("a", "b", "a", "c", "a", "b"))
7 m.merge(w, 1, Integer::sum);
8 System.out.println(m.get("a") + " " + m.get("b") + " " + m.get("c"));
9 }
10 }
- A
3 2 1 - B
1 1 1 - C
NullPointerExceptionがスローされる - D
2 3 1
正解・解説・誤答理由・ひっかけを見る▼ open
✓ 正解:AAI作成・独立検証済
解説
map.merge(key, value, remappingFunction) は集計(カウント)の定番で、次のように動く:
- キーが存在しなければ →
value(ここでは1)をそのまま格納。 - キーが既に有れば →
remappingFunction(既存値, value)の結果で更新(Integer::sum= 既存 + 1)。
出現回数は a×3, b×2, c×1。各キーは初回に 1、以降 +1 されるので
a=3, b=2, c=1 → 出力 3 2 1。
ConcurrentHashMap はスレッドセーフで、merge はキー単位でアトミックに実行される。
- B
mergeは既存キーに対して remap(既存+1)で更新するので回数が積み上がる。上書きで常に1になるわけではない。 - Cキー・値とも非
null(値は1、remap 結果も非null)。ConcurrentHashMapが NPE を投げる条件(null キー/値)に該当しない。 - D出現回数の取り違え。
aは3回・bは2回なのでa=3, b=2。
ひっかけ:
ConcurrentHashMap は null キー・null 値を許さない(HashMap との重要な違い)。merge の第2引数に null、あるいは remap 結果が null になるとキー削除や NullPointerException の挙動になる点に注意。実機確認の答え合わせ
出力: 3 2 1
公式ドキュメント・関連ConcurrentHashMap.merge(SE17 API)↗
AIが作成し、独立した検証を経た解説です(有資格者による監修は経ていません)