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
  1. 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;
}
});
  1. CallbackDemo :
Cache<String,String> cache= CacheBuilder.newBuilder()
.maximumSize(100)
.expireAfterAccess(1, TimeUnit.SECONDS)
.build();

学习-guava的更多相关文章

  1. Guava 学习计划

    Guava这个框架,我想参加过工作了Java程序员都应该不会陌生,这个框架甚至比Apache Commons Lang3框架更受Java程序员的喜欢.但是遗憾的是怎么优秀和成熟的框架,在国内我居然没有 ...

  2. guava学习:guava集合类型-Bimap

    学习guava让我惊喜的第二个接口就是:Bimap BiMap是一种特殊的映射其保持映射,同时确保没有重复的值是存在于该映射和一个值可以安全地用于获取键背面的倒数映射. 最近开发过程中,经常会有这种根 ...

  3. Google Guava14.0 瓜娃学习笔记

    Guava 是java api的增强与扩展,提供复杂的java 数据结构,使你的代码更简短精炼,具有良好的可读性.看看guava给我们提供了哪些很酷的功能: 集合创建: Map<String, ...

  4. Guava 是个风火轮之基础工具 (1)

    转自:http://www.jamespan.me/blog/2015/02/08/guava-basic-utilities-1/ Guava 是个风火轮之基础工具 (1) 前言 Guava 是 J ...

  5. cache之guava

    本文主要记录guava_cache的学习心得! 缓存是什么?为何要用缓存呢? 先参考下图! 这是一张小白图!简单形容了一个普普通通的服务端请求的处理模型! 当一个request请求通过网络不远千里的来 ...

  6. java开发人员,最应该学习和熟练使用的工具类。google guava.(谷歌 瓜娃)

    学习参考文章: http://blog.csdn.net/wisgood/article/details/13297535 http://ifeve.com/google-guava/ http:// ...

  7. Guava学习笔记(一)概览

    Guava是谷歌开源的一套Java开发类库,以简洁的编程风格著称,提供了很多实用的工具类, 在之前的工作中应用过Collections API和Guava提供的Cache,不过对Guava没有一个系统 ...

  8. Guava学习笔记(1):Optional优雅的使用null

    转自:http://www.cnblogs.com/peida/archive/2013/06/14/Guava_Optional.html 参考:[Google Guava] 1.1-使用和避免nu ...

  9. guava学习--ComparisonChain

    转载:https://my.oschina.net/realfighter/blog/349824 在日常的工作中,我们经常需要对两个对象进行比较,以找出其中的异同, Java中提供了compare/ ...

随机推荐

  1. PHP 函数禁用设置方法

    PHP 函数禁用设置方法先找到php.ini 然后搜索disable_function 直接在上面添加你要禁用的函数就可以了 然后记得重启php-fpm(如果装了php-fpm)

  2. vuejs怎么和thinkphp结合

    vue在服务端部署时,我们都知道通过npm run build 指令打包好的dist文件,通过http指定是可以直接浏览的,Thinkphp通过域名指向index.php文件才可以浏览.要使前端正常调 ...

  3. XMLHttpRequest原生方法

    时间久了,在工作中会有很多方法和见解. 随着时间的推移,慢慢的写的代码越来越多,封装分方法也越来越多,为的是方便后续工作,加快开发效率! 与此同时,我们会相应的去找一些插件,来代替我们在开发过程中执行 ...

  4. [Err] 1055 - Expression #1 of ORDER BY clause is not in GROUP BY clause and contains nonaggregated column 'information_schema.PROFILING.SEQ'

    在Navicat Premium中执行Mysql的一条删除语句,虽然执行成功了,却提示已下错误: 受影响的行: 时间: .005s of ORDER BY clause is not in GROUP ...

  5. java线程锁基础

    定义运行方法 package com.company; // 包名import java.util.concurrent.locks.ReentrantLock;import java.util.co ...

  6. scala基础题--100以内的数求和,求出当和第一次大于20的当前数【for】

    import util.control.Breaks._ object work01 { def main(args: Array[String]): Unit = { //方式一 var sum:I ...

  7. Web应急:搜索引擎劫持

    当你直接打开网址访问网站,是正常的,可是当你在搜索引擎结果页中打开网站时,会跳转到一些其他网站,比如博彩,虚假广告,淘宝搜索页面等.是的,你可能了遇到搜索引擎劫持. 现象描述 从搜索引擎来的流量自动跳 ...

  8. Runtime.addShutdownHook()(译)

    序言: 每一个Java程序都可以为JVM增加一个关闭钩子.JVM将在关闭之前执行关闭钩子中的指令. 问题: 一个程序可能需要在退出前执行一些指令.程序可能由于下列原因而退出: 所有的线程已经执行完毕 ...

  9. iOS开发工具:Alcatraz、SVGKit、Lin以及Transformifier等

    转自:http://www.cocoachina.com/applenews/devnews/2013/0606/6352.html Alcatraz:Xcode包管理器 Alcatraz是一个开源的 ...

  10. c# 开发+MySql数据库

    今天就一个客户端的任务:1.把Excel文件转成特定格式插入到数据库中:2.查出该文件,并且导出Excel文件:3.如果插入数据错误,则把刚插入的数据删除掉.感觉比较简单,可是,墨迹了一天呀....总 ...