本文章主要介绍了Apache的Map子接口MultiValueMap,具有不错的的参考价值,希望对您有所帮助,如解说有误或未考虑完全的地方,请您留言指出,谢谢!

包来源: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虾米 (左侧二维码扫一扫)欢迎添加!

你是第一个吃螃蟹的人
发表评论

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。