Google 开源库Guava详解

news/2024/12/29 10:51:03/

一、概述

Guava是一组来自Google的核心Java库,包括新的集合类型(如多映射和多集)、不可变集合、图库和并发、I/O、哈希、原语、字符串等实用程序!它广泛用于Google中的大多数Java项目,也被许多其他公司广泛使用。
Guava 开发要求 :
JRE风格需要JDK 1.8或更高版本。
如果您需要支持Android,请使用Android风格。您可以在Android目录中找到Android Guava源代码。

guava github 开源地址:GitHub - google/guava: https://github.com/google/guava

官网用户手册:https://github.com/google/guava/wiki

guava 的Maven groupID是com.google.Guava,其artifact ID是guava 。Guava提供了两种不同的“风格”:一种用于(Java 8+)JRE,另一种用于Android或任何希望与Android兼容的库。这些口味在Maven版本字段中指定为32.1.2-jre或32.1.2-安卓。 

com.google.guava 依赖:

<dependency><groupId>com.google.guava</groupId><artifactId>guava</artifactId><version>32.1.2-jre</version><!-- or, for Android: --><version>32.1.2-android</version>
</dependency>

二、使用Guava

Guava项目包含我们在基于Java的项目中依赖的几个Google核心库:集合、缓存、原语支持、并发库、通用注释、字符串处理、I/O等。这些工具中的每一个确实每天都被谷歌人用于生产服务。
但浏览Javadoc并不总是学习如何最好地利用库的最有效方法。

基本使用: 

  • 使用和避免null:null可能是模棱两可的,可能会导致令人困惑的错误,有时只是令人不快。许多Guava公用事业拒绝并在空值上快速失败,而不是盲目接受它们。
  • 先决条件:更容易地测试方法的先决条件。
  • 通用对象方法:简化object方法的实现,如hashCode()和toString()。
  • Ordering:Guava强大的“流畅比较器”类。
  • Throwables:简化传播和检查异常和错误。

Collections:Guava对JDK收藏生态系统的扩展。这些是番石榴最成熟和最受欢迎的部分。

  • 不可变集合,用于防御编程、常量集合和提高的效率。
  • 新的集合类型,用于JDK集合不能很好地处理的用例:多集合、多映射、表、双向映射等。
  • 强大的收集实用程序,用于java.util.Collections中未提供的常见操作。
  • 扩展实用程序:编写集合装饰器?实现迭代器?我们可以让这变得更容易。

:用于建模图结构数据的库,即实体及其之间的关系。主要功能包括: 

  • 图:其边是匿名实体的图,没有自己的标识或信息。
  • ValueGraph:其边具有关联的非唯一值的图。
  • 网络:其边是唯一对象的图。
  • 支持可变和不可变、有向和无向的图以及其他几个属性。

缓存:本地缓存,处理得当,并支持各种过期行为。
功能习语:谨慎使用,Guava的功能习语可以显著简化代码。
并发:强大、简单的抽象,使编写正确的并发代码变得更容易 

  • ListenableFuture:Futures,完成时回调。
  • 服务:启动和关闭的东西,为您处理困难的状态逻辑。

String :一些非常有用的字符串实用程序:拆分、连接、填充等。
Primitive :JDK不提供的对基本体类型(如int和char)的操作,包括某些类型的无符号变体。
范围:Guava强大的API,用于处理可比较类型的范围,包括连续和离散。
I/O:简化了Java 5和6的I/O操作,特别是在整个I/O流和文件上。
哈希:用于比Object.hashCode()提供的更复杂哈希的工具,包括Bloom过滤器。
EventBus:在组件之间发布订阅样式的通信,而不要求组件彼此显式注册。
Math:JDK未提供的优化、经过彻底测试的数学实用程序。
反射:用于Java反射功能的Guava实用程序。 

三、不可变集合

1、例子

public static final ImmutableSet<String> COLOR_NAMES = ImmutableSet.of("red","orange","yellow","green","blue","purple");class Foo {final ImmutableSet<Bar> bars;Foo(Set<Bar> bars) {this.bars = ImmutableSet.copyOf(bars); // defensive copy!}
}

2、不可变集合优点

不可变对象具有许多优点,包括:

  1. 不受信任的库可以安全使用。
  2. 线程安全:可以由许多线程使用,没有竞争条件的风险。
  3. 不需要支持突变,并且可以通过该假设节省时间和空间。所有不可变集合实现都比其可变同级更节省内存。(分析)
  4. 可以用作常量,预期它将保持固定。

3、不可变集合使用

ImmutableXXX集合可以通过几种方式创建:

  • 使用copyOf方法,例如ImmutableSet.copyOf(set)
  • 使用of方法,例如,ImmutableSet.of(“a”,“b”,“c”)或ImmutablesMap.of((“a”,1,“b”,2)
  • 例如,使用生成器, 
public static final ImmutableSet<Color> GOOGLE_COLORS =ImmutableSet.<Color>builder().addAll(WEBSAFE_COLORS).add(new Color(0, 191, 255)).build();

 Guava 为 java jdk 每种标准集合类型提供了简单易用的不可变版本,包括 Guava 自己的集合变体,为 java 提供的不可变版本都是继承 java jdk 的接口而来,所以操作上基本无异。下面接口的实现类也都有对应的不可变版本。

Interface

JDK or Guava?

Immutable Version

Collection

JDK

ImmutableCollection

List

JDK

ImmutableList

Set

JDK

ImmutableSet

SortedSet/NavigableSet

JDK

ImmutableSortedSet

Map

JDK

ImmutableMap

SortedMap

JDK

ImmutableSortedMap

Multiset

Guava

ImmutableMultiset

SortedMultiset

Guava

ImmutableSortedMultiset

Multimap

Guava

ImmutableMultimap

ListMultimap

Guava

ImmutableListMultimap

SetMultimap

Guava

ImmutableSetMultimap

BiMap

Guava

ImmutableBiMap

ClassToInstanceMap

Guava

ImmutableClassToInstanceMap

Table

Guava

ImmutableTable


http://www.ppmy.cn/news/1101681.html

相关文章

932. 漂亮数组

932. 漂亮数组 原题链接&#xff1a;完成情况&#xff1a;解题思路&#xff1a;参考代码&#xff1a; 原题链接&#xff1a; 932. 漂亮数组 https://leetcode.cn/problems/beautiful-array/description/ 完成情况&#xff1a; 解题思路&#xff1a; nums 是由范围 [1, n] 的…

Vue3+Ts+Vite项目(第一篇)——使用Vite创建Vue3项目

概述 保姆级详解&#xff0c;带你使用 Vite 创建 Vue3 项目&#xff0c;全程cv即可 文章目录 概述一、 安装 Vite二、 创建项目2.1 运行上述命令后&#xff0c;会让我们输入项目名称。可以写一个 vue3-study2.2 选择项目模板&#xff0c;此处选择 Vue&#xff0c;然后回车确定…

命悬一线小游戏

欢迎来到程序小院 命悬一线 玩法&#xff1a; 点击鼠标人物摆动跳跃&#xff0c;松开鼠标跳到方格上面&#xff0c;每跳一次都会有对应的分数统计&#xff0c;不要让人物掉下哦^^。开始游戏 html <canvas id"jsGameScreen"></canvas>css .bandiv{floa…

ATF(TF-A) fvp_r 平台威胁模型-安全检测与评估

安全之安全(security)博客目录导读 ATF(TF-A) 威胁模型汇总 目录 一、简介 二、评估目标 1、只支持BL1

【Python】关于自定义对象的Json序列化和反序列化

背景 最近使用Ptyon爬虫数据时&#xff0c;遇到对象无法转换为JSON序列化对象问题TypeError: Object of type Main is not JSON serializable 意思&#xff1a; 就是对象不能转换为JSON序列化对象 原因&#xff1a; 是对象没有自定义实现转换为JSON序列化对象的方法没有。 实…

【开发】视频集中存储/直播点播平台EasyDSS点播文件分类功能优化

视频推拉流EasyDSS视频直播点播平台&#xff0c;集视频直播、点播、转码、管理、录像、检索、时移回看等功能于一体&#xff0c;可提供音视频采集、视频推拉流、播放H.265编码视频、存储、分发等视频能力服务。 TSINGSEE青犀视频的EasyDSS平台具有点播文件分类展示方法&#xf…

Python之线程Thread(一)

一、什么是线程 线程(Thread)特点: 线程(Thread)是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位线程是程序执行的最小单位,而进程是操作系统分配资源的最小单位;一个进程由一个或多个线程组成,线程是一个进程中代码的不同执行路线;…

Hexo小结

Hexo小结 前段时间自己搭建了博客&#xff0c;后来维护太麻烦&#xff0c;放弃了&#xff0c;但还是做个基本使用的小结。 Hexo小结 Hexo 是一个基于 Node.js 的快速、简单和强大的博客框架。以下是一些常用的 Hexo 命令&#xff1a; hexo init [folder]&#xff1a;在指定文…