`
sungang_1120
  • 浏览: 322318 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类

Guava Collections API学习之Bimap

阅读更多

     

      在前面的《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的常用实现有:

 

  1. HashBiMap: key 集合与 value 集合都有 HashMap 实现
  2. EnumBiMap: key 与 value 都必须是 enum 类型
  3. ImmutableBiMap: 不可修改的 BiMap
分享到:
评论

相关推荐

    Google-Guava-Collections-使用介绍

    Google Guava Collections 是 Java Collections Framework 的一个强大且实用的非官方扩展 API。它由 Google 工程师 Kevin Bourrillion 和 Jared Levy 在著名的“20%”时间开发而成,并得到了 Java Collections ...

    Google_Guava_Collections_使用介绍.pdf )

    自2011年以来,Guava Collections不断更新和完善,成为Java开发者中备受推崇的工具库之一。 #### 二、目标读者与前置知识 Guava Collections的目标读者应当具备基础的Java知识,特别是对JDK5特性的理解和运用能力...

    guava collection简介1

    Guava Collections 是 Google 的工程师 Kevin Bourrillion 和 Jared Levy 创作的一个开源库,利用他们在公司内部“20%”自由时间开发的成果。这个库是对 Java Collections Framework 的一个增强和扩展,旨在提供更...

    Guava常用类库 v33.0.0.zip

    1. **集合框架增强**:Guava提供了丰富的集合类,如Multiset(多集)、Multimap(多映射)、BiMap(双映射)和Immutable Collections(不可变集合)。这些集合类扩展了Java标准库,提供更强大、更灵活的功能,如泛型...

    google guava23.5

    - **Immutable Collections**:不可变的集合类,确保一旦创建就不能被修改,提供线程安全。 - **BiMap**:双向映射,允许在键和值之间进行双向查找。 - **Table**:二维表格数据结构,用于存储键-键对的数据。 2...

    google-collections jar包

    2. **双向映射**:`BiMap`接口提供了双向映射的功能,这意味着对于每个键,都有一个唯一的值与之对应,反之亦然。`HashBiMap`是实现`BiMap`的一个常见选择,可以方便地进行键值之间的相互查找。 3. **过滤映射**:`...

    google-collections.zip

    1. **新集合类**:Google Collections 引入了一些新的集合实现,如 Multiset(多集,可以存储多个相同元素)、Multimap(多映射,一个键可以对应多个值)和 BiMap(双映射,键和值之间具有唯一映射关系)等,这些类...

    Google core libraries for Java.zip

    5. **流API**(Stream API):虽然Java 8引入了流API,但Guava早在其版本中就提供了类似的功能,称为Iterables和Collections2。 6. **字符串处理**:Guava提供了丰富的字符串处理工具,如Joiner和Splitter,以及...

    Collections源码java-lollipop_external_guava:Java平台的开放源代码库集合

    Guava的集合框架是对Java标准库集合API的扩展与增强,其核心组件包括Immutable集合、Multiset、Multimap、Table、BiMap以及各种List、Set和Map的实现。这些组件在功能、性能和设计上都有独到之处,能够满足更复杂和...

    GSCollections受Smalltalk启发的集合框架

    7. **Guava和Apache Commons兼容**:GS Collections与流行的Java库Guava和Apache Commons Collection有良好的互操作性,可以方便地将它们结合使用。 8. **版本号1099fce**:这个版本号可能表示GS Collections的某个...

    google的collection包

    在谷歌Collection包中,特别是其Guava子库,包含了丰富的数据结构,如Multiset、Multimap、BiMap等,以及各种实用的集合操作工具类。 首先,我们要关注的是`BiMap`,这是一个双向映射的接口,它要求键和值之间的...

    guavaTest:测试

    Guava对Java的集合框架进行了扩展,提供了如Multiset、Multimap、ImmutableList、ImmutableSet和ImmutableMap等不可变集合,以及BiMap(双向映射)和Table(表格映射)等高级数据结构。这些集合在性能和功能上都...

    GuavaSample:番石榴的例子

    1. **数据结构与集合:** Guava提供了丰富的数据结构,如Multiset(多集)、Multimap(多映射)、BiMap(双映射)和Immutable Collections(不可变集合),这些集合扩展了Java标准库的功能,提高了开发效率。...

    com.google.common.collect jar包

    List&lt;String&gt; unmodifiableList = Lists.newArrayList(Collections.unmodifiableList(originalList)); ``` 除了`newArrayList`,`com.google.common.collect`包还提供了许多其他强大的工具,如`ImmutableList`、`...

    google-collect

    谷歌集合框架(Google Collections)是谷歌为Java开发者提供的一套强大的集合处理库,它后来演进成为现在的Guava库。这个jar包包含了谷歌对Java集合框架的扩展和增强,提供了更多的数据结构、实用工具类以及函数式...

Global site tag (gtag.js) - Google Analytics