Guava工程包含了若干被Google的 Java项目广泛依赖 的核心库,例如:集合 [collections] 、缓存 [caching] 、原生类型支持 [primitives support] 、并发库 [concurrency libraries] 、通用注解 [common annotations] 、字符串处理 [string processing] 、I/O 等等。 所有这些工具每天都在被Google的工程师应用在产品服务中。
Guava源码的包图如下:
源码包的简单说明:
com.google.common.annotations:普通注解类型。
com.google.common.base:基本工具类库和接口。
com.google.common.cache:缓存工具包,非常简单易用且功能强大的JVM内缓存。
com.google.common.collect:带泛型的集合接口扩展和实现,以及工具类,这里你会发现很多好玩的集合。
com.google.common.eventbus:发布订阅风格的事件总线。
com.google.common.hash: 哈希工具包。
com.google.common.io:I/O工具包。
com.google.common.math:原始算术类型和超大数的运算工具包。
com.google.common.net:网络工具包。
com.google.common.primitives:八种原始类型和无符号类型的静态工具包。
com.google.common.reflect:反射工具包。
com.google.common.util.concurrent:多线程工具包
其中用到最多的是
集合类:集合类库是 Guava 对 JDK 集合类的扩展, 这是 Guava 项目最完善和为人所知的部分。
1. Immutable collections(不变的集合): 防御性编程, 不可修改的集合,并且提高了效率。
2. New collection types(新集合类型):JDK collections 没有的一些集合类型,主要有:multisets,multimaps,tables, bidirectional maps等等
3. Powerful collection utilities(强大的集合工具类): java.util.Collections 中未包含的常用操作工具类
4. Extension utilities(扩展工具类): 给 Collection 对象添加一个装饰器? 实现迭代器? 我们可以更容易使用这些方法。
缓存: 本地缓存,可以很方便的操作缓存对象,并且支持各种缓存失效行为模式。
如Joiner
、Splitter
、Strings
、CharMathcer
等工具类,其中有许多高效优雅的代码。如Strings.repeat方法里,为了尽可能提升效率采用了native方法System.arrayCopy。如Splitter中,匿名类的灵活使用。如Joiner.appendTo中优雅的解决最后一个分隔符问题。Splitter.separatorStart中神奇的continue用法。
Guava还有一个很重要的功能——GuavaCache
,平时开发过程中,一般后台会用数据库作为数据存储。稍大的系统中,为了减少db查询耗费的时间,会在前面加一层NoSql作为缓存。但是随着系统规模的增加,缓存的查询压力会越来越大。本地缓存这时候可以有效的缓解缓存的压力,特别当某些数据查询十分频繁但修改较少的时候。
例如,一个中国地区表数据,几乎每个用户下单都会用到,很少会有改动。如果按正常的缓存流程,那么每个用户取城市信息时,都会触发一次缓存查询,这会产生很高的tps,如果在每个服务器拿到缓存数据后,存到本地内存中,并设定一个有效期,例如一分钟。那么在一分钟内都不会再去缓存中查询这个数据,相当于直接把tps降到了一分钟一次。当然,这回导致数据更新有一分钟得延迟,多以如果对数据实时性要求非常高的,不适合使用。
guava cache值得学习的地方:
- builder 模式的使用,可以传递多个参数,所以封装了一个 CacheBuilder 进行构造。
- 构造 Cache 使用不上的功能,默认提供一个空实现。可以节省对象的空间。
- 活用枚举,在源码当中我们看到了大量使用枚举,然后封装抽象方法,通过枚举来实现了多种不同情况的处理。