开发常用工具类
Google guava
guava的优点
- 高效设计良好的API,被Google的开发者设计,实现和使用
- 遵循高效的java语法实践
- 使代码更刻度,简洁,简单
- 节约时间,资源,提高生产力
guava的核心库
- 集合 [collections]
- 缓存 [caching]
- 原生类型支持 [primitives support]
- 并发库 [concurrency libraries]
- 通用注解 [common annotations]
- 字符串处理 [string processing]
- I/O 等等。
maven引入
1
2
3
4
5
6
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>23.0</version>
</dependency>
基本工具[Basic utilities]
集合[Collections]
MultiMap
MultiSet
统计一个词在文档中出现了多少次,传统的做法是这样的:
1
2
3
4
5
6
7
8
9
10
Map<String, Integer> counts = new HashMap<String, Integer>();
for (String word : words) {
Integer count = counts.get(word);
if (count == null) {
counts.put(word, 1);
} else {
counts.put(word, count + 1);
}
}
Multiset.addAll(Collection)可以添加Collection中的所有元素并进行计数
Table
当你想使用多个键做索引的时候,你可能会用类似Map<FirstName, Map<LastName, Person»的实现,这种方式很丑陋,使用上也不友好。Guava为此提供了新集合类型Table,它有两个支持所有类型的键:”行”和”列”。
Table提供多种视图,以便你从各种角度使用它:
- rowMap():用Map<R, Map<C, V»表现Table<R, C, V>。同样的, rowKeySet()返回”行”的集合Set
。 - row(r) :用Map<C, V>返回给定”行”的所有列,对这个map进行的写操作也将写入Table中。
- 类似的列访问方法:columnMap()、columnKeySet()、column(c)。(基于列的访问会比基于的行访问稍微低效点)
- cellSet():用元素类型为Table.Cell<R, C, V>的Set表现Table<R, C, V>。Cell类似于Map.Entry,但它是用行和列两个键区分的。
Table有如下几种实现:
- HashBasedTable:本质上用HashMap<R, HashMap<C, V»实现;
- TreeBasedTable:本质上用TreeMap<R, TreeMap<C,V»实现;
- ImmutableTable:本质上用ImmutableMap<R, ImmutableMap<C, V»实现;注:ImmutableTable对稀疏或密集的数据集都有优化。
- ArrayTable:要求在构造时就指定行和列的大小,本质上由一个二维数组实现,以提升访问速度和密集Table的内存利用率。ArrayTable与其他Table的工作原理有点不同,请参见Javadoc了解详情。
BiMap
要实现键值对的双向映射需要维护两个单独的map,并保持它们间的同步。
例如:
1
2
3
4
5
Map<String, Integer> nameAndId = Maps.newHashMap();
Map<Integer, String> idAndName = Maps.newHashMap();
nameAndId.put("Bob", 42);
idAndName.put(42, "Bob");
这种方式容易出错,而且对于值已经在map中的情况,会变得非常混乱。在BiMap中可以这样:
1
2
3
4
BiMap<String, Integer> userId = HashBiMap.create();
...
String userForId = userId.inverse().get(id);
ClassToInstanceMap
ClassToInstanceMap是一种特殊的Map:它的键是类型,而值是符合键所指类型的对象。
为了扩展Map接口,ClassToInstanceMap额外声明了两个方法:T getInstance(Class
ClassToInstanceMap有唯一的泛型参数,通常称为B,代表Map支持的所有类型的上界。例如:
1
2
3
ClassToInstanceMap<Number> numberDefaults=MutableClassToInstanceMap.create();
numberDefaults.putInstance(Integer.class, Integer.valueOf(0));
从技术上讲,ClassToInstanceMap实现了Map<Class<? extends B>, B>——或者说,是一个映射B的子类型到对应实例的Map。这让ClassToInstanceMap包含的泛型声明有点令人困惑, 但B始终是Map所支持类型的上界——通常B就是Object。
对于ClassToInstanceMap,Guava提供了两种有用的实现:MutableClassToInstanceMap和 ImmutableClassToInstanceMap。
Apache common Lang/BeanUtils
apache common Lang
apache提供的众多commons工具包,号称Java第二API,而common里面lang3包更是被我们使用得最多的。 使用apache common Lang
Hutool
模块 | 介绍 |
hutool-aop J | DK动态代理封装,提供非IOC下的切面支持 |
hutool-bloomFilter | 布隆过滤,提供一些Hash算法的布隆过滤 |
hutool-cache | 简单缓存实现 |
hutool-core | 核心,包括Bean操作、日期、各种Util等 |
hutool-cron | 定时任务模块,提供类Crontab表达式的定时任务 |
hutool-crypto | 加密解密模块,提供对称、非对称和摘要算法封装 |
hutool-db | JDBC封装后的数据操作,基于ActiveRecord思想 |
hutool-dfa | 基于DFA模型的多关键字查找 |
hutool-extra | 扩展模块,对第三方封装(模板引擎、邮件、Servlet、二维码、Emoji、FTP、分词等) |
hutool-http | 基于HttpUrlConnection的Http客户端封装 |
hutool-log | 自动识别日志实现的日志门面 |
hutool-script | 脚本执行封装,例如Javascript |
hutool-setting | 功能更强大的Setting配置文件和Properties封装 |
hutool-system | 系统参数调用封装(JVM信息等) |
hutool-json | JSON实现 |
hutool-captcha | 图片验证码实现 |
hutool-poi | 针对POI中Excel和Word的封装 |
hutool-socket | 基于Java的NIO和AIO的Socket封装 |
hutool-jwt | JSON Web Token (JWT)封装实现 |
fastjson
在日志解析,前后端数据传输交互中,经常会遇到字符串(String)与json,XML等格式相互转换与解析, 其中json以跨语言,跨前后端的优点在开发中被频繁使用,基本上可以说是标准的数据交换格式。 fastjson是一个java语言编写的高性能且功能完善的JSON库,它采用一种“假定有序快速匹配”的算法, 把JSON Parse 的性能提升到了极致。它的接口简单易用,已经被广泛使用在缓存序列化,协议交互,Web输出等各种应用场景中。
1
2
JSON.parseObject(jsonStr, Model.class);
JSON.parseArray(jsonStr, Model.class);
gson
GSON是Google提供的用来在Java对象和JSON数据之间进行映射的Java类库。可以将一个Json字符转成一个Java对象,或者将一个Java转化为Json字符串。 特点:
- 快速、高效
- 代码量少、简洁
- 面向对象
- 数据传递和解析方便
1
2
3
4
5
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.8.0</version>
</dependency>
1
2
Gson gson = new gson();