使用这种数据结构的一个典型例子:记录数组中的所有元素出现的下标
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;
});
如果 key 不存在:
直接放入新的 ArrayList([value])
如果 key 已存在:
把 value 加进已有的 list
这种方式 无需手动判断 key 是否存在,代码更简洁。
map.computeIfAbsent(key, k -> new ArrayList<>()).add(value);
这是最经典的写法,也很好用。但和 merge 相比,灵活性略弱一些。