代码改变世界

常用项目Commons包知识总结

2012-11-14 17:43  Patrick.Lee  阅读(846)  评论(0编辑  收藏  举报

转自:http://www.iteye.com/topic/450033

 在java项目中有很多公用的算法实现和工具类
 jarkata项目组把这些公用的东西作为开源项目加以实现以后在项目使用中就可以统一算法,不必写象StringUtil或者DateHelper之类的工具类了最近需要针对collection作一些扩展,发现commons-collection里面已经有了实现而且比较好更完善,效率更高索性来研究一下这个项目,因为很多开源项目也使用它以后看开源项目代码的时候也就不用那么费力了
       
概述
        首先这个包是基于JDK1.2开发的,所以以后在调用的时候就不用关心JDK版本的问题
        其二这个包在大部分的开源项目中使用,已经成为事实上的行业集合类处理标准
特性描述
        Bag集合接口,用于在集合中保存一个对象的多次拷贝
        Buffer接口,用于处理FIFO等定义好移除顺序的结合类
        BidiMap接口,用于通过value查找key
        MapIterator,这个就不用多说了,以后就不用使用map.keyset.iterator去处理map循环了
        型别检查装饰,其实就是可以创建一个具有指定型别的集合类


        比如定义了一个整型的list,就不能再向这个list里面放String,否则会抛出异常

        转换修饰,就是在向集合中放入对象时,可以将对象转换为需要的类型的对象再放入集合中

        组合集合,一个非常好的概念,就是把多个集合当一个集合去使用

        排序Map和Set,保持集合的加入顺序
        Identity Map,这个Map中使用==而不是equal()方法去比较对象

 

        * Reference map that allows keys and/or values to be garbage collected under close control
        更多的比较实现
       

 更多的迭代实现
       

 将数组或枚举类型装换到集合类中,非常好用的功能,毕竟array的功能有限
       
        * Utilities to test or create typical set-theory properties of collections such as union, intersection, and closure

 

个人对于一些类的体会
        第一个就是TypedList(还有map,set都一样)
        可以创建一个String的List,或者一个只能放入指定Class的List,避免编程时候的误写

        java编程思想中提到过创建指定型别的集合的问题,不过使用这个类就不用那么麻烦了

        CollectionUtils
                针对集合进行与/并/判断是否包含/等于等工具方法
                查找一个集合中某个对象出现的数量
                查找(或过滤)一个集合中某种class的子集合,或者计算数量
                将集合中的对象进行转换处理
                将数组或枚举对象放入集合中
                提供针对所有集合类的index,size,get等方法
                提供数组翻转方法
                提供集合的同步修饰
                        比如HashMap本身是不支持同步的,但这个类提供了一个同步修饰
                        以后再使用经过修饰后的HashMap时就不用考虑同步的问题了
                提供禁止修改集合的工具方法


        同CollectionUtils一样还有相应的ListUtils,SetUtils等工具类
                这些工具类提供的方法基本都出现在CollectionUtils中

 

        ArrayStack
                一个继承自ArrayList的Stack实现

        BeanMap
                一个用于分析javaBean的Map容器,个人感觉用于测试比较方便
                因为beanUtils类也可以做这个类的事情,这个类方便的是读取所有属性并显示

        BidiMap
                就是一个可以通过value查找key的Map
                限制:添加对象时,value不能相同
                因为这个类还有一个方法就是创建一个反向Map,把value作为key,把key作为value再创建一个Map

        BoundedCollection接口
                所有实现此接口的集合均被限制了集合大小,不过超过约束的大小

        Buffer接口
                非常好的一个接口,实现了按照指定顺序移除对象
                可以用来实现FIFO,LIFO等算法
                也可以通过Comprator来构造,指定确定的移除算法

        Ordered**接口
                用来实现集合排序

        Predicate接口(断言)
                用来验证或过滤对象

        Transformer接口
                用来把一个对象转换成另为一个对象

        Closure接口
                用来封闭一段代码,针对对象进行指定的处理

        Unmodifiable接口
                所以实现(或包含了)此接口的对象均不可以改变

 

        ComparatorUtils类
                实现了各种比较
                布尔值比较实现
                null判断比较
                比较链的实现
                获取min,max对象

        AbstractDualBidiMap
                一个包含了两个bidiMap的抽象类
                因为bidiMap可以做双向查找
                继承AbstractDualBidiMap后,内部的两个map一个针对key排序,一个针对value排序
                可以加快访问速度

        EnumerationUtils
                包含了toList()方法,可以简化代码

        ExtendedProperties 比较好玩
                提供了增强的properties处理
                处理多行
                处理多个相同的声明

        Fast***
                提供了在多线程中针对集合的快速访问
                当进行只读操作时,不进行同步处理
                当进行写操作时
                        克隆整个集合
                        针对克隆执行修改
                        使用克隆替换现有对象

        MultiHashMap
                实现了多key的map
                当get时返回list对象

        StaticBucketMap ***********(高效)
                是一个非常高效的Map, get, put, remove 和 containsKey  操作都被进行了优化
                这个Map里面有多个Buck(桶)用于存储数据
                这样在多线程中取数据的使用,是从不同的桶中取,真正实现了同步机制
                当然,在进行批量操作时无法保证原子性,要注意这一点

 

 在源代码中英文信息如下:

 * <p>FastDateFormat is a fast and thread-safe version of
 * {@link java.text.SimpleDateFormat}.</p>
 *
 * <p>This class can be used as a direct replacement to
 * <code>SimpleDateFormat</code> in most formatting situations.
 * This class is especially useful in multi-threaded server environments.
 * <code>SimpleDateFormat</code> is not thread-safe in any JDK version,
 * nor will it be as Sun have closed the bug/RFE.
 * </p>

 

翻译信息大致内容如下:

 

在时间转换时一般使用的为:DateFormat或SimpleDateFormat实现字符串时间的转换。

  可以采用common-lang包中的 org.apache.commons.lang.time.FastDateFormat类

  FastDateFormat是一个快速高效,并且线程安全的转换对象,可以直接替换SimpleDateFormat类。

 特别是在多线程的情况下,推荐使用FastDateFormat类(SimpleDateFormat非线程安全性)。

 

common-lang中FastDateFormat的使用如下:

 public static final FastDateFormat FAST_SECOND_FORMATETR = FastDateFormat
   .getInstance("yyyy-MM-dd HH:mm:ss");

 

 /* 格式化日期为短形式 */
 public static String getShortDate(Date myDate) {
  return FAST_SHORT_FORMATETR.format(myDate);
 }

 

 

 /* 格式化日期为标准形式 */
 public static String formatDateTime(Date myDate, String pattern) {
  FastDateFormat format = FastDateFormat.getInstance(pattern);
  return format.format(myDate);
 }

 

在Common-lang中的DateUtils类的使用

 

 /**
  * 返回date时间 只到天 2008-05-20 00:00
  *
  * @param date
  * @return
  */
 public static Date getNoHHMMDate(Date date) {
  return org.apache.commons.lang.time.DateUtils.truncate(date,
    Calendar.DATE);
 }

 /**
  * 增加天
  *
  * @param date
  * @param i
  * @return
  */
 public static Date addDays(Date date, int i) {
  return org.apache.commons.lang.time.DateUtils.addDays(date, i);
 }

 

常用的common-lang中的StringUtils,NumberUtils等。