学习-guava
Posted zd-blogs
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了学习-guava相关的知识,希望对你有一定的参考价值。
Guava
Guava工程包含了若干被Google的 Java项目广泛依赖 的核心库
例如:集合 [collections] 、缓存 [caching] 、原生类型支持 [primitives support] 、并发库 [concurrency libraries] 、通用注解 [common annotations] 、字符串处理 [string processing] 、I/O 等等。
guava类似Apache Commons工具集
Guava的好处
标准化 - Guava库是由谷歌托管
高效 - 可靠,快速和有效的扩展JAVA标准库
优化 -Guava库经过高度的优化
Optional
guava的Optional类似于Java 8新增的Optional类,都是用来处理null的,不过guava的是抽象类,其实现类为Absent和Present,而java.util的是final类。其中一部分方法名是相同的。
google的guava库中提供了Optional接口来使null快速失败,即在可能为null的对象上做了一层封装,在使用Optional静态方法of时,如果传入的参数为null就抛出NullPointerException异常。
Preconditions
guava的base包中提供的Preconditions类用来方便的做参数的校验,他主要提供如下方法:
- checkArgument 接受一个boolean类型的参数和一个可选的errorMsg参数,这个方法用来判断参数是否符合某种条件,符合什么条件google guava不关心,在不符合条件时会抛出IllegalArgumentException异常
- checkState 和checkArgument参数和实现基本相同,从字面意思上我们也可以知道这个方法是用来判断状态是否正确的,如果状态不正确会抛出IllegalStateException异常
- checkNotNull 方法用来判断参数是否不是null,如果为null则会抛出NullPointerException空指针异常
- checkElementIndex 方法用来判断用户传入的数组下标或者list索引位置,是否是合法的,如果不合法会抛出IndexOutOfBoundsException
- checkPositionIndexes 方法的作用和checkElementIndex方法相似,只是此方法的索引范围是从0到size包括size,而上面的方法不包括size。
Joiner
Joiner 提供了各种方法来处理字符串加入操作,对象等。
Joiner的实例不可变的,因此是线程安全的。
- on:制定拼接符号
- skipNulls():忽略NULL,返回一个新的Joiner实例
- useForNull(“Hello”):NULL的地方都用字符串”Hello”来代替
Splitter
Splitter 能够将一个字符串按照指定的分隔符拆分成可迭代遍历的字符串集合,Iterable
- on():指定分隔符来分割字符串
- limit():当分割的子字符串达到了limit个时则停止分割
- trimResults():去掉子串中的空格
- fixedLength():根据长度来拆分字符串
- omitEmptyStrings():去掉空的子串
- withKeyValueSeparator():要分割的字符串中key和value间的分隔符,分割后的子串中key和value间的分隔符默认是=
Connection 不可变的集合
不可变对象有很多优点,包括:
- 当对象被不可信的库调用时,不可变形式是安全的;
- 不可变对象被多个线程调用时,不存在竞态条件问题
- 不可变集合不需要考虑变化,因此可以节省时间和空间。所有不可变的集合都比它们的可变形式有更好的内存利用率;
- 不可变对象因为有固定不变,可以作为常量来安全使用。
创建不可变集合方法:
- copyOf方法,如ImmutableSet.copyOf(set);
- of方法,如ImmutableSet.of(“a”, “b”, “c”)或 ImmutableMap.of(“a”, 1, “b”, 2);
- Builder工具
新型集合类
Multiset
无序但是可重复Multiset看似是一个Set,但是实质上它不是一个Set,它没有继承Set接口,它继承Multiset接口扩展设置有重复的元素,并提供了各种实用的方法来处理这样的元素在集合中出现。
Multiset自带一个有用的功能,就是可以跟踪每个对象的数量。- Multimap
一键多值的Map
Multimap可以很容易地把一个键映射到多个值。换句话说,Multimap是把键映射到任意多个值的一般方式。例如:
Multimap<String,Integer> map= HashMultimap.create();
//Multimap是把键映射到任意多个值的一般方式
map.put("a",1);
//key相同时不会覆盖原value
map.put("a",2);
map.put("a",3);
System.out.println(map); //{a=[1, 2, 3]
Multimap提供了丰富的实现:
实现 | Key实现 | Value实现 |
---|---|---|
ArrayListMultimap | HashMap | ArrayList |
HashMultimap | HashMap | HashSet |
LinkedListMultimap | LinkedHashMap | LinkedList |
LinkedHashMultimap | LinkedHashMap | LinkedHashSet |
TreeMultimap | TreeMap | TreeSet |
ImmutableListMultimap | ImmutableMap | ImmutableList |
ImmutableSetMultimap | ImmutableMap | ImmutableSet |
- BiMap
双向Map
我们知道Map是一种键值对映射,这个映射是键到值的映射,而BiMap首先也是一种Map,他的特别之处在于,既提供键到值的映射,也提供值到键的映射,所以它是双向Map
BiMap的值键对的Map可以通过inverse()方法得到。
BiMap的常用实现有: - HashBiMap: key 集合与 value 集合都有 HashMap 实现
- EnumBiMap: key 与 value 都必须是 enum 类型
ImmutableBiMap: 不可修改的 BiMap
Table
Table它有两个支持所有类型的键:”行”和”列”。
使用Table可以实现二维矩阵的数据结构,可以是稀溜矩阵。
集合操作:交集、差集、并集
Set<Integer> set1= Sets.newHashSet(1,2,3,4,5);
Set<Integer> set2=Sets.newHashSet(3,4,5,6);
Sets.SetView<Integer> inter=Sets.intersection(set1,set2); //交集
System.out.println(inter);
Sets.SetView<Integer> diff=Sets.difference(set1,set2); //差集,在A中不在B中
System.out.println(diff);
Sets.SetView<Integer> union=Sets.union(set1,set2); //并集
System.out.println(union);
Cache
缓存在很多场景下都是相当有用的。例如,计算或检索一个值的代价很高,并且对同样的输入需要不止一次获取值的时候,就应当考虑使用缓存。
Guava Cache与ConcurrentMap很相似,但也不完全一样。最基本的区别是ConcurrentMap会一直保存所有添加的元素,直到显式地移除。
相对地,Guava Cache为了限制内存占用,通常都设定为自动回收元素。在某些场景下,尽管LoadingCache 不回收元素,它也是很有用的,因为它会自动加载缓存。
Guava Cache是一个全内存的本地缓存实现,它提供了线程安全的实现机制
通常来说,Guava Cache适用于:你愿意消耗一些内存空间来提升速度。你预料到某些键会被查询一次以上。
缓存中存放的数据总量不会超出内存容量。(Guava Cache是单个应用运行时的本地缓存。它不把数据存放到文件或外部服务器。)
Guava Cache有两种创建方式:
- cacheLoadercallable callback
- LoadingCacheDemo:
LoadingCache<String,String> cache= CacheBuilder.newBuilder()
.maximumSize(100) //最大缓存数目
.expireAfterAccess(1, TimeUnit.SECONDS) //缓存1秒后过期
.build(new CacheLoader<String, String>() {
@Override
public String load(String key) throws Exception {
return key;
}
});
- CallbackDemo :
Cache<String,String> cache= CacheBuilder.newBuilder()
.maximumSize(100)
.expireAfterAccess(1, TimeUnit.SECONDS)
.build();
以上是关于学习-guava的主要内容,如果未能解决你的问题,请参考以下文章