JAVA && Spring && SpringBoot2.x — 学习目录
在开发过程中,经常使用到Map这种数据接口,特点是一个key对应一个value。但是有时候一个key可能对应一组value。当然使用
Map<K,List<V>>
这种结构是可以满足需求的。今天所说的,便是继承Map<K,List<V>>
接口的MultiValueMap
类。
基础用法:
@Test
public void test() {
MultiValueMap<String, String> map = new LinkedMultiValueMap<>();
//为一个key增加多个value
map.add("a", "你好");
map.add("a", "世界");
//为key设置value值;
map.set("a","哈哈");
List<String> list = map.get("a");
list.forEach(System.out::println);
}
内部原理
继承结构图.png
本质上LinkedMultiValueMap继承了Map<K,List<V>>
接口。我们在这里重点看一下add方法和set方法。
private final Map<K, List<V>> targetMap;
@Override
public void add(K key, @Nullable V value) {
//如果不存在key,返回new LinkedList<>(),否则返回Value
List<V> values = this.targetMap.computeIfAbsent(key, k -> new LinkedList<>());
values.add(value);
}
@Override
public void set(K key, @Nullable V value) {
//调用set方法时,创建一个新的LinkedList集合
List<V> values = new LinkedList<>();
values.add(value);
this.targetMap.put(key, values);
}