包来源: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"]
Apache Commons Collections4 提供了MultiMap接口,允许一个键对应多个值,不覆盖前一个值。其实现如ArrayListValuedHashMap,内部使用HashMap且值为ArrayList,保证了值的可重复性。在非线程安全环境下,若需线程安全需额外加锁。示例展示了如何添加和获取MultiMap中的值。
938

被折叠的 条评论
为什么被折叠?



