`
阿Q乱七八糟
  • 浏览: 10499 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

学习google Guava 多值Map源码的总结

 
阅读更多

    今天看了下google开源工具类的源码,主要看了下Multimap的源码,写一下自己阅读中的一些总结。

在JDK中的Map,一个键对应一个值,值可以重复,键不能重复,相同的键会导致值得覆盖,这是最基本的Map的功能。Multimap实现的是一个键对应多个值,通过相同键得到值结果是一个Collection。

 

    引用下源码中对Multimap的描述:

写道
A collection that maps keys to values, similar to {@link Map}, but in which each key may be associated with <i>multiple</i> values. You can visualize the contents of a multimap either as a map from keys to <i>nonempty</i> collections of values

     下面是演示一个简单的小示例来说明这个简单的功能:

   

package com.google.test;

import com.google.common.collect.ArrayListMultimap;
import com.google.common.collect.Multimap;

public class GoogleTest {
	public static void main(String[] args) {
		
		Multimap<String, String> loverName = ArrayListMultimap.create();
		
		loverName.put("lover", "翠花");
		loverName.put("lover", "凤姐");
		
		System.out.println(loverName.get("lover"));
		
	}
}

结果:[翠花, 凤姐]

     Multimap是一个接口,它的实现类有好几种:

    ①ArrayListMultimap:它是用一个ArrayList来存放给定的键对应的值集合。

   

 ArrayListMultimap中的部分源码:

public final class ArrayListMultimap<K, V> extends AbstractListMultimap<K, V> {
  // Default from ArrayList
  private static final int DEFAULT_VALUES_PER_KEY = 3;

  @VisibleForTesting transient int expectedValuesPerKey;

  /**
   * Creates a new, empty {@code ArrayListMultimap} with the default initial
   * capacities.
   */
  public static <K, V> ArrayListMultimap<K, V> create() {
    return new ArrayListMultimap<K, V>();
  }
   private ArrayListMultimap() {
    super(new HashMap<K, Collection<V>>());
    expectedValuesPerKey = DEFAULT_VALUES_PER_KEY;
  }

  ...(省略)
}

父类AbstractKistMultimap部分源码:

 abstract class AbstractListMultimap<K, V>
    extends AbstractMapBasedMultimap<K, V> implements ListMultimap<K, V> {
  /**
   * Creates a new multimap that uses the provided map.
   *
   * @param map place to store the mapping from each key to its corresponding
   *     values
   */
  protected AbstractListMultimap(Map<K, Collection<V>> map) {
    super(map);
  }

  ...(省略)

}

其实最终也就是用AbstractMapBasedMultimap类中的 private transient Map<K, Collection<V>> map去存储的

    看到上面的源码就解释了一键对多值的原理了。

    知道上面ArrayListMultimap的存储原理, 也就明白各个方法的实现原理了

   

put 方法的实现源码

public boolean put(@Nullable K key, @Nullable V value) {
    return get(key).add(value);
}

通过get得到Map对应value集合,然后add值到集合中。

get方法的实现源码

public Collection<V> get(@Nullable K key) {
    Collection<V> collection = map.get(key);
    if (collection == null) {
      collection = createCollection(key);
    }
    return wrapCollection(key, collection);
}

 

分享到:
评论

相关推荐

    谷歌guava的jar包和源码,值得收藏

    谷歌Guava库是一个广泛使用的Java库,它提供了许多核心库的实用工具类,包括集合、缓存、并发、I/O、字符串处理、泛型 utilities、错误处理、网络、数学运算以及类加载器支持等多个方面。Guava的目标是使Java编程...

    guava源码src

    通过阅读和理解Guava源码,开发者不仅可以学习到Java编程的高级技巧,还能了解Google对于软件设计的思考,从而提升代码质量,优化程序性能。Guava源码中的注释详尽且富有洞察力,是学习Java和软件工程的宝贵资源。在...

    guava1.9-jar和源码 附在线API地址

    Guava对Java集合框架进行了扩展,提供了一些高效且功能丰富的类,如Multiset(多集)、Multimap(多映射)、ImmutableList、ImmutableSet和ImmutableMap等。这些集合不仅线程安全,而且在处理特定场景时性能更优,...

    guava-19.0 jar和sources

    在Java开发中,Guava库被广泛使用,因为它包含了大量的集合框架、并发支持、缓存机制、字符串处理、I/O操作等多个方面的功能。 标题中的"guava-19.0.jar"是Guava库的19.0版本的二进制文件,包含了编译后的Java类,...

    guava-learn:guava 学习代码库,和对 guava 源码的学习

    Guava提供了Multiset(多集)、Multimap(多映射)、ImmutableList、ImmutableSet和ImmutableMap等不可变集合,以及BiMap(双键映射)和Table(表格)等高级数据结构。这些集合类型在特定场景下能提供更好的性能和...

    google-guava-18.0

    这些集合类提供了更多的功能和更强的安全性,例如,不可变集合防止了意外修改,而多值映射允许一个键关联多个值。 2. **缓存机制**: Guava提供了本地缓存功能,可以轻松实现数据的本地存储和快速访问。它支持基于...

    guava_programming.zip

    本资料主要围绕Guava中的两个关键特性进行探讨:函数式接口及其在Guava中的应用,以及Guava的EventBus事件总线机制的源码分析和使用经验。 首先,我们来了解一下Guava中的函数式接口。函数式接口是指只有一个抽象...

    guava学习笔记

    总结来说,Guava工具包为Java开发者提供了大量实用的功能,涵盖了字符串处理、集合操作、参数校验等多个方面。通过上述几个核心类的介绍,我们可以看到Guava在简化代码编写、提高代码质量方面的显著作用。对于Java...

    guava 常用API说明

    Guava提供了丰富的集合类,如Multiset(多集)、Multimap(多映射)、ImmutableList(不可变列表)、ImmutableSet(不可变集合)、ImmutableMap(不可变映射)等。这些集合类不仅具有线程安全性,还提供了更强大的...

    guava-19.0-src

    Guava是Google开源的一个Java库,其版本号为19.0的源码为我们提供了深入了解这个强大工具集的机会。Guava提供了许多核心库的功能,包括集合、缓存、原生类型支持、并发库、字符串处理、I/O等,极大地提高了Java开发...

    guava相关资源

    通过查看源码,开发者可以深入理解Guava内部的工作机制,学习Google的编程实践,并且在遇到问题时能够更方便地调试和优化代码。 3. **Guava-19.0-javadoc.jar**: 这是Guava库的API文档,包含了所有公开类和方法的...

    guava、javax.inject-1、jsr305-3.0.1 jar包

    1. **集合框架的扩展**:Guava提供了许多增强型集合类,如Multiset(多集)、Multimap(多映射)、Table(表格)等,以及对Set、Map、List等基本集合的高效实现和扩展。 2. **缓存机制**:Guava提供了一个强大的...

    guava-tests-17.0.zip

    【描述】:Guava Tests 17.0是一个Google维护的Java库,它包含了大量的测试用例,用于验证Guava库的各种功能。Guava是Google的一个核心库,提供了许多Java集合框架的增强、并发工具、字符串处理方法、I/O工具等。而...

    Guava-开源

    【标题】"Guava-开源"所指的Guava是一个由Google开发并维护的开源Java库,它提供了许多核心库的实用工具类,包括集合、缓存、并发库、原生类型支持、字符串处理、I/O等。Guava的目标是为Java开发提供更强大、更易于...

    Collections源码java-lollipop_external_guava:Java平台的开放源代码库集合

    3. Multimap:Multimap是一种映射,其中键可以关联多个值,与标准Map不同,一个键可以对应多个值。 4. Table:Table是二维的键值对数据结构,其中行键、列键和表键共同唯一确定一个值,可以视为Map的扩展。 5. ...

    google的collection包

    `Multimap`则扩展了Map的概念,允许一个键对应多个值,这样的设计在处理一对多关系时非常方便。 谷歌Collection包还包含了一些其他实用的工具类,例如`Collections2`、`Iterables`和`Lists`,这些类提供了各种集合...

    Java Concurrency In Practice Learning Note

    标签中提到的“源码”和“工具”,暗示这份学习笔记可能涉及到Guava库的使用,Guava是Google提供的一款广泛用于Java开发的开源库,特别在并发处理和缓存管理方面有着强大的功能。 在提供的压缩包文件中,我们有五份...

    cnGuava:guava 中文注释

    1. **集合框架**:Guava扩展了Java的集合框架,提供了如Multiset(多集)、Multimap(多映射)、ImmutableList(不可变列表)、ImmutableSet(不可变集合)和ImmutableMap(不可变映射)等高级数据结构。这些集合在...

    java之反射优化(缓存思路)源码

    3. **Guava库的`LoadingCache`**:Google的Guava库提供了强大的缓存功能,可以自动处理缓存过期和清理。 ```java import com.google.common.cache.CacheBuilder; import com.google.common.cache.CacheLoader; ...

    集合框架的使用方法

    3. Guava库:Google提供的工具库,包含丰富的集合操作类和实用工具,如Multiset、Multimap等。 总结,Java集合框架为开发者提供了强大的数据管理能力。理解和熟练运用集合框架,不仅可以提升代码质量,也能在面对...

Global site tag (gtag.js) - Google Analytics