Multimap的用法

Multimap的用法

Scroll Down

Multimap的用法

前言

​ 以前在学习与开发过程中用的最多的键值对容器是MapMap虽然查询效率可以达到O(1)但是如果当我们想Key相同(Hash码和值都相等)时,存多个值,而不是覆盖,这时候Map就不能提供了,所以就可以用上Multimap

概述

Multimap是com.google.common.collect下面的包,是一个接口,跟Map相似,存储数据采用的也是哈希表结构,键唯一,不重复,但是Multimap每个key对应的是一个集合不是一个值。

关系图

image20200923141127700.png

Multimap常用集合概述

通过查看关系图,可以看到Multimap有多个子类,还有些子类没有在图中展示,这里我们先对SetMultimap与ListMultimap进行源码分析

  • SetMultimap:存储数据采用的是哈希表结构,元素对应的集合里面的值不重复,是一个Set集合
  • ListMultimap:存储数据采用的链式结构,元素对应的集合允许重复的值,是一个List集合
  • 特别说明:Multimap跟Map非常相似,不同点就是Map存储的是键值对,Multimap存储的就是一个键对应一个集合,也可以通过O(1)的复杂度定位到这个集合,再通过集合去找到我们想要的值。

Multimap<K, V>的常用方法

描述方法名描述
添加元素boolean put(@Nullable K key, @Nullable V value);若指定的key已存在则value会存在对应的集合里,若成功则返回True,失败会返回False
删除元素boolean remove(@Nullable Object key, @Nullable Object value);先根据指定的key找到对应的value集合,再根据value值去value集合里面找到对应的元素删除
查找元素Collection get(@Nullable K key);根据指定的key找到对应的Value集合,返回的是一个集合,如果实现类是List则返回List集合,是Set就返回Set集合
修改元素TODOTODO

Multimap的方法演示

package com.tuhu.arche.test.service.bootstrap;

import com.google.common.collect.*;
import java.util.*;


/**
 * @author liujiangwei
 * @Description TODO
 * @date 2020/9/23/15:40
 */
public class Main {
	public static void main(String[] args) {
		//创建Multimap对象,value集合是List集合,允许元素重复
		Multimap<String, String> multimap = ArrayListMultimap.create();

		//给map添加元素
		multimap.put("男生", "李易峰");
		multimap.put("男生", "勒布朗");
		multimap.put("男生", "张无忌");
		multimap.put("女生", "杨幂");
		multimap.put("女生", "周芷若");

		//返回True
		System.out.println(multimap.put("女生", "周芷若二号"));
		// 输出值:{男生=[李易峰, 勒布朗, 张无忌], 女生=[杨幂, 周芷若, 周芷若二号]}
		System.out.println(multimap);

		// 根据指定的Key获取对应的Value集合
		List<String> girls = new ArrayList<>(multimap.get("女生"));
		// 输出值: [杨幂, 周芷若, 周芷若二号]
		System.out.println(girls);

		// 删除指定key对应的value集合
		multimap.remove("女生", "周芷若二号");
		// 输出值:{男生=[李易峰, 勒布朗, 张无忌], 女生=[杨幂, 周芷若]}
		System.out.println(multimap);

		// 将指定key的Value集合修改为一个新的value集合
		multimap.replaceValues("女生", Arrays.asList("杨幂","谁的"));
		// 输出值:{男生=[李易峰, 勒布朗, 张无忌], 女生=[杨幂一号, 谁的]}
		System.out.println(multimap);
        
        // 遍历找值方式
		Collection<Map.Entry<String, String>> listEntry = multimap.entries();
		for (Map.Entry x:listEntry
		     ) {
			System.out.println("Key值 -> " + x.getKey() + " Value值 -> " + x.getValue());
		}
		System.out.println(listEntry);
	}


}