disgare 的博客
首页
博客
分类
标签
首页
博客
分类
标签
  • 网络

    • 计算机网络学习笔记
    • 网络安全相关
    • 域名和子网掩码
    • CORS 跨域资源共享
    • DNS、HTTP 与 HTTPS
    • Server-Sent Events (SSE)
    • WebSocket 长连接
  • 计算机基础

    • 操作系统 IO 相关知识
    • 操作系统学习笔记
    • 程序的机器级表示
    • 音频文件基础
    • 正则表达式相关概念
    • ffmpeg 的安装以及实现音频切分功能
    • Hex 和 Base64 编码
    • XML 的使用
  • 数据结构与算法

    • 动态规划算法学习笔记
    • 基于比较的排序算法的最坏情况下的最优下界为什么是O(nlogn)
    • 集合与数据结构学习笔记
    • 面试常见算法总结
    • 算法导论第二部分排序学习笔记
    • 算法导论第一部分学习笔记
  • Java

    • 对象之间的映射与转换
    • 反射学习笔记
    • 泛型相关概念
    • 关于 boolean 类型的坑
    • 如何使用 lambda 表达式实现排序
    • CompletableFuture 相关用法
    • CompletableFuture 源码浅要阅读
    • FutureTask 源码阅读
    • Guava 常用 API
      • Strings
      • 原语工具
      • Objects
      • Joiner 与 Splitter
      • CharMatcher
      • Function 以及 Predicate
      • Optional
      • Ordering
      • 新容器
        • ImmutableXXX
        • Multimap
        • BiMap
        • RangeSet 与 RangeMap
      • 缓存
    • Guava 源码阅读:Multimap 相关
    • Jackson 的各种使用
    • Java 的 Excel 相关操作
    • java 的常见性能问题分析以及出现场景
    • java 基础知识
    • JAVA 枚举的基础和原理
    • Java 图片文件上传下载处理
    • Java 序列化
    • Java 异常
    • Java 语法糖
    • Java 中关于字符串处理的常用方法
    • Java 中强、软、弱、虚引用
    • JAVA 注解小结
    • Java Http 访问框架
    • Java Stream 的使用
    • Java8 新特性
    • netty 学习笔记
    • Scanner 的各种用法
    • Servlet 学习笔记
    • String、StringBuffer、StringBuilder 学习笔记
  • JVM

    • 虚拟机执行子系统
    • JVM 自动内存管理
    • Linux 中 JVM 常用工具以及常见问题解决思路
  • Linux

    • crontab 表达式
    • Linux 常见命令
    • Linux 文件系统
  • 中间件

    • 关于定时任务原理
    • 详解 kafka
    • ES 搜索引擎
    • flink 提交流程
    • Grape-RAG
    • Hadoop 基础原理
  • 多线程

    • 多线程基础学习笔记
    • 简单了解并发集合
    • 如何手写单例
    • 深入理解 java 多线程安全
    • 生产者消费者问题
    • 线程池作用、用法以及原理
    • AQS 组件
    • ThreadLocal 原理以及使用
  • 非关系型数据库

    • Redis 集群
    • Redis 数据结构、对象与数据库
    • Redis 学习笔记
  • 关系型数据库

    • B+ 树的插入、删除和数据页分裂机制
    • MySQL 的 binglog、redolog、undolog
    • MySQL 的记录存储结构、存储引擎与 Buffer Pool
    • MySQL 基本的特性
    • MySQL 开发规范
    • MySQL 事务与锁与 MVCC
    • MySQL 数据类型、字符集相关内容
    • MySQL 索引与索引优化
    • PostgreSQL 更新数据时 HOT优化
    • PostgreSQL 相关用法
  • Python

    • Python 基础语法
    • Python 学习
  • Spring 项目

    • Lombok 的常用注解
    • maven 小结
    • MyBatis 框架的使用
    • MyBatis 重要知识点总结
    • MybatisPlus 的使用
    • Spring 框架基础使用
    • Spring 事务相关
    • Spring IOC 的原理及源码
    • Spring AOP 的使用和原理
    • SpringBoot 的原理
    • SpringBoot 基础使用
    • SpringWeb 重要知识点
  • 分布式

    • 初步了解 docker
    • 从 ACID 到 BASE 事务处理的实现
    • 访问远程服务
    • 分布式 id
    • 分布式缓存相关问题
    • 分布式集群理论和分布式事务协议
    • 分布式架构的观测
    • 分布式一致性算法
    • 负载均衡 Load Balancing
    • 关于分布式系统 RPC 中高可用功能的实现
    • 集群间数据同步的目的
    • 三高问题下的系统优化
    • 数据库分库分表
    • 详解 Spring Cloud
    • Dubbo 基础概念
    • Gossip 协议
    • nginx 学习笔记
    • Protobuf 通信协议
    • Zookeeper 基础学习
  • 架构设计

    • 参数校验与异常处理
    • 抽象方法与设计模式
    • 代码整洁之道
    • 权限系统设计
    • 用低内存处理大量数据
    • 设计模式——策略模式
    • 设计模式——过滤器模式在 Spring 中的实践
    • 状态模式
    • 统一结果返回
    • 为什么要打日志?怎么打日志?打什么日志?
    • 运维监控常见指标含义
    • 资深研发进阶
    • DDD 架构学习笔记
    • Java 常用的规则引擎
    • MVC 架构学习笔记
  • AI

    • 如何编写 Prompt
    • Agent 工程架构
    • LLM 相关内容
    • NLP 相关知识
    • vibe coding 最佳实践
    • windows 下 ollama 迁移到 D 盘
  • 开发工具

    • 如何画时序图、流程图、状态流转图
    • excel 关于 =vlookup 的用法
    • git 的学习以及使用
    • IDEA 插件推荐
    • IDEA 常用快捷键以及调试
    • Shell 脚本
    • swagger 的使用
  • 前端

    • 简单了解前端页面开发
    • 伪静态是什么
    • GitHub Pages 部署教程
    • Vercel 部署教程
    • vue-admin-template 简单使用
    • VuePress 博客搭建指南
  • 项目

    • 面试刷题网——技术方案
    • 影视资源聚合站——技术方案
  • 问题记录

    • 定时任务单线程消费 redis 中数据导致消费能力不足
    • 提供可传递的易受攻击的依赖项
    • Liteflow 在 SpringBoot 启动时无法注入组件问题 couldn‘t find chain with the id[THEN(NodeComponent)]
  • 金融

    • 股票分析——关于电力
    • 股票技术面——量价关系
    • 股票技术面——盘口
    • 股票技术面——基础
    • 基础的金融知识
    • 基金与股票
    • 韭菜的自我总结
    • 聊聊价值投资
  • 其他

    • 程序员职场工作需要注意什么
    • 创业全链路SOP:从灵光一现到系统化增长的实战指南
    • 观罗翔讲刑法随笔
    • 价格和价值
    • 立直麻将牌效益理论
    • 梅花易数学习笔记
    • 压力管理
2023-01-03
Java
目录

Guava 常用 API

# Strings

关于String的工具类,主要提供静态的工具方法。该类提供空与null对象处理,返回共同前后缀,字符串加入或者重复等操作

static boolean isNullOrEmpty(@Nullable String string):判断该字符串是否为空

static String nullToEmpty(@Nullable String string):将null字符串转换为空,如果字符串中包含东西,返回原来的字符串
static String EmptyToNull(@Nullable String string):将空字符串转换为null

static String commonPrefix(CharSequence a, CharSequence b):比较两个公共的字符串,返回两个字符串共同的前缀
static String commonSuffix(...):返回两个字符串共同的后缀

static String padStart(String string, int minLength, char padChar):在string之前加入minLength数量的padChar
static String padEnd(...):在string之后加

static String repeat(String string, int count):返回重复count次的string
1
2
3
4
5
6
7
8
9
10
11
12

# 原语工具

Guava提供大量包装工具类来处理原始类型的对象 我们以Ints为例,这个类补充java中关于Integer相关操作

static int compare(int a, int b):比大小,返回1,0或者-1
static List<Integer> asList(int... backingArray):返回List集合,可以直接用sout输出

static int max(int... array):可以比较多个元素了!
static int min(...):同上
static int maxAndMin(...)

static boolean contains(int[] array, int target):返回array数组中是否有target这个元素
1
2
3
4
5
6
7
8

除了这些还有Floats、Longs等一个8个辅助类,方法基本一致

# Objects

static boolean equals(Object a, Object b):比较两个对象,比起jdk中的优点在于它不会出现空指针异常
static int hash(Object... values):计算一群对象的hash码
MoreObjects.firstNonNull(T,T):返回第一个不为null的数据
1
2
3

# Joiner 与 Splitter

Joiner 用来将集合中各个元素用一定方式连接起来,其中大部分返回值为 Joiner 方法都返回一个新的 Joiner 对象

Splitter 则用于拆分字符串,底层使用 subString 方法

这两个的实例都是不可变的

static Joiner on(String separator):输入分隔符
final String join(Object[] parts || Iterator<?> parts || Iterable<?> parts):可以传入连续的一组数据、迭代器、集合、对象数组等,返回一个按之前方式连接的字符串(Iterable指的是一串字符,Iterator是迭代器)
Joiner skipNulls():跳过空格
Joiner useForNull(final String nullText):将空格替换为nullText,注意,不能将上面两种方法混合使用或者一个方法用多次
withKeyValueSeparator(char keyValueSeparator):当集合为Map时,键值对中插入keyValueSeparator
StringBuilder appendTo(...):join方法是该方法以及其重载的封装

static Splitter on(CharMatcher separatorMatcher || String separator || char separator):返回使用给定的字符做成的分离器
Iterable<String> split(CharSequence sequence) || List<String> splitToList(CharSequence sequence):把要分离的字符串丢进去,返回分离后的一串字符或者集合
Splitter trimResults(CharMatcher trimmer):从返回的结果中删除了trimmer,如果什么也没有,删除空格
Splitter omitEmptyStrings():去除空的元素
Splitter.MapSplitter withKeyValueSeparator(char separator):当集合为Map时,按separator分离
1
2
3
4
5
6
7
8
9
10
11
12

Splitter 使用示例,下面的 iterable 就是包含了所有被分隔的字符串,同时,onPattern 方法是指传入正则表达式,与正则相匹配的都会被分隔

        String s = "<Token><![CDATA[ENCApHxnGDNAVNY4AaSJKj4Tb5mwsEMzxhFmHVGcra996NR]]></Token>";
        Iterable<String> iterable = Splitter.onPattern("[\\[\\]]").omitEmptyStrings().split(s);
1
2

Joiner 使用示例

Joiner.on("||").skipNulls().join(iterable)
1

# CharMatcher

该类有一些静态变量,用于表示一些字符,比如CharMatcher.ANY匹配所有字符;CharMatcher.WHITESPACE匹配空白字符等

该类可以用于匹配字符

static CharMatcher anyOf(CharSequence sequence):返回值可以表示sequence中任意一个字符
or:CharMatch可以表示前一个或者后一个
is:CharMatch表示is方法内的字符
isNot、and等
String trimFrom(CharSequence sequence):从sequence中保留调用该方法的CharMatch的字段
1
2
3
4
5

# Function 以及 Predicate

这两个都可以使用函数式编程,Function 一般用来将输入转化为输出,第一个值为输入类型,第二个为输出:

        Function<Integer, String> l = new Function<Integer, String>() {
            @Nullable
            @Override
            public String apply(@Nullable Integer integer) {
                return String.valueOf(integer);
            }
        };
1
2
3
4
5
6
7

而 Predicate 用来过滤对象,筛选满足条件的对象,返回值为 boolean 类型:

        Predicate<Integer> f = new Predicate<Integer>() {
            @Override
            public boolean apply(@Nullable Integer integer) {
                return integer == null ? false : integer > 5;
            }
        };
        System.out.println(f.apply(1));
1
2
3
4
5
6
7

static <F, T> List transform(List fromList, Function<? super F, ? extends T> function):Lists中的transform方法用于集合中每个元素的转换,其中传入的第二个参数就是Function方法

以下方法,将l集合中每个元素转换为String并且后面跟一个'a'

        List<Integer> l = Lists.newArrayList(12,3,213,123,213,123,213,1);
        List<String> ll = Lists.transform(l, new Function<Integer, String>() {
            @Nullable
            @Override
            public String apply(@Nullable Integer integer) {
                return Integer.toString(integer) + "a";
            }
        });
1
2
3
4
5
6
7
8

static Optional tryFind(Iterable iterable, Predicate<? super T> predicate):Iterables类中的tryFind方法,用于找出集合中满足条件的元素,其中传入的第二个参数就是Predicate方法

# Optional

该类名为可选择的,意图就是该类可以选择为null或者指定对象,一般有两个用法: 1,知道返回值是否存在

        Optional<String> o = Optional.of("str");
        if(o.isPresent()) {
            String s = o.get();
        }
``
其中of用于构建包含传入参数的Optional对象,isPresent方法判断该对象中有无实例,get用于获取该对象包含的值

2,设置为默认值
```java
Optional.fromNullable(null).or(0):fromNullable方法里写的是可能为null的对象,or后面跟的就是默认值
1
2
3
4
5
6
7
8
9
10

# Ordering

static <C extends Comparable> Ordering<C> natural():返回使用值的自然顺序排序序列化,可以用于排序,eg:

Collections.sort(list, Ordering.natural());

Ordering<S> reverse(),返回相反顺序

Collections.sort(list, Ordering.natural().reverse());
1
2
3
4
5
6
7

# 新容器

# ImmutableXXX

不可变类容器,这些容器不可以使用add、set方法更改容器内容,会直接抛出异常;该容器线程安全,不会被调用者修改,对原容器的修改也不会影响到它

Collections.unmodifiableXXX方法是视图映射,用该方法生成的集合虽然不能更改,但是用集合更改之后这些集合也会对应的更改

# Multimap

https://blog.csdn.net/sekever/article/details/125788899

除此之外还有Multiset,也是1对n关系的集合

# BiMap

该集合的KV可以相互转换,不过不止key需要保证唯一,value也需要保证唯一

BiMap<V,K> inverse():将map的KV颠倒
V put(K key, V value):放入
V get(K key):查询
1
2
3

# RangeSet 与 RangeMap

看名字就知道这是提供区间功能方面的容器

RangeSet 提供诸如区间合并、区间分裂等功能

RangeMap 则提供区间到 value 的映射关系,但是不能进行区间合并操作

# 缓存

guava 通过接口 LoadingCache 提供了基于内存的缓存

		//用builder创建一个缓存
        LoadingCache<String, String> loadingCache = CacheBuilder.newBuilder()
        		//缓存的最大容量
                .maximumSize(300)
                //存放元素的过期时间
                .expireAfterAccess(30, TimeUnit.MINUTES)
                //缓存刷新间隔
                .refreshAfterWrite(10, TimeUnit.MINUTES)
                //如果在缓存中找不到东西的情况下,就会调用下面的load方法
                //load 方法的返回值就是该键的值
                .build(new CacheLoader<String, String>() {
                    @Override
                    public String load(String s) {
                        System.out.println("no cache");
                        return s;
                    }
                });
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

同时,guava 的缓存还提供了 removalListener 方法,该方法可以监听缓存数据被删除这个事件

该缓存是线程安全的,容量不够是使用 LRU 来删除元素,并且存放在本地内存中。允许多种缓存清除策略同时使用

1,基于存活时间的清除策略

  • expireAfterWrite 写缓存后多久过期
  • expireAfterAccess 读写缓存后多久过期
  • 存活时间策略可以单独设置或组合配置

2,基于容量的清除策略:通过 CacheBuilder.maximumSize(long) 方法可以设置 Cache 的最大容量数,当缓存数量达到或接近该最大值时,Cache 将清除掉那些最近最少使用的缓存

3,基于权重的清除策略:使用 CacheBuilder.weigher(Weigher) 指定一个权重函数,并且用 CacheBuilder.maximumWeight(long) 指定最大总重

我们可以使用 Caffeine(咖啡因),Caffeine 是 Guava 缓存的最佳升级选择,它保留了相似的 API 设计,同时提供了显著提升的性能和更现代的缓存算法。在需要磁盘溢出或企业级功能的情况下,我们还可以使用 Ehcache

内存缓存的实现其实并不难理解,guava 使用 ConcurrentHashMap 作为缓存的主要存储结构,提供线程安全的键值存储。同时还维护队列作为淘汰策略

比如当缓存达到最大大小时,使用 LRU 最近最少使用算法淘汰;使用时间队列 WriteQueue/AccessQueue 按时间排序,记录写入时间,定期清理过期条目;还可以使用 WeakReference 存储键或值,做基于引用的淘汰

#Guava
最后更新: 1/17/2026, 2:51:21 AM
FutureTask 源码阅读
Guava 源码阅读:Multimap 相关

← FutureTask 源码阅读 Guava 源码阅读:Multimap 相关→

最近更新
01
vibe coding 最佳实践
02-24
02
立直麻将牌效益理论
02-23
03
伪静态是什么
02-08
更多文章>
Theme by Vdoing
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式