Guava 基础
2023-01-31 本文已影响0人
Tinyspot
1. 基础
1.1 guava的核心库
- 集合 [Collections]
- 缓存[Caches]
- 原生类型支持 [primitives]
- 并发[Concurrency]
- 字符串处理[Strings]
- I/O 等
1.2 依赖
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>31.1-jre</version>
</dependency>
2. 集合工具(Collections)
2.1 不可变集合
- Guava 不可变集合都不接受 null 值
// 普通Collection的创建
List<String> list = Lists.newArrayList();
Set<String> set = Sets.newHashSet();
Map<String, String> map = Maps.newHashMap();
// 不变Collection的创建
ImmutableList<String> iList = ImmutableList.of("a", "b", "c");
ImmutableSet<String> iSet = ImmutableSet.of("a", "b");
ImmutableMap<String, String> iMap = ImmutableMap.of("k1", "v1", "k2", "v2");
immutable(不可变)对象
- 线程安全
- 创建对象的不可拷贝
2.2 Multimap
- Multimap 是一键对多值的HashMap,类似于 Map<K, List>
@Test
public void test() {
Multimap<String, String> multimap = ArrayListMultimap.create();
multimap.put("name", "aaa");
multimap.put("name", "aaa");
multimap.put("name", "bbb");
multimap.put("code", "1001");
// {code=[1001], name=[aaa, aaa, bbb]}
System.out.println(multimap);
System.out.println(multimap.get("name"));
}
2.3 Multiset
- 集合[set]概念的延伸,它的元素可以重复出现
- 元素无序
@Test
public void test() {
Multiset<String> multiset = HashMultiset.create();
multiset.add("aaa");
multiset.add("aaa");
multiset.add("bbb");
System.out.println(multiset.count("aaa"));
}
2.4 BiMap
- put(K key, V value):添加新的键值,若值有重复,会抛出异常
- forcePut(K key, V value) 若值重复,强制替换
@Test
public void test() {
BiMap<String, String> biMap = HashBiMap.create();
biMap.put("name", "aaa");
// java.lang.IllegalArgumentException: value already present
biMap.put("other", "aaa");
}
值重复时会抛异常,
IllegalArgumentException – if the given value is already bound to a different key in this bimap
改为 biMap.forcePut("other", "aaa");
3. 缓存
- Guava Cache 是将数据缓存到JVM内存
3.1 缓存分类
- 本地缓存
- 本地缓存会占用JVM内存
- 本地缓存为了保证线程安全问题,一般使用ConcurrentMap的方式保存在内存之中
- 分布式缓存
- 分布式缓存的开销则在于网络时延和对象序列化,故主要影响调用时延
- 分布式缓存常见的有 Redis,MongoDB
3.2 CacheBuilder生成器
@Test
public void test() {
Cache<String,String> cache = CacheBuilder.newBuilder()
.maximumSize(1024)
.expireAfterWrite(60, TimeUnit.SECONDS)
.weakValues() .build();
cache.put("greet","Hello Guava Cache");
System.out.println(cache.getIfPresent("greet"));
}
3.3 缓存清除策略
- 基于存活时间的清除策略
- expireAfterWrite 写缓存
- expireAfterAccess 读写缓存
- 基于容量的清除策略
- CacheBuilder.maximumSize(long)
- 基于权重的清除策略
- CacheBuilder.weigher(Weigher)指定一个权重函数
- CacheBuilder.maximumWeight(long)指定最大总重