【本文目录】
作为一名开发,好的工具类可以极大的提升我们的开发效率,在Java中,我们最常用的三方工具类,最著名的无非Apache Commons和Guava。
Apache Commons 最初是作为 Jakarta 项目的一个补充核心 Java 集合 API 的项目,最终成为 Apache 软件基金会的一个项目
Apache Commons
Apache Commons is an Apache project focused on all aspects of reusable Java components. —— apache官网
译:Apache Commons 专注于提供各个方面的Java组件库。 (Apache Commons曾隶属于Jakarta项目)
它的各个很多,很全面,以下是当前Apache Commons已完成孵化的项目,其中日常工作比较常用的加粗标识。
组件 | 用途 |
---|---|
BECL | 字节码操作,类似Javassist |
BeanUtils | 反射操作 |
BSF | Python等脚本的引擎的实现 |
Chain | 一个责任链模式的实现 ( 可参考之前Mybatis源码系列的责任链文 ) |
CLI | 用于解析传递给程序的命令行命令 |
Codec | 编/解码工具 |
Collections | 集合工具类 |
Compress | 压缩/解压工具类 |
Configuration | 从各类源读取配置 |
Crypto | 加密库 |
CSV | CSV文件工具类 |
Daemon | 将一个普通的java 应用程序作为linux 或windows的守护进程服务 |
DBCP | 数据库连接池实现 ( 可参考之前Mybatis源码系列的JDBC文 ) |
DbUtils | DB工具 |
Digester | XML-java对象的解析器 ( 可参考之前Mybatis源码系列的XML文 ) |
Email工具类 | |
Exec | 对Java的Runtime封装 |
FileUpload | 文件上传工具 |
Functor | 对函数式编程支持但是官网提供的api已经无法再maven 仓库找到,可能已经不再支持 |
Geometry | 几何学,空间/坐标类 |
Imaging | 图像处理类 |
IO | IO工具类 |
JCI | 规范Java编译接口 已有Groovy编译器等实现 |
JCS | 一个JAVA缓存实现 |
Jelly | 一种将 XML 转换为可执行代码的工具 |
Jexl | 基于 JSTL表达式语言的一些 扩展的表达式语言 |
JXPath | 可使用XPath语法操作Java Bean |
Lang | 对java.lang.*下的方法扩展 包括字符串/反射/时间等。 |
Logging | JCL 前文Mybatis源码系列Log篇可参考 |
Math | 数学运算工具 |
Net | 网络工具类 |
Numbers | 复数,分数,向量,组合等 |
OGNL | OGNL表达式支持 |
Pool | 通用的池化工具 |
Proxy | 动态代理实现 |
RNG | 随机数生成器 |
SCXML | 基于xml的通用状态机 |
Statistics | 从Math脱离出来的统计学部分 |
Text | 专注于字符串算法 |
Validator | 一个可配置的(通常是 XML)验证引擎 |
VFS | 虚拟文件系统组件 |
Weaver | 字节码增强 |
Guava
Guava 是一组来自 Google 的核心 Java 库,其中包括新的集合类型(例如 multimap 和 multiset)、不可变集合、图形库以及用于并发、I/O、散列、缓存、原语、字符串等的实用程序。
组件 | 用途 |
---|---|
Basic Utilities | 基础工具,包含Ordering,Optional Throwables等 |
Collections | Guava 对 JDK 集合生态系统的扩展 |
Graphs | 图形建模库 |
Cache | 本地缓存实现 |
Functional idioms | 函数式编程 |
Strings | 字符串工具 |
Concurrency | 并发工具类 |
Primitives | 原生类型,包括不可变集合等 |
Range | 范围工具类 |
Hashing | hash运算工具类 提供md5,sha1等hash实现 |
I/O | IO工具类, 提供Sink,Source抽象 |
EventBus | 基于观察者模式的消息通知组件 |
Math | 数据运算工具 |
Reflection | 反射工具类 |
比较
- apache commons显然实现广泛,拥有众多子项目,Guava更适合与前者的一部分子集比较,而非全部。
- 在集合方面,Google Guava 的诞生是出于在库中使用泛型的需要,而 Apache Commons 早期(4之前)没有提供。
- apache commons有一些违反JDK接口规范的地方,比如Collection接口add原返回值代表(已存在返回true,不存在返回false),而apache commons的Bag接口继承了Collection,又重新定义了add返回值含义(已存在返回false,不存在返回true)。这意味着Collection接口的里氏替换原则被破坏了。这也是Google开发Guava的一点原因。
总结
apache commons与guava都是优秀且有着强大技术背景的开源工具库,相较而言,如果对JDK规范本身具有认同感的开发者显然Guava是更好的选择,反之,则是Apache Commons。当然两者之间没有交集的部分其实更多,混用也是一种不错的选择(前提是我们对他们的特性足够了解)。