** 沿着Multimap、AbstractMultimap、AbstractListMultimap、ArrayListMultimap这棵树看一下接口里各个方法的实现,再对比一下HashMultimap的实现 **
先写个栗子
//Multimap multimap1 = new ArrayListMultimap<Integer,Integer>(); ArrayListMultimap构造方法是私有的,不能这样声明
Multimap<Integer,Integer> multimap = ArrayListMultimap.create();
multimap.put(1,2);
multimap.put(1,2);
multimap.put(2,2);
multimap.put(2,3);
multimap.put(2,4);
log.info("multimap.size={}",multimap.size());
multimap.entries().stream().forEach(i -> log.info("result:{}",i));
log.info(multimap.toString());
log.info("--------------------");
Multimap multimap1 = ArrayListMultimap.create();
multimap1.put(1,Lists.newArrayList(1,3,3,3,5,7,9));
multimap1.put(1,Lists.newArrayList(1,5,7,9));
multimap1.put("2",Lists.newArrayList(1,3,5,7,9));
multimap1.put(Lists.newArrayList(10,20),Lists.newArrayList(1,3,5,7,9));
multimap1.entries().stream().forEach(i -> log.info("result:{}",i));
log.info(multimap1.get("one").toString());
** 输出结果 **
21:29:43.311 [main] INFO - multimap.size=5
21:29:43.430 [main] INFO - result:1=2
21:29:43.430 [main] INFO - result:1=2
21:29:43.431 [main] INFO - result:2=2
21:29:43.431 [main] INFO - result:2=3
21:29:43.431 [main] INFO - result:2=4
21:29:43.431 [main] INFO - {1=[2, 2], 2=[2, 3, 4]}
21:29:43.431 [main] INFO - --------------------
21:29:43.442 [main] INFO - result:1=[1, 3, 3, 3, 5, 7, 9]
21:29:43.442 [main] INFO - result:1=[1, 5, 7, 9]
21:29:43.442 [main] INFO - result:2=[1, 3, 5, 7, 9]
21:29:43.442 [main] INFO - result:[10, 20]=[1, 3, 5, 7, 9]
21:29:43.443 [main] INFO - []
Multimap 可以理解成Map<T,List>这样的数据结构。key不可重复,value可以重复。
主要方法介绍:
- put(K, V):添加键到单个值的映射
- putAll(K, Iterable):依次添加键到多个值的映射
- remove(K, V):移除键到值的映射;如果有这样的键值并成功移除,返回true
- removeAll(K):清除键对应的所有值,返回的集合包含所有之前映射到K的值,但修改这个集合就不会影响Multimap了
- replaceValues(K, Iterable):清除键对应的所有值,并重新把key关联到Iterable中的每个元素。返回的集合包含所有之前映射到K的值