Apache-Commons-Collections

By | 2015年4月19日

· 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个篮球