在前面的《Guava学习之Multimap》文章中我们谈到了Guava类库中的Multimap,其特点是存在在Multimap中的键值对可以不唯一;而我们又知道,在Java集合类库中有个Map,它的特点是存放的键(Key)是唯一的,而值(Value)可以不唯一,如果我们需要键(Key)和值(Value)都唯一,该怎么实现?这就是今天要谈的BiMap结构。
在过去,如果需要将Map结构中的键值对反转(也就是key->value转变成value->key),这时候我们需要定义两个Map数据结构来存储。但,如果Map中存在多个value相同的元素会发生什么情况呢?这时候添加进去的key将会覆盖先前加进去的key。如下所示:
k1->v1,k2->v2,k3->v3,k4->v1如果我们需要反转key和Value将会变成v1->k4,v2->k2,v3->k3,细心的人会发现,怎么少了一项,这是为什么呢?因为k1->v1和k4->v1反转之后变成v1->k1和v1->k4,但由于Map的特点v1->k4将覆盖先前的v1->k1。
这就是BiMap用武之地了!BiMap<K, V>是Map<K, V>类型的数据类型(因为BiMap实现了java.util.Map接口,注意和Multimap的区别,Multimap没实现Map的接口)。它的特点是它的 value 和它 key 一样也是不可重复的,换句话说它的 key 和 value 是等价的。如果你往 BiMap 的 value 里面放了重复的元素,就会得到 IllegalArgumentException。如下:
BiMap<String, String> upperToSmall = HashBiMap.create();
upperToSmall.put("A", "a");
upperToSmall.put("B", "b");
upperToSmall.put("C", "c");
System.out.println(upperToSmall.get("A"));
将得到一个存放key和value唯一的结构,如果在上述代码加入一行
upperToSmall.put("D", "c");
则程序将抛出以下异常
Exception in thread “main” java.lang.IllegalArgumentException: value already present: c
at com.google.common.collect.HashBiMap.put(HashBiMap.java:241)
at com.google.common.collect.HashBiMap.put(HashBiMap.java:218)
at com.wyp.test.testFiles(test.java:142)
at com.wyp.test.main(test.java:153)
这是因为BiMap的强制唯一性:BiMap强制其value的唯一性,如果发现违规则会抛出 IllegalArgumentException。是不是当添加的value先前已经有了就不能添加了呢?答案是否,我们可以利用BiMap提供的BiMap.forcePut(key, value)来实现。那如何通过BiMap将key和value反转呢?很简单,代码如下:
BiMap<String, String> smallToUpper = upperToSmall.inverse();
System.out.println(smallToUpper.get("a")); //
这样就实现了键值反转!需要注意的是,inverse方法返回一个反转后的BiMap,即key/value互相切换的映射。这个反转的map并不是一个新的map(upperToSmall == upperToSmall.inverse().inverse()),而是一个视图,这意味着,你在这个反转后的map中的任何增删改操作都会影响原来的map。
BiMap的常用实现有:
- HashBiMap: key 集合与 value 集合都有 HashMap 实现
- EnumBiMap: key 与 value 都必须是 enum 类型
- ImmutableBiMap: 不可修改的 BiMap
分享到:
相关推荐
1. **集合框架扩展**:Guava对Java集合框架进行了扩展,提供了如Multiset(多集)、Multimap(多映射)、ImmutableList、ImmutableSet和ImmutableMap等不可变集合,以及BiMap(双向映射)等高级数据结构。...
5. **BiMap**: `BiMap` 是双向映射的 Map,它确保了每个键都对应唯一的值,同时每个值也对应唯一的键。这意味着,当你通过键获取值时,可以通过值反向获取键,这是标准 `Map` 所不具备的特性。 6. **Table**: `...
1. **集合框架增强**:Guava提供了丰富的集合类,如Multiset(多集)、Multimap(多映射)、BiMap(双映射)和Immutable Collections(不可变集合)。这些集合类扩展了Java标准库,提供更强大、更灵活的功能,如泛型...
Guava提供了Multiset(多集)、Multimap(多映射)、ImmutableList、ImmutableSet和ImmutableMap等不可变集合,以及BiMap(双键映射)和Table(表格)等高级数据结构。这些集合类型在特定场景下能提供更好的性能和...
1. **Java集合框架的扩展**:Guava提供了大量强大的集合类型,例如Multiset(多集,可以有重复元素并记录出现次数)、Multimap(多映射,一个键可以关联多个值)、BiMap(双映射,键和值之间的关系是双向的)和Table...
Guava对Java的集合框架进行了扩展,提供了如Multiset、Multimap、ImmutableList、ImmutableSet、ImmutableMap等不可变集合,以及BiMap(双向映射)和Table(二维表)等高级数据结构。这些集合类在保证线程安全的同时...
- **BiMap**:双向映射,其键和值之间存在唯一对应关系,你可以通过键获取值,也可以通过值获取键。 - **Immutable集合**:不可变的集合类,如ImmutableList、ImmutableSet和ImmutableMap,确保数据安全。 2. **...
Guava对Java的集合框架进行了扩展,提供了如Multiset、Multimap、ImmutableList、ImmutableSet、ImmutableMap等不可变集合,以及ListMultimap、SetMultimap和BiMap等特殊类型的映射结构。这些集合类提供了更多的...
在Guava中,BiMap是一种特殊的映射,它保证了映射关系的唯一性,每个键都对应一个值,而每个值也对应一个键。对于双向映射来说,它还提供了getInverse()方法来获取反向映射。这种类型的映射同样是可选的不可变版本。...
1. **集合框架**:Guava提供了许多增强的集合类,例如Multiset(多集)、Multimap(多映射)、ImmutableCollection(不可变集合)、BiMap(双向映射)等,这些集合类提供了更强大的功能和更丰富的API。 2. **并发...
### Google Guava Collections 使用介绍 #### 一、概述 Google Guava Collections 是 Java Collections Framework 的...无论是日常开发还是处理复杂的业务逻辑,Guava Collections 都是值得学习和使用的强大工具包。
- **BiMap**:双向映射,允许在键和值之间进行双向查找。 - **Table**:二维表格数据结构,用于存储键-键对的数据。 2. **缓存机制**: - **LoadingCache**:自动加载或计算缺失值的缓存,支持过期策略和容量...
4. **BiMap**:BiMap 是双向映射,不仅保证键的唯一性,还保证值的唯一性,提供了更严格的键值对管理。 5. **MapMaker**:这是一个用于构建自定义 Map 实例的工具,可以设置缓存策略、并发级别等高级特性。 6. **...
Guava 提供了如 Multiset(多集)、Multimap(多映射)和 BiMap(双映射)等增强型集合,这些集合在传统 Java 集合的基础上增加了新的功能和性能优化。例如,Multiset 允许元素的重复计数,Multimap 可以将多个值...
自2011年以来,Guava Collections不断更新和完善,成为Java开发者中备受推崇的工具库之一。 #### 二、目标读者与前置知识 Guava Collections的目标读者应当具备基础的Java知识,特别是对JDK5特性的理解和运用能力...
Guava 提供了丰富的集合类,如 Multiset(多集)、Multimap(多映射)、SetMultimap(键值对皆为集合的映射)和 BiMap(双向映射)。这些集合类扩展了 Java 标准库,提供了更强大的功能,例如不可变集合、有序集合...
Guava的核心特性之一是其丰富的集合框架扩展。它提供了一些新的集合实现,如Multiset(多集,可以有重复元素)、Multimap(多映射,一个键可以对应多个值)、BiMap(双映射,键和值之间是双向关联的)等,这些都极大...
1. **集合框架增强**:Guava对Java集合框架进行了扩展,引入了如Multiset(多集)、Multimap(多映射)、BiMap(双映射)等数据结构。这些数据结构在处理特定问题时更加高效和便捷。 2. **缓存**:Guava提供了一种...
在谷歌Collection包中,特别是其Guava子库,包含了丰富的数据结构,如Multiset、Multimap、BiMap等,以及各种实用的集合操作工具类。 首先,我们要关注的是`BiMap`,这是一个双向映射的接口,它要求键和值之间的...
Guava的集合框架是对Java标准库集合API的扩展与增强,其核心组件包括Immutable集合、Multiset、Multimap、Table、BiMap以及各种List、Set和Map的实现。这些组件在功能、性能和设计上都有独到之处,能够满足更复杂和...