Bimap也是Guava中提供的新集合类,别名叫做双向map,就是key-》value,value-》key,也就是你可以通过key定位value,也可以用value定位key。
这个场景在日常开发中还是经常碰到的。
其实,Bimap相对比较简单,它是一个接口,扩展了Map接口,里面也是<K,V>格式,只不过它不允许有重复的V,这一点很重要,当你尝试往里面put一个重复的V的是会有报错信息提示。没有重复的V也就保证了你把这个map倒置的时候从V定位K也是可以唯一定位到的,我们可以看一下它的实现:
老习惯,还是看HashBimap,新集合类的创建基本上都是使用create方法:
public static <K, V> HashBiMap<K, V> create() { return create(16); } public static <K, V> HashBiMap<K, V> create(int expectedSize) { return new HashBiMap<K, V>(expectedSize); }
它的增删改查基本上和普通map没有区别,除了不能插入相同的value进去。
重点在于它有一个reverse函数:
@Override public BiMap<V, K> inverse() { return (inverse == null) ? inverse = new Inverse() : inverse; } private final class Inverse extends AbstractMap<V, K> implements BiMap<V, K>, Serializable { BiMap<K, V> forward() { return HashBiMap.this; } @Override public int size() { return size; } @Override public void clear() { forward().clear(); } @Override public boolean containsKey(@Nullable Object value) { return forward().containsValue(value); } @Override public K get(@Nullable Object value) { return Maps.keyOrNull(seekByValue(value, smearedHash(value))); } @Override public K put(@Nullable V value, @Nullable K key) { return putInverse(value, key, false); } @Override public K forcePut(@Nullable V value, @Nullable K key) { return putInverse(value, key, true); } @Override public K remove(@Nullable Object value) { BiEntry<K, V> entry = seekByValue(value, smearedHash(value)); if (entry == null) { return null; } else { delete(entry); entry.prevInKeyInsertionOrder = null; entry.nextInKeyInsertionOrder = null; return entry.key; } }
其实把<K,V>变成了<V,K>,并且这个reverse是在后面你再次对于map进行修改,它也会跟着变化,所以不用担心它是一次性的,否则那不如自己去迭代获得一个新的map出来:
public void testBimap(){ HashBiMap<String,String> map = HashBiMap.create(); map.put("1", "2"); map.put("3", "4"); System.out.println(map.toString()); System.out.println(map.inverse().toString()); map.put("5", "6"); System.out.println(map.inverse().toString()); }
{1=2, 3=4}
{2=1, 4=3}
{2=1, 4=3, 6=5}
到此为止,接下来看最后一个Guava的集合类Table。
时间: 2024-10-18 12:29:01