使用这种数据结构的一个典型例子:记录数组中的所有元素出现的下标

var indexMap = new HashMap<Integer, List<Integer>>();
for (int i = 0; i < nums.length; i++) {
    indexMap.computeIfAbsent(nums[i], k -> new ArrayList<>()).add(i);
}

下面以 HashMap<Integer, List<Integer>> 为例,说明如何优雅、安全、方便地往里面添加元素,并且重点回答:可以使用 merge 方法吗?应该如何使用?

🧠 使用 merge 是非常合适且优雅的方式

结论:是的,merge 方法非常适合用于往 Map<K, List<V>> 结构里添加元素。

📌 推荐写法(使用 merge

map.merge(key,
          new ArrayList<>(List.of(value)),
          (oldList, newList) -> {
              oldList.addAll(newList);
              return oldList;
          });

⭐ 更具体的例子

假设我们要把值 5 加到 key 1 的列表里:

map.merge(1,
          new ArrayList<>(List.of(5)),
          (oldList, newList) -> {
              oldList.addAll(newList);
              return oldList;
          });

🔍 merge 的逻辑解释

这种方式 无需手动判断 key 是否存在,代码更简洁。


🧾 其他常用方式(便于理解对比)

1. 传统写法(不够优雅)

map.computeIfAbsent(key, k -> new ArrayList<>()).add(value);

这是最经典的写法,也很好用。但和 merge 相比,灵活性略弱一些。

2. 手动判断(不推荐)