转载 http://blog.csdn.net/chenleixing/article/details/43121435
BidiMap,“bidi”是单词bidirectional 的简写,意思是双向的,故而可以大概想到这个Map的“特长”是通过key找到value,又可通过value找到key(当然我们用JDK中的Map调用entrySet等遍历也可以做到,只不过这个是写好封装好了的,更简便易用些),故而BidiMap当中key和value都不能重复了。
MultiMap,就是说一个key不在是简单的指向一个对象,而是一组对象,这个一组对象不是我们想象的普通用法value一次存入一个包含多个对象的 集合或者数组,而是它可以对一个key,进行多次add,多次add的value都会存入这一个key对应的对象中(其实底层是个ArrayList实现 这个存储的即数组实现),remove()的时候跟普通的Map无异,只是在get()时返回一个Collection(ArrayList实例),利用 MultiMap,我们就可以很方便的往一个key上放数量不定的对象,也就实现了一对多,很方便的。
LazyMap,意思就是 这个Map中的键/值对一开始并不存在,当被调用到时才创建,如果get(key)这个key不存在的话,会返回实例化中传入的factory里方法的返 回值(具体看下边代码就一目了解了),的这样的解释初听上去是不是有点不可思议?这样的LazyMap有用吗?我们这样来理解:我们需要一个Map,但是 由于创建成员的方法很“重”(比如数据库访问),或者我们只有在调用get()时才知道如何创建,或者Map中出现的可能性很多很多,我们无法在 get()之前添加所有可能出现的键/值对,或者任何其它解释得通的原因,我们觉得没有必要去初始化一个Map而又希望它可以在必要时自动处理数据生成的 话,LazyMap就变得很有用了。
package apache_commons_collections;
import java.util.HashMap;
import java.util.Map;
import org.apache.commons.collections.BidiMap;
import org.apache.commons.collections.Factory;
import org.apache.commons.collections.MultiHashMap;
import org.apache.commons.collections.MultiMap;
import org.apache.commons.collections.bidimap.DualHashBidiMap;
import org.apache.commons.collections.map.LazyMap;
@SuppressWarnings("deprecation")
public class LazymapMultimapBidimapTest {
public static void main(String arg[]){
testBidiMap();
testMultiMap();
testLazyMap();
}
public static void testBidiMap(){ //bidiMap测试
BidiMap bidiMap=new DualHashBidiMap(); //key,value都不予许相同
bidiMap.put("chen",24);
bidiMap.put("lei",11);
System.out.println(bidiMap.get("chen"));
System.out.println(bidiMap.getKey(11));
}
public static void testMultiMap(){ //MultiMap测试
@SuppressWarnings("deprecation")
MultiMap multiMap=new MultiHashMap();
multiMap.put("chen","男");
multiMap.put("chen",13);
multiMap.put("chen"," zhongguo ");
System.out.println(multiMap.get("chen")); //底层是用的ArrayList
}
public static void testLazyMap(){ //LazyMap测试
Factory valFactory= new Factory(){ //创建一个工厂,实现create方法
public Object create(){
return "--创建的默认值--";
}
};
Map lazyMap=LazyMap.decorate(new HashMap(), valFactory); //当此lazyMap调用get(key)时,如果无此key则返回varFactory里create方法返回的值
lazyMap.put("chen", "lazyMap中这个key有值");
System.out.println(lazyMap.get("chen")); //有key对应的值时
System.out.println(lazyMap.get(122)); //无此key时
}
}
输入结果:
24
lei
[男, 13, zhongguo ]
lazyMap中这个key有值
--创建的默认值--