包来源:org.apache.commons.collections4.multimap
定义:一个key可以对应多个value。和Map不同的时,同一个key存储多个value时,前面的value不会被后者覆盖。
数据结构:基于Map、list、set。实际的数据结构包括:数组、链表(红黑树)
实现原理:实际上是一个HashMap对象,但是其value是一个list对象。添加对象时,将value放入MultiValueMap的list中。获取对象时,一样通过get(key)方法获取list。贴出ArrayListValuedHashMap的put方法源码。
public boolean put(final K key, final V value) {
Collection<V> coll = getMap().get(key);//根据key获取list
if (coll == null) {//key为空
coll = createCollection();//创建list
if (coll.add(value)) {//添加值
map.put(key, coll);
return true;
} else {
return false;
}
} else {
return coll.add(value);//直接添加值
}
}
ArrayListValuedHashMap和HashSetValuedHashMap:
- 两者内部都是用一个HashMap,只是前者的value是ArrayList,后者的value是HashSet。
- 前者value中的值可以重复,后者value值不可重复。
- 同时,由于两者都是基于HashMap对象,因此都是非线程安全,如果需要线程安全,需要自己添加synchronized/retreenlock等锁,否则会抛出异常。
使用示例:
@Test
public void test_BeanFactory(){
MultiValuedMap multiValuedMap = new ArrayListValuedHashMap();
multiValuedMap.put("key1","value1");
multiValuedMap.put("key1","value1-2");
multiValuedMap.put("key1","value1");
multiValuedMap.put("key2","value2");
logger.info(JSON.toJSONString(multiValuedMap.get("key1"))+"\n"+JSON.toJSONString(multiValuedMap.get("key2")));
}
输出:
["value1","value1-2","value1"]
["value2"]