IT源码网

Apache的Map子接口MultiValueMap

shasha 2022年05月02日 编程语言 217 0

包来源: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"]


评论关闭
IT源码网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!

(转载)比较web ui 框架