简介
基本工具
集合Collections
缓存Caches
函数式风格
并发Concurrency
字符串处理Strings
原生类型
区间Ranges
I/O
hash
事件总线EventBus
数学运算Math
反射Reflections
简介
源码包的简单说明
- com.google.common.annotations:普通注解类型。
- com.google.common.base:基本工具类库和接口。
- 使用和避免使用null
- 前置条件:快速失败
- 常见的对象方法:简化Object常用方法的实现
- 排序:fluent comparator比较器,提供多关键字排序
- Throwable类:简化异常检查和错误传播
- com.google.common.cache:缓存工具包,非常简单易用且功能强大的JVM内缓存
- com.google.common.collect:带泛型的集合接口扩展和实现,以及工具类
- Immutable collections(不变的集合):不可修改的集合
- 新集合类型:multisets,multimaps,tables, bidirectional maps等
- 集合工具类
- 拓展工具类:给集合对象添加功能
- 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:多线程工具包。
基本工具
Optional 类:使用和避免使用null
参见java8 Optional
前置条件:快速失败
常见的对象方法:简化Object常用方法的实现
排序:fluent comparator比较器,提供多关键字排序
Throwable类:简化异常检查和错误传播
集合
Immutable collections(不变的集合)
新集合类型:
集合工具类
拓展工具类:给集合对象添加功能
缓存
适用性
guava cache与concurrentmap类似,区别在于不会一直保存所有添加的元素,通常都设定为自动回收元素
适用于:
消耗一些内存空间来提升速度
某些健会被查询不止一次
cache实例通过chachebuilder生成器模式获取,但是自定义缓存才是最有趣的地方
加载
获取的值如何与健关联
- 使用cacheLoader(首选,更容易推断所有缓存内容的一致性)
- 调用get时传入一个callable实例:“get-if absent-compute”的原子语义
- cache.put方法
CacheLoader
1 | LoadingCache<String,String> cache = CacheBuilder.newBuilder() |
Callable
1 | Cache<String,String> cache = CacheBuilder.newBuilder() |
显式插入
cache.put(key, value) 可以直接向缓存中插入值,直接覆盖掉给定健的值
Cache.asMap()视图提供的任何方法也能修改缓存 ,但任何方法都不能原子执行
使用之前要注意使用putIfAbsent(K,V),等
缓存回收
基于容量回收、定时回收、和基于引用回收
基于容量回收
maximumSize(long),
- 超过上限尝试回收最近没有使用或者总体上很少使用的缓存项
- 不同的缓存项有不同的权重,如果你的缓存值,占据完全不同的内存空间,可以使用weigher(weigher)指定一个权重函数(计算key的权重),并且用maxumumnweight(long)指定最大总重
定时回收
- expireAfterAccess(long,timeUnit):缓存项在给定时间内灭有被读写访问则回收,缓存的回收顺序和基于大小回收一样
- expiredAfterwrite(long,timeunit):缓存项在给定时间内没有被写访问,则回收,如果任务缓存数据总是在固定时间后变得陈旧,这种方式是可取的
基于引用回收
通过使用弱引用的健、或弱引用的值、或软引用的值
显示清除
任何时候都可以显示清除
监听器
CacheBuilder.removalListener(RemovalListener) :声明一个监听器缓存项被移除时做一些额外的动作
有异步方法
清理
不会自动执行清理和回收工作、会在写或者读的时候做一些维护工作,原因在于维护线程要新建,减少与用户操作竞争共享锁
可以自己创建维护线程,以固定的时间调用chche.cleanup()
刷新
chche.refresh(K)为健加载新值,读操作返回原值,与回收不同,回收会等待新值加载完成
其他特性
统计缓存命中率,加载新增的平均时间,缓存被回收的总数等