· 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为例说明如何使用:
1: BidiMap<String,String> bidiMap;
2: bidiMap = new TreeBidiMap<String,String>();
3: bidiMap.put("阿勒泰", "0906");
4: bidiMap.put("乌鲁木齐", "0996");
5: bidiMap.put("武汉", "010");
6: bidiMap.put("深圳", "0755");
7: MapIterator<String, String> mit = bidiMap.mapIterator();
8: while(mit.hasNext()) {
9: String key = mit.next();
10: String value = mit.getValue();
11: // mit.setValue("8888");//BidiMap是不可修改的,故此处不能用
12: }
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的构造器,只能使用红黑树机制排序。
1: String value = bidiMap.get("Key值"); //通过Key获得Value
2: 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集合。使用示例如下:
1: MultiValueMap<String, String> multiMap = new MultiValueMap<String, String>();
2: multiMap.put("Alex", "value1");
3: multiMap.put("Alex", "value2");
4: multiMap.put("Alex", "value3");
5: Collection<String> v1 = multiMap.getCollection("Alex");
6: for(String s : v1) {
7: System.out.println(s);
8: }
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 – 接口
1: Factory<String> factory = new Factory<String>() {
2: @Override
3: public String create() {
4: String s = "全能点读机";
5: return s;
6: }
7: };
8: Map<String,String> lazyMap = LazyMap.lazyMap(new HashMap<String,String>(), factory);
9: lazyMap.put("语文", "张老师");
10: lazyMap.put("数学", "李老师");
11: lazyMap.put("音乐", "汪峰老师");
12: System.out.println(lazyMap.get("音乐")); //输出 -- 汪峰老师
13: System.out.println(lazyMap.get("英语")); //英语在lazyMap中不存在,但是会输出factory给其创建的 "全能点读机"
Bag是Commons-Collections定义的一种记录元素出现次数的集合接口。
public interface Bag<E> extends Collection<E>
Bag的实现类有很多,通常我们使用HashBag和TreeBag:
· HashBag --- 使用HashMap来存储数据
· TreeBag --- 使用TreeMap来存储数据
实例代码:
1: Bag<String> bag = new HashBag<String>();
2: bag.add("basketball"); //加入一个篮球
3: bag.add("basketball",4); //加入4个篮球
4: bag.remove("basketball", 2); //去除2个篮球
5: bag.getCount("basketball"); //统计,现在还剩下3个篮球