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

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

 

类的继承关系如下图所示:

 

    List是一个接口,继承自接口。ListMultimap接口为所有继实现自ListMultimap的子类定义了一些共有的方法签名。ListMultimap接口并没有定义自己特有的方法签名,里面所有的方法都是重写了Multimap接口中的声明,只是将Multimap接口中返回Collection类型的函数修改成返回List类型。比如Multimap接口中get函数的函数原型为Collection get(@Nullable K key);而ListMultimap接口则变成了List get(@Nullable K key);这是因为Multimap接口为多个实现类定义了其子类必须实现的方法,由于其子类(TreeMultimap、)的实现不一样,而Multimap接口又定义了它们共有的方法,所以里面的函数原型大多数的返回类型为Collection,我们知道List、Set都继承自Collection。ListMultimap接口的这种设计符合。

  AbstractListMultimap继承自类,并实现了ListMultimap接口。AbstractListMultimap类中主要实现了ListMultimap接口里面的方法。同ListMultimap接口类似,AbstractListMultimap类将类中返回Collection类型的函数修改成返回List类型。里面很多的实现都是调用了AbstractMapBasedMultimap类中相应函数的实现,仅仅简单的将返回Collection类型函数修改为List类型。

 

AbstractMapBasedMultimap类的介绍请参见》。

 

类是Multimap接口的ArrayList方法实现的类,在前面的文章中我们谈到了Multimap接口的几种实现,其中就有以ArrayList实现的。

 

ArrayListMultimap类主要有三个构造函数,实现如下:

private ArrayListMultimap() {  super(new HashMap
>()); expectedValuesPerKey = DEFAULT_VALUES_PER_KEY;} private ArrayListMultimap(int expectedKeys, int expectedValuesPerKey) { super(Maps.
>newHashMapWithExpectedSize(expectedKeys)); checkArgument(expectedValuesPerKey >= 0); this.expectedValuesPerKey = expectedValuesPerKey;} private ArrayListMultimap(Multimap
multimap) { this(multimap.keySet().size(), (multimap instanceof ArrayListMultimap) ? ((ArrayListMultimap
) multimap).expectedValuesPerKey : DEFAULT_VALUES_PER_KEY); putAll(multimap);}

 第一个构造函数其键存储是用HashMap来实现的;而value的存储是用ArrayList来实现的,如下所示:

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

 其中的expectedValuesPerKey 表示预期一个key会有多少个value,这里直接将DEFAULT_VALUES_PER_KEY赋值给expectedValuesPerKey,通过源码我们可以得到DEFAULT_VALUES_PER_KEY=3。

  第二个构造函数有两个参数int expectedKeys, int expectedValuesPerKey,其中expectedKeys表示用户预期有多少个key,expectedValuesPerKey表示用户预期一个key会有多少个value。如果你大致知道你的程序会有多少个key和value,建议用这个构造函数,这样可以省去由于空间不足而需要重新分配空间而带来的额外开销。
  第三个构造函数是将另一个multimap中的所有键值元素直接复制到我们新建的multimap中,这个方式比较简单,和第一个构造函数类似,我们都不需要知道会有多少个key和value。
  从上面的构造函数我们可以看出,这三个构造函数都是以private修饰的,这说明了我们不能直接调用ArrayListMultimap类的构造函数。由于此原因,ArrayListMultimap类为我们带来了以下几个用于创建ArrayListMultimap对象的静态方法:

public static 
ArrayListMultimap
create() { return new ArrayListMultimap
();} public static
ArrayListMultimap
create( int expectedKeys, int expectedValuesPerKey) { return new ArrayListMultimap
(expectedKeys, expectedValuesPerKey);} public static
ArrayListMultimap
create( Multimap
multimap) { return new ArrayListMultimap
(multimap);}

        可以看出,上面三个静态函数分别对应地调用ArrayListMultimap的三个构造函数,含义我就不说了,很简单。

  如果你的ArrayListMultimap对象的value经过了各种的删除、添加操作,这时候可能会导致许多的value空间都没有用到,我们可以用下面的函数来将没用的空间去掉,使得各个key对应value空间的大小等于其对应的value个数:

public void trimToSize() {  for (Collection
collection : backingMap().values()) { ArrayList
arrayList = (ArrayList
) collection; arrayList.trimToSize(); }} backingMap()函数的实现: Map
> backingMap() { return map;}private transient Map
> map;

 里面的map就是构造函数super(new HashMap<k ,="" collection>())中的HashMap。

你可能感兴趣的文章
【Python】学习笔记——-7.2、访问限制
查看>>
【Python】学习笔记——-7.3、继承和多态
查看>>
【Python】学习笔记——-7.5、实例属性和类属性
查看>>
git中文安装教程
查看>>
虚拟机 CentOS7/RedHat7/OracleLinux7 配置静态IP地址 Ping 物理机和互联网
查看>>
Jackson Tree Model Example
查看>>
常用js收集
查看>>
如何防止sql注入
查看>>
springmvc传值
查看>>
在Eclipse中查看Android源码
查看>>
Android使用webservice客户端实例
查看>>
[转]C语言printf
查看>>
C 语言学习 --设置文本框内容及进制转换
查看>>
C 语言 学习---判断文本框取得的数是否是整数
查看>>
C 语言 学习---ComboBox相关、简易“假”管理系统
查看>>
C 语言 学习---回调、时间定时更新程序
查看>>
第十一章 - 直接内存
查看>>
JDBC核心技术 - 上篇
查看>>
一篇搞懂Java反射机制
查看>>
Single Number II --出现一次的数(重)
查看>>