· Apache Commons Collections download address:
http://commons.apache.org/proper/commons-collections/download_collections.cgi
· User Guide:
http://commons.apache.org/proper/commons-collections/userguide.html
· Version 4.0 API:
http://commons.apache.org/proper/commons-collections/javadocs/api-release/index.html
简介
Java的集合框架(Java Collections Framework)是在JDK 1.2版本添加进来的,它 提供的强大的数据结构加快了Java程序的开发,由此作为是java的标准库。
Commons-Collections建立在JDK类之上,提供新的接口、新的实现和新的功能,主要功能如下:
Map的遍历
JDK提供的Map接口使得遍历Map非常不方便,只能单独的遍历EntrySet或者KeySet。Commons-Collections提供的MapIterator接口可以非常简单地遍历Map:
public interface MapIterator<K, V> extends Iterator<K> //继承于Java的Iterator,只是个接口
Commons-Collections中所有的Map实现类中都有mapIterator()方法,通过调用该方法可以获得Map的MapIterator的对应实例对象。以BidiMap为例说明如何使用:
BidiMap<String,String> bidiMap; bidiMap = new TreeBidiMap<String,String>(); bidiMap.put("阿勒泰", "0906"); bidiMap.put("乌鲁木齐", "0996"); bidiMap.put("武汉", "010"); bidiMap.put("深圳", "0755"); MapIterator<String, String> mit = bidiMap.mapIterator(); while(mit.hasNext()) { String key = mit.next(); String value = mit.getValue(); // mit.setValue("8888");//BidiMap是不可修改的,故此处不能用 }
BidiMap – 接口
public interface BidiMap<K, V> extends IterableMap<K, V>
BidiMap是Java Map的一个扩展,实现了Key和Value之间的双向查找。要求Value和Key一样不能重复。应用场景:“城市名”和“电话区号”之间一一对应,我们可以通过城市名查找区号,也可以通过区号查找所对应的城市。
BidiMap是不可修改的,也就是说在遍历Map时不能修改value的值。
BidiMap是个接口,实现类包括:
· DualHashBidiMap – 使用两个HashMap实现BidiMap。
· DualLinkedHashBidiMap – 使用两个LinkedHashMap实现BidiMap,元素以加入的先后顺序有序排列。
· DualTreeBidiMap – 使用两个TreeMap实现SortedBidiMap。构造时,可分别为Key和Value指定Comparator。
· TreeBidiMap – 红黑树机制的排序BidiMap。没有提供Comparator的构造器,只能使用红黑树机制排序。
String value = bidiMap.get("Key值"); //通过Key获得Value String key = bidiMap.getKey("Value值"); //通过Value获得Key
MultiMap – 接口
public interface MultiMap<K, V> extends IterableMap<K, Object>
不知道是Apache不推荐使用还是什么的,在线API中没有显示它的存在。
MultiMap只有只有一个实现类:public class MultiValueMap<K, V> implements MultiMap
MultiMap是指一个Key可以对应多个Value。put方法和一般的Map一样,只是在通过key获得value时,返回的是value集合。使用示例如下:
MultiValueMap<String, String> multiMap = new MultiValueMap<String, String>(); multiMap.put("Alex", "value1"); multiMap.put("Alex", "value2"); multiMap.put("Alex", "value3"); Collection<String> v1 = multiMap.getCollection("Alex"); for(String s : v1) { System.out.println(s); }
LzayMap – 类
public class LazyMap<K, V> extends AbstractMapDecorator<K, V> implements Serializable
此处的Lazy概念和Hibernate中的Lazy概念不同。Hibernate中如果lazy设置为true,表示为延迟加载,只有在使用到数据的时候才会去从数据库取得数据。
LazyMap通过包装一个Map对象来生成LazyMap实例,当使用get(Object key)方法时,如果该key在map中不存在,factory对象(包装时传进来的)会创建一个value对象与该key对应 ,并将这组key-value加入到map中。
也就是说,LazyMap添加元素时,跟普通的Map一样。只是在get元素时,如果存在,则返回对应的value;如果不存在,则创建一个value与查询的key关联,并将其key-value加入到map中,返回新创建的value对象。
LazySortedMap是LazyMap的子类,有序的LazyMap。使用方法和LazyMap一样,只是被包装Map必须是SortedMap或SortedMap的子类。
Bag – 接口
Factory<String> factory = new Factory<String>() {
@Override
public String create() {
String s = "全能点读机";
return s;
}
};
Map<String,String> lazyMap = LazyMap.lazyMap(new HashMap<String,String>(), factory);
lazyMap.put("语文", "张老师");
lazyMap.put("数学", "李老师");
lazyMap.put("音乐", "汪峰老师");
System.out.println(lazyMap.get("音乐")); //输出 -- 汪峰老师
System.out.println(lazyMap.get("英语")); //英语在lazyMap中不存在,但是会输出factory给其创建的 "全能点读机"
Bag是Commons-Collections定义的一种记录元素出现次数的集合接口。
public interface Bag<E> extends Collection<E>
Bag的实现类有很多,通常我们使用HashBag和TreeBag:
· HashBag — 使用HashMap来存储数据
· TreeBag — 使用TreeMap来存储数据
实例代码:
Bag<String> bag = new HashBag<String>(); bag.add("basketball"); //加入一个篮球 bag.add("basketball",4); //加入4个篮球 bag.remove("basketball", 2); //去除2个篮球 bag.getCount("basketball"); //统计,现在还剩下3个篮球