lishenghan 发表于 2015-8-1 13:21:06

Apache-Commons-Collections

  · 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 extends Iterator //继承于Java的Iterator,只是个接口
  Commons-Collections中所有的Map实现类中都有mapIterator()方法,通过调用该方法可以获得Map的MapIterator的对应实例对象。以BidiMap为例说明如何使用:





   1: BidiMap bidiMap;
   2: bidiMap = new TreeBidiMap();
   3: bidiMap.put("阿勒泰", "0906");
   4: bidiMap.put("乌鲁木齐", "0996");
   5: bidiMap.put("武汉", "010");
   6: bidiMap.put("深圳", "0755");
   7: MapIterator 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 extends IterableMap
  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 extends IterableMap
  不知道是Apache不推荐使用还是什么的,在线API中没有显示它的存在。
  MultiMap只有只有一个实现类:public class MultiValueMap implements MultiMap
  MultiMap是指一个Key可以对应多个Value。put方法和一般的Map一样,只是在通过key获得value时,返回的是value集合。使用示例如下:





   1: MultiValueMap multiMap = new MultiValueMap();
   2: multiMap.put("Alex", "value1");
   3: multiMap.put("Alex", "value2");
   4: multiMap.put("Alex", "value3");
   5: Collection v1 = multiMap.getCollection("Alex");
   6: for(String s : v1) {
   7:   System.out.println(s);
   8: }







LzayMap – 类
  public class LazyMap extends AbstractMapDecorator 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 factory = new Factory() {
   2:   @Override
   3:   public String create() {
   4:         String s = "全能点读机";
   5:         return s;
   6:   }
   7: };
   8: Map lazyMap = LazyMap.lazyMap(new HashMap(), 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 extends Collection
  Bag的实现类有很多,通常我们使用HashBag和TreeBag:
  · HashBag --- 使用HashMap来存储数据
  · TreeBag --- 使用TreeMap来存储数据
  实例代码:





   1: Bag bag = new HashBag();
   2: bag.add("basketball"); //加入一个篮球
   3: bag.add("basketball",4); //加入4个篮球
   4: bag.remove("basketball", 2); //去除2个篮球
   5: bag.getCount("basketball"); //统计,现在还剩下3个篮球
页: [1]
查看完整版本: Apache-Commons-Collections