关于java:别再重复造轮子了推荐使用-Google-Guava-开源工具类库真心强大

46次阅读

共计 6287 个字符,预计需要花费 16 分钟才能阅读完成。

Google Guava 概述

1、Guava 是一组来自 Google 的外围 Java 库,包含新的汇合类型(如 multimap 和 multiset)、不可变汇合、图形库以及用于并发、I/O、散列、缓存、原语、字符串等的实用程序!被广泛应用于 Google 的大多数 Java 我的项目中,也被许多其余公司宽泛应用。

2、guava github 开源地址:GitHub – google/guava:

https://github.com/google/guava

3、官网用户手册

https://github.com/google/gua…

4、com.google.guava 依赖:

<dependency>
  <groupId>com.google.guava</groupId>
  <artifactId>guava</artifactId>
  <version>29.0-jre</version>
</dependency>

不可变汇合与对象

1、制作对象的不可变正本是一种很好的防御性编程技术,不可变对象有许多长处,包含:

  • 可供不受信赖的库平安应用。
  • 线程平安:可由多个线程应用,无争用危险。
  • 不须要反对渐变,并且能够节省时间和空间,所有不可变的汇合实现都比它们的可变同级更节俭内存。
  • 能够用作常数,并冀望它将放弃不变。

2、要点:每个 Guava 不可变汇合实现都回绝 null 值。Guava 的设计上举荐应用 null 值,大多数状况下,遇到 null 值会抛异样.

3、一个不可变的 ImmutableXxx 汇合能够通过以下几种形式创立:

  • 应用 copyOf 办法,如 ImmutableSet.copyOf(set)
  • 应用 of 办法, 如 ImmutableSet.of("a", "b", "c")ImmutableMap.of("a", 1, "b", 2)
  • 应用 Builder 办法,。

4、Guava 为 java jdk 每种规范汇合类型提供了简略易用的不可变版本,包含 Guava 本人的汇合变体,为 java 提供的不可变版本都是继承 java jdk 的接口而来,所以操作上根本无异。上面接口的实现类也都有对应的不可变版本。

接口 JDK 或者 Guava 不可变版本
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

在线演示源码:

https://github.com/main/java/…

官网文档

https://github.com/google/gua…

举荐一个 Spring Boot 基础教程及实战示例:

https://github.com/javastacks…

Guava 新汇合类型

1、Guava 引入了许多新的汇合类型,这些类型不在 Java JDK 中,但却十分有用,这些都是为了与 JDK 汇合框架欢快地共存而设计的,而不是将货色塞进 JDK 汇合形象中。

Multiset 可反复汇合

1、Guava 提供了一个新的汇合类型 Multiset,它反对增加多个雷同的元素,其中成员能够呈现不止一次。

2、Multiset 相当于 Set,区别在于 Multiset 可增加雷同的元素,它的外部应用一个 HashMap 来保护,

3、Multiset 也有本人的实现类,罕用的有 HashMultiset、LinkedHashMultiset、TreeMultiset 等,HashMultiset、TreeMultiset 是无序的,LinkedHashMultiset 是有序的,操作齐全同理 JDK 的 HashSet、TreeSet、LinkedHashSet。

在线演示源码

https://github.com/wangmaoxio…

Multimap 多重映射

1、每个有教训的 Java 程序员都曾在某个中央实现过 Map<K、List<V>> Map<K、Set<V>>,Guava 的 Multimap 框架使解决从键到多个值的映射变得容易,多重映射是将键与任意多个值关联的一种通用办法。

2、从概念上讲,有两种办法能够将多重映射视为从单个键到单个值的映射的汇合:

3、Multimap 提供了多种实现:

Multimap 实现 key 应用的是 value 应用的是
ArrayListMultimap HashMap ArrayList
HashMultimap HashMap HashSet
LinkedListMultimap * LinkedHashMap* LinkedList*
LinkedHashMultimap** LinkedHashMap LinkedHashSet
TreeMultimap TreeMap TreeSet
ImmutableListMultimap ImmutableMap ImmutableList
ImmutableSetMultimap ImmutableMap ImmutableSet

4、除了不可变的实现之外,每个实现都反对空键和值。并不是所有的实现都是作为一个 Map<K,Collection<V>> 实现的(特地是一些 Multimap 实现应用自定义哈希表来最小化开销。)

在线演示源码

https://github.com/wangmaoxio…

举荐一个 Spring Boot 基础教程及实战示例:

https://github.com/javastacks…

BiMap 双向映射

1、将值映射回键的传统办法是保护两个独立的映射,并使它们放弃同步,但这很容易产生谬误,并且当映射中曾经存在一个值

Map<String, Integer> nameToId = Maps.newHashMap();
Map<Integer, String> idToName = Maps.newHashMap();

nameToId.put("Bob", 42);
idToName.put(42, "Bob");

2、BiMap 提供了多种实现:

键值映射实现 值键映射实现 对应 BiMap
HashMap HashMap HashBiMap
ImmutableMap ImmutableMap ImmutableBiMap
EnumMap EnumMap EnumBiMap
EnumMap HashMap EnumHashBiMap

在线演示源码:

https://github.com/wangmaoxio…

Table 表构造数据

1、当试图一次在多个键上建设索引时,您将失去相似 Map<FirstName,Map<LastName,Person>> 的代码,这很难看,而且应用起来很难堪。Guava 提供了一个新的汇合类型 Table,它反对任何“row”类型和“column”类型的这个用例。

2、Table 提供了多种实现:

  • HashBasedTable:基本上是由 HashMap<R,HashMap<C,V>> 反对的。
  • TreeBasedTable:基本上是由 TreeMap<R,TreeMap<C,V>> 撑持的。
  • ImmutableTable
  • ArrayTable:要求在结构时指定行和列的残缺范畴,但在表密集时由二维数组反对以进步速度和内存效率,ArrayTable 的工作原理与其余实现有些不同

在线演示源码:

https://github.com/wangmaoxio…

ClassToInstanceMap 类型映射到实例

1、有时 key 并不是繁多的类型,而是多种类型,Guava 为此提供了 ClassToInstanceMap,key 能够是多种类型,value 是此类型的实例。

2、ClassToInstanceMap 的实现有:MutableClassToInstanceMapImmutableClassToInstanceMap 的实现。

在线演示源码:

https://github.com/wangmaoxio…

JDK 汇合辅助工具类

1、任何有 JDK 汇合框架教训的程序员都晓得并喜爱其中提供的实用程序 java.util.Collections,Guava 提供了许多实用于汇合的静态方法实用程序。

接口 属于 JDK 还是 Guava 对应 Guava API
Collection JDK Collections2
List JDK Lists
Set JDK Sets
SortedSet JDK Sets
Map JDK Maps
SortedMap JDK Maps
Queue JDK Queues
Multiset Guava Multisets
Multimap Guava Multimaps
BiMap Guava Maps
Table Guava Tables

Lists 在线演示:

https://github.com/wangmaoxio…

Sets 在线演示:

https://github.com/wangmaoxio…

JDK 根本类型辅助工具类

1、Guava 为 Java JDK 的根本类型提供了实用程序类:

根本类型 Guava 辅助工具类
byte Bytes, SignedBytes, UnsignedBytes
short Shorts
int Ints, UnsignedInteger, UnsignedInts
long Longs, UnsignedLong, UnsignedLongs
float Floats
double Doubles
char Chars
boolean Booleans

nts 在线演示源码:

https://github.com/wangmaoxio…

doubles 在线演示源码:

https://github.com/src/main/j…

booleans 在线演示源码:

https://github.com/src/main/j…

其它类型同理。

JDK 字符串辅助工具类

1、Strings 类中提供了少数几个罕用的符串实用程序。

在线演示源码:https://github.com/wangmaoxio…

2、Joiner 是连接器,用于连贯 java.lang.Iterablejava.util.Iteratorjava.lang.Object[] 中的元素。

在线演示源码:https://github.com/wangmaoxio…

3、Splitter 是分割器,用于宰割字符序列 java.lang.CharSequence

在线演示源码:https://github.com/wangmaoxio…

4、CharMatcher 字符匹配器,用于匹配字符,能够将 CharMatcher 视为代表一类特定的字符,如数字或空白。留神:CharMatcher 只解决 char 值。

在线演示源码:https://github.com/wangmaoxio…

Stopwatch 秒表

1、google 的秒表 Stopwatch 相比 Spring framewrk core 包 和 apache commons lang3 包的秒表是最方便使用的。

2、此类不是线程平安的。

/**
 * Stopwatch createStarted():创立(并启动)一个新的秒表,应用 System#nanoTime 来作为其工夫源。* Stopwatch createUnstarted():创立(但不启动)一个新的秒表,应用 System#nanoTime 来作为其工夫源。* long elapsed(TimeUnit desiredUnit):返回此秒表上显示的以后已用工夫,以所需的工夫单位示意,任何分数向下舍入
 * boolean isRunning():如果已在此秒表上调用 start()},并且自上次调用 start()以来未调用 stop(),则返回 true
 * Stopwatch reset():将此秒表的运行工夫设置为零,并将其置于进行状态。* Stopwatch start():启动秒表, 如果秒表曾经在运行,则 IllegalStateException
 * Stopwatch stop():进行秒表,未来的读取将返回到目前为止通过的固定持续时间。* tring toString():返回以后运行工夫的字符串示意模式,比方 2.588 s,106.8 ms
 */
@Test
public void testStopwatch() throws InterruptedException {SecureRandom secureRandom = new SecureRandom();
    Stopwatch stopwatch = Stopwatch.createStarted();

    int nextInt = secureRandom.nextInt(2000);
    System.out.println("工作 1 估算耗时:" + nextInt);// 工作 1 估算耗时:81
    TimeUnit.MILLISECONDS.sleep(nextInt);
    System.out.println("\t 工作 1 理论耗时:" + stopwatch.elapsed(TimeUnit.MILLISECONDS) + "(毫秒)");// 工作 1 理论耗时:563(毫秒)

    stopwatch.reset().start();
    nextInt = secureRandom.nextInt(4000);
    System.out.println("工作 2 估算耗时:" + nextInt);// 工作 2 估算耗时:1591
    TimeUnit.MILLISECONDS.sleep(nextInt);
    System.out.println("\t 工作 2 理论耗时:" + stopwatch.toString());// 工作 2 理论耗时:1.592 s

    stopwatch.reset().start();
    nextInt = secureRandom.nextInt(3000);
    System.out.println("工作 3 预计耗时:" + nextInt);// 工作 3 预计耗时:1964
    TimeUnit.MILLISECONDS.sleep(nextInt);
    System.out.println("\t 工作 3 理论耗时:" + stopwatch.stop().toString());// 工作 3 理论耗时:1.965 s
}

感觉不错,就用起来吧!

版权申明:本文为 CSDN 博主「蚩尤后嗣」的原创文章,遵循 CC 4.0 BY-SA 版权协定,转载请附上原文出处链接及本申明。原文链接:https://blog.csdn.net/wangmx1…

近期热文举荐:

1.1,000+ 道 Java 面试题及答案整顿(2022 最新版)

2. 劲爆!Java 协程要来了。。。

3.Spring Boot 2.x 教程,太全了!

4. 别再写满屏的爆爆爆炸类了,试试装璜器模式,这才是优雅的形式!!

5.《Java 开发手册(嵩山版)》最新公布,速速下载!

感觉不错,别忘了顺手点赞 + 转发哦!

正文完
 0