guava学习:guava集合类型-Bimap

简介: 学习guava让我惊喜的第二个接口就是:BimapBiMap是一种特殊的映射其保持映射,同时确保没有重复的值是存在于该映射和一个值可以安全地用于获取键背面的倒数映射。最近开发过程中,经常会有这种根据key找value或者根据value找key 的功能,之前都是将值存储到枚举或者map中,然后通过反转的写法来实现的,直到发现了Bimap,才发现原来还有这么简便的方式。

学习guava让我惊喜的第二个接口就是:Bimap

BiMap是一种特殊的映射其保持映射,同时确保没有重复的值是存在于该映射和一个值可以安全地用于获取键背面的倒数映射。

最近开发过程中,经常会有这种根据key找value或者根据value找key 的功能,之前都是将值存储到枚举或者map中,然后通过反转的写法来实现的,直到发现了Bimap,才发现原来还有这么简便的方式。

接口申明

@GwtCompatible
public interface BiMap<K,V>
extends Map<K,V>

接口方法

 

S.N. 方法及说明
1 V forcePut(K key, V value)
另一种put的形式是默默删除,在put(K, V)运行前的任何现有条目值值。
2 BiMap<V,K> inverse()
返回此bimap,每一个bimap的值映射到其相关联的键的逆视图。
3 V put(K key, V value)
关联指定值与此映射中(可选操作)指定的键。
4 void putAll(Map<? extends K,? extends V> map)
将所有从指定映射此映射(可选操作)的映射。
5 Set<V> values()
返回此映射中包含Collection的值视图。

 

使用样例

BiMap<Integer, String> empIDNameMap = HashBiMap.create();

        empIDNameMap.put(new Integer(101), "Mahesh");
        empIDNameMap.put(new Integer(102), "Sohan");
        empIDNameMap.put(new Integer(103), "Ramesh");

        //得到101对应的value
        System.out.println(empIDNameMap.get(101));
        //得到Mahesh对应key
        System.out.println(empIDNameMap.inverse().get("Mahesh"));
        //传统map的写法
        System.out.println(getInverseMap(empIDNameMap).get("Mahesh"));
/**
     * map反转工具类
     * @param map
     * @param <S>
     * @param <T>
     * @return
     */
    private static <S,T> Map<T,S> getInverseMap(Map<S,T> map) {
        Map<T,S> inverseMap = new HashMap<T,S>();
        for(Map.Entry<S,T> entry: map.entrySet()) {
            inverseMap.put(entry.getValue(), entry.getKey());
        }
        return inverseMap;
    }

运行结果

Mahesh
101
101

 

inverse方法会返回一个反转的BiMap,但是注意这个反转的map不是新的map对象,它实现了一种视图关联,这样你对于反转后的map的所有操作都会影响原先的map对象。

让我们继续看下面的例子

System.out.println(empIDNameMap);
BiMap<String,Integer> inverseMap = empIDNameMap.inverse();
System.out.println(inverseMap);
empIDNameMap.put(new Integer(104),"Jhone");
System.out.println(empIDNameMap);
System.out.println(inverseMap);

inverseMap.put("Mahesh1",105);
System.out.println(empIDNameMap);
System.out.println(inverseMap);

运行结果

{101=Mahesh, 102=Sohan, 103=Ramesh}
{Mahesh=101, Sohan=102, Ramesh=103}
{101=Mahesh, 102=Sohan, 103=Ramesh, 104=Jhone}
{Mahesh=101, Sohan=102, Ramesh=103, Jhone=104}
{101=Mahesh, 102=Sohan, 103=Ramesh, 104=Jhone, 105=Mahesh1}
{Mahesh=101, Sohan=102, Ramesh=103, Jhone=104, Mahesh1=105}

可以看到,无论是操作empIdNameMap 还是操作inverseMap,2个map的数据都是相关联的发生变化。

开开心心编码,快快乐乐生活。
目录
相关文章
|
存储 设计模式 缓存
Java源码分析:Guava之不可变集合ImmutableMap的源码分析
Java源码分析:Guava之不可变集合ImmutableMap的源码分析
64 0
|
7月前
|
消息中间件 存储 缓存
Guava的这些骚操作让我的代码量减少了50行
Guava的这些骚操作让我的代码量减少了50行
47 3
|
7月前
|
缓存 安全 Java
Google guava工具类的介绍和使用
Google guava工具类的介绍和使用
230 1
|
Java
Guava Lists工具类
Guava Lists工具类
78 0
|
消息中间件 缓存 JavaScript
Guava的这些骚操作,让我的代码量减少了50%
Guava的这些骚操作,让我的代码量减少了50%
|
安全 Java Maven
Guava 如何让 Map 不可变之 ImmutableMap
Guava 如何让 Map 不可变之 ImmutableMap
426 0
Guava 如何让 Map 不可变之 ImmutableMap
|
缓存 安全 Java
《Guava》基础 入门
《Guava》基础 入门
204 0
《Guava》基础 入门
|
Java API
Guava - Maps.newHashMap 和 new HashMap 区别
Guava - Maps.newHashMap 和 new HashMap 区别
928 0
|
安全 Java 程序员
Guava:集合操作
Guava:集合操作
225 0
|
数据采集 缓存 算法
Guava的布隆过滤器
 程序世界的算法都要在时间,资源占用甚至正确率等多种因素间进行平衡。同样的问题,所属的量级或场景不同,所用算法也会不同,其中也会涉及很多的trade-off。 If there’s one rule in programming, it’s this: there will always be trade-offs. 你是否真的存在  今天我们就来探讨如何判断一个值是否存在于已有的集合问题。