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
接口,并演示了它的多种方法:
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
,添加元素,以及如何通过键和值进行查询。