在前面的《Guaval Collections API学习之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
相关推荐
Google Guava Collections 是 Java Collections Framework 的一个强大且实用的非官方扩展 API。它由 Google 工程师 Kevin Bourrillion 和 Jared Levy 在著名的“20%”时间开发而成,并得到了 Java Collections ...
自2011年以来,Guava Collections不断更新和完善,成为Java开发者中备受推崇的工具库之一。 #### 二、目标读者与前置知识 Guava Collections的目标读者应当具备基础的Java知识,特别是对JDK5特性的理解和运用能力...
Guava Collections 是 Google 的工程师 Kevin Bourrillion 和 Jared Levy 创作的一个开源库,利用他们在公司内部“20%”自由时间开发的成果。这个库是对 Java Collections Framework 的一个增强和扩展,旨在提供更...
1. **集合框架增强**:Guava提供了丰富的集合类,如Multiset(多集)、Multimap(多映射)、BiMap(双映射)和Immutable Collections(不可变集合)。这些集合类扩展了Java标准库,提供更强大、更灵活的功能,如泛型...
2. **双向映射**:`BiMap`接口提供了双向映射的功能,这意味着对于每个键,都有一个唯一的值与之对应,反之亦然。`HashBiMap`是实现`BiMap`的一个常见选择,可以方便地进行键值之间的相互查找。 3. **过滤映射**:`...
- **Immutable Collections**:不可变的集合类,确保一旦创建就不能被修改,提供线程安全。 - **BiMap**:双向映射,允许在键和值之间进行双向查找。 - **Table**:二维表格数据结构,用于存储键-键对的数据。 2...
1. **新集合类**:Google Collections 引入了一些新的集合实现,如 Multiset(多集,可以存储多个相同元素)、Multimap(多映射,一个键可以对应多个值)和 BiMap(双映射,键和值之间具有唯一映射关系)等,这些类...
5. **流API**(Stream API):虽然Java 8引入了流API,但Guava早在其版本中就提供了类似的功能,称为Iterables和Collections2。 6. **字符串处理**:Guava提供了丰富的字符串处理工具,如Joiner和Splitter,以及...
Guava的集合框架是对Java标准库集合API的扩展与增强,其核心组件包括Immutable集合、Multiset、Multimap、Table、BiMap以及各种List、Set和Map的实现。这些组件在功能、性能和设计上都有独到之处,能够满足更复杂和...
7. **Guava和Apache Commons兼容**:GS Collections与流行的Java库Guava和Apache Commons Collection有良好的互操作性,可以方便地将它们结合使用。 8. **版本号1099fce**:这个版本号可能表示GS Collections的某个...
在谷歌Collection包中,特别是其Guava子库,包含了丰富的数据结构,如Multiset、Multimap、BiMap等,以及各种实用的集合操作工具类。 首先,我们要关注的是`BiMap`,这是一个双向映射的接口,它要求键和值之间的...
Guava对Java的集合框架进行了扩展,提供了如Multiset、Multimap、ImmutableList、ImmutableSet和ImmutableMap等不可变集合,以及BiMap(双向映射)和Table(表格映射)等高级数据结构。这些集合在性能和功能上都...
1. **数据结构与集合:** Guava提供了丰富的数据结构,如Multiset(多集)、Multimap(多映射)、BiMap(双映射)和Immutable Collections(不可变集合),这些集合扩展了Java标准库的功能,提高了开发效率。...
List<String> unmodifiableList = Lists.newArrayList(Collections.unmodifiableList(originalList)); ``` 除了`newArrayList`,`com.google.common.collect`包还提供了许多其他强大的工具,如`ImmutableList`、`...
谷歌集合框架(Google Collections)是谷歌为Java开发者提供的一套强大的集合处理库,它后来演进成为现在的Guava库。这个jar包包含了谷歌对Java集合框架的扩展和增强,提供了更多的数据结构、实用工具类以及函数式...