LinkedMultiValueMap是Spring框架里的一个数据结构,它继承自MultiValueMap类,但是与HashMap/MultiValueMap等不同,它实现了Map接口,并且键值对是由LinkedList组成的,其键可以是任意类型,值可以是任意类型链表。
一、LinkedMultiValueMap的定义
LinkedMultiValueMap类定义了以下属性和方法:
public class LinkedMultiValueMap<K, V> extends MultiValueMapAdapter
<K, V> implements Serializable {
private static final long serialVersionUID = 3801124242820219131L;
private final Map
<K, List<V>> targetMap;
public LinkedMultiValueMap() {
this.targetMap = new LinkedHashMap<>();
}
public LinkedMultiValueMap(int initialCapacity) {
this.targetMap = new LinkedHashMap<>(initialCapacity);
}
public LinkedMultiValueMap(Map
<K, List<V>> otherMap) {
this.targetMap = new LinkedHashMap<>(otherMap);
}
...
}
可以看出,LinkedMultiValueMap支持了三种构造函数,即不带参数的构造方法、带初始容量的构造方法、以及将已有map的内容复制到LinkedMultiValueMap的构造方法。
二、LinkedMultiValueMap的特点
LinkedMultiValueMap的特点主要表现在以下几个方面:
1、支持存储一个key对应多个value
LinkedMultiValueMap可以存储一个key对应多个value,这在处理复杂的业务逻辑时非常有用。
例如,我们有一个用户信息的Map,其中每个key对应的用户信息有多个字段,如果用HashMap来存储,就需要一个key对应一个内部Map,而用LinkedMultiValueMap就可以将一个key对应多个value,每个value是一个用户信息对象,从而减少了Map的层级,降低了复杂度。
2、支持按顺序存储以及取回元素
LinkedMultiValueMap按元素添加的顺序保存元素,因此在迭代时还能保持它们的顺序,这在一些需要按照添加顺序进行遍历的场景下非常方便。
3、支持构造函数和其他集合类型的相互转换
LinkedMultiValueMap除了可以通过构造函数将Map转换为LinkedMultiValueMap,还可以通过其他集合类型和Array等类型实现相互转换,具有很高的转换灵活性,运用灵活。
三、LinkedMultiValueMap的源码实现
下面是LinkedMultiValueMap的部分源码:
public class LinkedMultiValueMap<K, V> extends MultiValueMapAdapter
<K, V> implements Serializable {
private final Map
<K, List<V>> targetMap;
public LinkedMultiValueMap() {
this.targetMap = new LinkedHashMap<>();
}
...
@Override
public void add(K key, V value) {
List
<V> values = this.targetMap.computeIfAbsent(key, k -> new LinkedList<>());
values.add(value);
}
...
@Override
public List
<V> put(K key, List
<V>
values) { return this.targetMap.put(key, values); } ... @Override public MultiValueMap
<K, V>
deepCopy() { LinkedMultiValueMap
<K, V>
copy = new LinkedMultiValueMap<>(this.targetMap.size()); this.targetMap.forEach((key, value) -> copy.put(key, new LinkedList<>(value))); return copy; } ... }
可以看出,LinkedMultiValueMap的内部实现中基本上都是使用了Map进行操作,但是与HashMap/MultiValueMap不同的是,它的value是由LinkedList组成的,因此可以存储一个key对应多个value。
可以看出,LinkedMultiValueMap实现了MultiValueMap接口的所有方法,同时也实现了Map接口中的部分方法,支持了多种操作。
四、LinkedMultiValueMap的应用场景
LinkedMultiValueMap很适合存储一些复杂的数据结构或者处理需要按顺序存储的数据的场景,特别适合于以下场景:
1、处理复杂的业务逻辑
LinkedMultiValueMap可以存储一个key对应多个value,因此很适合存储一些复杂的业务逻辑。例如,在一个业务场景中,我们需要存储多个用户的信息,每个用户都有多个字段,这时就可以使用LinkedMultiValueMap,将每个key对应多个value,即每个用户对应多个信息字段。
2、按顺序进行操作的场景
LinkedMultiValueMap按添加顺序保存元素,因此在一些需要按照添加顺序进行遍历的场景下非常方便。例如,在一个需要保证操作顺序的业务环节中,我们可以将操作依次按照顺序添加到LinkedMultiValueMap中,最后统一进行处理。
五、代码示例
以下是使用LinkedMultiValueMap方法的示例代码:
LinkedMultiValueMap<String, String> map = new LinkedMultiValueMap<>();
map.add("key1", "value1");
map.add("key1", "value2");
map.add("key2", "value3");
map.get("key1"); // [value1, value2]
map.get("key2"); // [value3]
map.forEach((key, value) -> System.out.println(key + ":" + value));
// 输出:
// key1:[value1, value2]
// key2:[value3]