`
sungang_1120
  • 浏览: 322992 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类

Guava Collections API学习之AbstractMapBasedMultimap

阅读更多

 

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

 

private transient Map<K, Collection<V>> 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<V> createCollection() {
    return new ArrayList<V>(expectedValuesPerKey);
 }

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

 

 

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

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

 

 

TreeMultimap<Comparable, Comparable> comparableComparableTreeMultimap = TreeMultimap.create();
comparableComparableTreeMultimap.put("wyp", "xxx");
comparableComparableTreeMultimap.put("wyp", "xxx");
System.out.println(comparableComparableTreeMultimap);

ArrayListMultimap<Object, Object> 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<Object, Object> 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()函数的实现:

 

@Override
public int size() {
    return totalSize;
}

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

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

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

分享到:
评论

相关推荐

    guava-API文档

    guava-API文档

    Google-Guava-Collections-使用介绍

    Google Guava Collections 是 Java Collections Framework 的一个强大且实用的非官方扩展 API。它由 Google 工程师 Kevin Bourrillion 和 Jared Levy 在著名的“20%”时间开发而成,并得到了 Java Collections ...

    guava-20.0-API文档-中英对照版.zip

    包含翻译后的API文档:guava-20.0-javadoc-API文档-中文(简体)-英语-对照版.zip; Maven坐标:com.google.guava:guava:20.0; 标签:google、guava、jar包、java、中英对照文档; 使用方法:解压翻译后的API文档,用...

    Google_Guava_Collections_使用介绍.pdf )

    自2011年以来,Guava Collections不断更新和完善,成为Java开发者中备受推崇的工具库之一。 #### 二、目标读者与前置知识 Guava Collections的目标读者应当具备基础的Java知识,特别是对JDK5特性的理解和运用能力...

    guava-collections-r03.jar

    guava类似Apache Commons工具集包含了若干被Google的 Java项目广泛依赖 的核心库

    guava 常用API说明

    通过以上对Guava常用API的介绍,我们可以看出Guava库的强大之处在于它为Java开发提供了许多实用工具和优化,帮助我们编写出更高效、更易于维护的代码。在实际开发中,合理利用Guava能显著提升代码质量,提高开发效率...

    Guava 16.0 API (CHM格式)

    下面我们就开启优雅Java编程学习之旅!  项目相关信息:  官方首页:http://code.google.com/p/guava-libraries  官方下载:http://code.google.com/p/guava-libraries/downloads/list  官方文档:...

    guava-18.0-API文档-中文版.zip

    包含翻译后的API文档:guava-18.0-javadoc-API文档-中文(简体)版.zip 对应Maven信息:groupId:com.google.guava,artifactId:guava,version:18.0 使用方法:解压翻译后的API文档,用浏览器打开“index.html”...

    Guava 23.0 API (CHM格式)

    Guava 23.0 API CHM格式,可以搜索,方便离线查阅。

    guava-23.0-API文档-中文版.zip

    包含翻译后的API文档:guava-23.0-javadoc-API文档-中文(简体)版.zip; Maven坐标:com.google.guava:guava:23.0; 标签:google、guava、中文文档、jar包、java; 使用方法:解压翻译后的API文档,用浏览器打开...

    Guava 19 API ( CHM格式 )

    Guava 中文是石榴的意思,该项目是 Google 的一个开源项目,包含许多 Google 核心的 Java 常用库。 目前主要包含: com.google.common.annotations com.google.common.base com.google.common.collect ...

    guava-17.0-API文档-中文版.zip

    包含翻译后的API文档:guava-17.0-javadoc-API文档-中文(简体)版.zip; Maven坐标:com.google.guava:guava:17.0; 标签:google、guava、中文文档、jar包、java; 使用方法:解压翻译后的API文档,用浏览器打开...

    guava-20.0-API文档-中文版.zip

    包含翻译后的API文档:guava-20.0-javadoc-API文档-中文(简体)版.zip; Maven坐标:com.google.guava:guava:20.0; 标签:google、guava、jar包、java、中文文档; 使用方法:解压翻译后的API文档,用浏览器打开...

    guava-19.0-API文档-中英对照版.zip

    包含翻译后的API文档:guava-19.0-javadoc-API文档-中文(简体)-英语-对照版.zip; Maven坐标:com.google.guava:guava:19.0; 标签:google、guava、中英对照文档、jar包、java; 使用方法:解压翻译后的API文档,用...

    guava-28.0-android-API文档-中文版.zip

    包含翻译后的API文档:guava-28.0-android-javadoc-API文档-中文(简体)版.zip; Maven坐标:com.google.guava:guava:28.0-android; 标签:google、guava、中文文档、jar包、java; 使用方法:解压翻译后的API文档,...

    guava19_api_chm英文文档

    guava19_api_chm英文文档

    guava-19.0-API文档-中文版.zip

    包含翻译后的API文档:guava-19.0-javadoc-API文档-中文(简体)版.zip; Maven坐标:com.google.guava:guava:19.0; 标签:google、guava、中文文档、jar包、java; 使用方法:解压翻译后的API文档,用浏览器打开...

    guava-30.1.1-jre-API文档-中英对照版.zip

    包含翻译后的API文档:guava-30.1.1-jre-javadoc-API文档-中文(简体)-英语-对照版.zip; Maven坐标:com.google.guava:guava:30.1.1-jre; 标签:google、guava、中英对照文档、jar包、java; 使用方法:解压翻译后...

    guava-16.0.1-API文档-中文版.zip

    包含翻译后的API文档:guava-16.0.1-javadoc-API文档-中文(简体)版.zip; Maven坐标:com.google.guava:guava:16.0.1; 标签:google、guava、中文文档、jar包、java; 使用方法:解压翻译后的API文档,用浏览器打开...

Global site tag (gtag.js) - Google Analytics