博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Guava Collections API学习之AbstractMapBasedMultimap
阅读量:4149 次
发布时间:2019-05-25

本文共 2455 字,大约阅读时间需要 8 分钟。

 

源码分析:接口的基础实现类,实现了中的绝大部分方法,其中有许多的方法还是靠实现类的具体实现,比如size()方法,其计算方法在不同实现是不一样的。同时,类也定义了自己的一些方法,比如createCollection()。AbstractMapBased类中主要存在以下两个成员变量

 

private transient Map
> map;private transient int totalSize;

         map是存放所有的键值对;totalSize是存放所有值的数量。

  AbstractMapBasedMultimap类将multimap转换为一个map,所有的元素都是存放在Map<k ,="" collection> map数据结构中,如下图所示:

 

     所有实现Multimap接口的子类必须实现createCollection()方法,用于存放value的值。当需要向map中插入一对key→value键值对,而这个key不存在于multimap中,此时就需要调用createCollection()方法来创建一个新的Collection以便存放这个key对应的value。根据createCollection()方法的不同实现,使得同一个key中的value可以相同或者不同,比如ArrayListMultimap类重写createCollection()方法如下:

 

@Override List
createCollection() { return new ArrayList
(expectedValuesPerKey); }

 TreeMultimap类重写createCollection()方法如下:

 

 

@Override SortedSet
createCollection() { return new TreeSet
(valueComparator);}

 所以,下面代码输出的结果是不一样的:

 

 

TreeMultimap
comparableComparableTreeMultimap = TreeMultimap.create();comparableComparableTreeMultimap.put("wyp", "xxx");comparableComparableTreeMultimap.put("wyp", "xxx");System.out.println(comparableComparableTreeMultimap);ArrayListMultimap
objectObjectArrayListMultimap = ArrayListMultimap.create();objectObjectArrayListMultimap.put("wyp", "xxx");objectObjectArrayListMultimap.put("wyp", "xxx");System.out.println(objectObjectArrayListMultimap);

 输出结果分别为:

 

 

{wyp=[xxx]}{wyp=[xxx, xxx]}

       因为ArrayListMultimap类中存储value是用ArrayList实现的,所以ArrayListMultimap中同一个key中可以存放相同的value;而TreeMultimap类中存储value是用TreeSet实现的,我们知道,TreeSet是不同存放相同的值,所以导致了TreeMultimap中同一个key不能存放相同的value,所以才会有上面的输出。

 

 

上面提到,AbstractMapBasedMultimap类中主要有map和totalSize两个成员变量,这里需要对totalSize做个说明,如下程序:

 

ArrayListMultimap
objectObjectArrayListMultimap = ArrayListMultimap.create();objectObjectArrayListMultimap.put("a", "1");objectObjectArrayListMultimap.put("a", "2");objectObjectArrayListMultimap.put("b", "3"); System.out.println(objectObjectArrayListMultimap);System.out.println(objectObjectArrayListMultimap.size());

 

 

输出的结果为:

 

{b=[3], a=[1, 2]}3

 是不是很奇怪?objectObjectArrayListMultimap.size()为什么输出的是3,而不是2?先看看size()函数的实现:

 

@Overridepublic int size() {    return totalSize;}

 而totalSize的值计算可以用下面程序来说明

totalSize = 0;for (Collection
values : map.values()) { checkArgument(!values.isEmpty()); totalSize += values.size();}

 看到这里应该很明白,为什么上面的结果返回的是3,而不是2。因为totalSize计算的是所有value的个数,而不是所有key的个数。从代码中可以看出,所有对map中元素的添加和删除都会对totalSize作出相应的加减处理,而这些加减是针对value数量的变化

你可能感兴趣的文章
就在昨天,全球 42 亿 IPv4 地址宣告耗尽!
查看>>
Mysql复制表以及复制数据库
查看>>
Linux分区方案
查看>>
如何使用 systemd 中的定时器
查看>>
linux进程监控和自动重启的简单实现
查看>>
OpenFeign学习(三):OpenFeign配置生成代理对象
查看>>
OpenFeign学习(四):OpenFeign的方法同步请求执行
查看>>
OpenFeign学习(六):OpenFign进行表单提交参数或传输文件
查看>>
Ribbon 学习(二):Spring Cloud Ribbon 加载配置原理
查看>>
Ribbon 学习(三):RestTemplate 请求负载流程解析
查看>>
深入理解HashMap
查看>>
XML生成(一):DOM生成XML
查看>>
XML生成(三):JDOM生成
查看>>
Ubuntu Could not open lock file /var/lib/dpkg/lock - open (13:Permission denied)
查看>>
collect2: ld returned 1 exit status
查看>>
C#入门
查看>>
C#中ColorDialog需点两次确定才会退出的问题
查看>>
数据库
查看>>
nginx反代 499 502 bad gateway 和timeout
查看>>
linux虚拟机安装tar.gz版jdk步骤详解
查看>>