Google guava 最佳实践 学习指南之08 `BiMap`(双向映射)

guava 最佳实践 学习指南

Google Guava 库中的 BiMap(双向映射)是一种特殊的映射类型,它维护了映射的反向视图,并确保不存在重复值,且始终可以安全地使用值获取对应的键。以下是关于 Guava BiMap 的一些介绍和用法:

1. 概述

BiMap(或称为"双向映射")是一种特殊的映射类型,它允许通过键查找值,同时也可以通过值查找键。这意味着在 BiMap 中,不仅键是唯一的,值也必须是唯一的。BiMap 接口扩展了 Map 接口,并添加了一些方法来提供反向视图。

2. BiMap 的实现类

Guava 提供了几种 BiMap 的实现:

  • HashBiMap :基于哈希表的双向映射实现。它提供了常数时间的 containsKey、get 和 put 操作(假设哈希函数是完美的)。由于其基于哈希表,它不保证元素的顺序。
  • EnumBiMap :一种特殊的 BiMap,它要求键和值都是枚举类型。这种实现类型安全和高效,适用于键和值都是已知枚举值的情况。
  • ImmutableBiMap :不可修改的 BiMap,遵循构建器模式。

3. BiMap 的常用方法

除了继承自 Map 接口的方法外,BiMap 还添加了一些特有的方法:

  • inverse() :返回一个视图,其中的键和值与原 BiMap 中的值和键相反。注意,返回的是视图,对返回映射的更改将反映在原映射上,反之亦然。
  • forcePut(K key, V value) :类似于 put 方法,但如果键或值已经存在,则会抛出 IllegalArgumentException。
  • containsValue(Object value) :检查 BiMap 中是否包含指定的值。

4. BiMap 的用法示例

以下是一个简单的示例,展示如何使用 Guava 的 HashBiMap 实现 BiMap 接口,并演示了它的多种方法:

java 复制代码
import com.google.common.collect.BiMap;
import com.google.common.collect.HashBiMap;

public class BiMapExample {
    public static void main(String[] args) {
        // 创建一个空的HashBiMap
        BiMap<String, Integer> biMap = HashBiMap.create();
        // 向BiMap中添加元素
        biMap.put("One", 1);
        biMap.put("Two", 2);
        biMap.put("Three", 3);
        // 使用get方法通过键获取值
        System.out.println("Two maps to: " + biMap.get("Two")); // 输出: Two maps to: 2
        // 使用get方法通过值获取键(使用inverse()方法)
        System.out.println("2 maps to: " + biMap.inverse().get(2)); // 输出: 2 maps to: Two
        // 检查BiMap中是否包含某个键
        System.out.println("Does the map contain key 'One'? " + biMap.containsKey("One")); // 输出: Does the map contain key 'One'? true
        // 检查BiMap中是否包含某个值
        System.out.println("Does the map contain value 2? " + biMap.containsValue(2)); // 输出: Does the map contain value 2? true
    }
}

这个示例展示了如何创建 BiMap,添加元素,以及如何通过键和值进行查询。

相关推荐
心祭丫丫14 分钟前
【每天一个 Python 小案例17】Python 实现通讯录
开发语言·人工智能·笔记·python·学习
露天赏雪40 分钟前
第3篇:Sentinel熔断降级实战:大模型接口抖动时的服务兜底方案
java·开发语言·人工智能·spring boot·spring·servlet·sentinel
天天被压力1 小时前
【A股分钟级高频数据完全手册 #06】北交所分钟级数据接口:京市股票Pro版最新分时
java·人工智能·python
天天被压力1 小时前
【A股分钟级高频数据完全手册 #05】指数历史分钟数据接口:Pro版沪深指数分时回放
java·人工智能·python
captain3761 小时前
▲统一功能——DispatcherServlet源码分析
java·spring·java-ee·log4j·maven
金銀銅鐵1 小时前
JDK 21 中 List.of 的实现细节:从 List12 到 ListN
java·后端·ai编程
yeccheng3 小时前
MySQL 索引超详解:从底层 B+ 树到面试高频考点
java·开发语言·jvm·mysql·面试
联犀3 小时前
纯 Go 的 CAD 开源库 go-cad:直接解析 DWG/DXF,现在也能导出 PDF
开发语言·golang·pdf
这个昵称不容易3 小时前
SpringBoot 读书笔记共享平台部署实战:97 个 Java 文件 / 113 个接口 / 10 张表
java·springboot·毕设
zjxtxdy3 小时前
C++面向对象程序开发-类与对象
开发语言·c++