问题很简单:我们应该如何通过名称或值获取枚举,并忽略不存在的值? 枚举 这是我们将在示例中使用的枚举。 挑选更复杂的枚举是为了也可以通过其他字段展示查找枚举。 ? ?...使用Map而不是迭代集合要省力得多。这会大大提高性能吗?不,但它是一个很好的习惯。在面试候选人时,你会对线性复杂度搜索算法感到满意吗?此时,你不应该让这样的代码审查通过。 ? ? ?...现在通过一些额外的样板,只要我们有很好的散列函数的话,我们就可以进行更有效的查找。稍微更冗长,但如果有办法减少样板的话,这将是极好的。 ? ? ?...Guava Enums.getIfPresent(推荐) 这是一个常见的用例,我们在Google的朋友为此提供了一个非常干净且无需样板的解决方案。...通过字段索引的静态Map(较优) 与上述相同的方法,但是在显示名称上而不是枚举名称上进行索引。 ? ? ?
必要的时候也要考虑缓存的回收策略。 今天说的 Guava Cache 是google guava中的一个内存缓存模块,用于将数据缓存到JVM内存中。...基于引用的清除(Reference-based Eviction) 在构建Cache实例过程中,通过设置使用弱引用的键、或弱引用的值、或软引用的值,从而使JVM在GC时顺带实现缓存的清除,不过一般不轻易使用这个特性...考虑到使用软引用的性能影响,我们通常建议使用更有性能预测性的缓存大小限定(见上文,基于容量回收)。使用软引用值的缓存同样用==而不是equals比较值。...自动加载 上面我们说过使用get方法的时候如果key不存在你可以使用指定方法去加载这个key。在Cache构建的时候通过指定CacheLoder的方式。...当加载完数据后,任何线程中的get方法都会获取到key对应的值。 统计信息 可以对Cache的命中率、加载数据时间等信息进行统计。
在本地缓存方面,SpringFramework5.0(SpringBoot2.0)放弃了Google的GuavaCache,选择了「Caffeine」(Drop Guava caching - superseded...那么Caffeine有什么魔力,能干掉Google的Guava呢? 压力测试 我们用数据说话。...我们在时间T访问并获取到值v1,在T+5秒的时候,数据库中这个值已经更新为v2。但是在T+12秒,即已经过了10秒我们通过Caffeine从本地缓存中获取到的「还是v1」,并不是v2。...内存占用对比 Caffeine可以根据使用情况延迟初始化,或者动态调整它内部数据结构。这样能减少对内存的占用。如下图所示,使用了gradle memoryOverhead对内存占用进行了压测。...如图中数据库和搜索场景的结果展示,通过考虑就近程度和频率能大大提升LRU的表现。一些高级的策略,像ARC,LIRS和W-TinyLFU都提供了接近最理想的命中率。
要解决并发修改异常,可以使用迭代器进行遍历。...子类之间直接转换会抛出类型转换异常的错误,解决这类问题可以先进行类型关系判断,通过getClass().getName()来得到具体类型,再通过instanceof进行判断是否含有继承关系,如果有继承关系再进行类型转换...,直接在控制台输出异常信息 第二种方式可以使用for循环遍历的方式,遍历所有的枚举值,查看是否有符合条件的枚举值,但是for循环效率较低 第三种方式可以使用Guava,首先在pom.xml文件中导入guava...依赖 com.google.guava guava 使用过之后要进行关闭或者释放,如果没有释放怎会导致资源泄露的问题 try finally 关闭资源的问题 新增一个测试类HandlerResoucesTest,使用try-catch-finally
在最近的项目中,有一位新人同事使用了 Guava Cache 来对一个 RPC 接口的响应进行缓存,我在 review 其代码时恰好发现了一个不太合理的写法,遂有此文。...先简单介绍一下 Guava Cache,它是 Google 封装的基础工具包 guava 中的一个内存缓存模块,它主要提供了以下能力: 封装了缓存与数据源交互的流程,使得开发更关注于业务操作 提供线程安全的存取操作...(可以类比 ConcurrentHashMap) 提供常用的缓存过期策略,缓存刷新策略 提供缓存命中率的监控 基础使用 使用一个示例介绍 Guava Cache 的基础使用方法 -- 缓存大小写转换的返回值...,在 load 方法中设置了一个空值,后续通过手动 put + get 的方式使用缓存,这种习惯更像是在操作一个 HashMap,但并不推荐在 Cache 中使用。...缓存刷新 缓存刷新的常用于使用数据源的新值覆盖缓存旧值,Guava Cache 提供了两类刷新机制:手动刷新和定时刷新。
guava cache的缓存结构 常用的guava cache缓存 根据上图中的缓存框架,我们常用的一些缓存实例有:LocalManualCache和LocalLoadingCache,两者唯一的区别就是...,即使用前自己手动的加载完成数据,当然也可以调用特殊的方法,当调用时,数据不存在后再调用加载方法。...get时,key存在,缓存的value不为null,返回非null值。 可以通过get的value==null,来判断加载时机。...LocalCache代码,LocalCache是根据get的value==null来判断加载时机,因此通过load加载时,不允许返回null值,因此需要特殊判断load的返回值,建议使用Optional...进行包装。
说起Guava Cache,很多人都不会陌生,它是Google Guava工具包中的一个非常方便易用的本地化缓存实现,基于LRU算法实现,支持多种缓存过期策略。...由于Guava的大量使用,Guava Cache也得到了大量的应用。但是,Guava Cache的性能一定是最好的吗?也许,曾经它的性能是非常不错的。正所谓长江后浪推前浪,前浪被拍在沙滩上。...我们就来介绍一个比Guava Cache性能更高的缓存框架:Caffeine。...对比结论 可以从数据看出来Caffeine的性能都比Guava要好。...然后Caffeine的API的操作功能和Guava是基本保持一致的,并且 Caffeine为了兼容之前是Guava的用户,做了一个Guava的Adapter给大家使用也是十分的贴心。
1 Guava 1.1) 基础使用 @Slf4j public class GuavaCache { private static Cache cache =...Caffeine基于java8的高性能,接近最优的缓存库。 Caffeine提供的内存缓存使用参考Google guava的API。...Caffeine是基于Google guava和 ConcurrentLinkedHashMap的设计经验上改进的成果。...Caffeine是Spring 5默认支持的Cache,可见Spring对它的看重,Spring抛弃Guava转向了Caffeine。...通过使用Caffeine.recordStats(), 可以转化成一个统计的集合.
全路径名 com.google.common.base Class Enums 简介 提供了几个操作Enum实例的方法 方法 valueOfFunction 文档中提到,但guava 24.1 jre...中未发现这个方法 返回一个Function接口,将Enum名映射到关联的Enum实例。...> enumValue): 返回变量名为enumValue变量值的Field getIfPresent 源码中发现 public static > Optional getIfPresent(Class enumClass, String value) 使用Enum.valueOf()来返回指定名称和class的Enum的Optional,如果不存在则返回...(TestEnum.class, "D").or(TestEnum.A)); // D System.out.println(Enums.getIfPresent(TestEnum.class
--- 通过《重新认识下JVM级别的本地缓存框架Guava Cache——优秀从何而来》一文,我们知道了Guava Cache作为JVM级别的本地缓存组件的诸多暖心特性,也一步步地学习了在项目中集成并使用...为了解决这个问题,Guava Cache中提供了一种相对精准的控制策略,即基于权重的总量控制,根据一定的规则,计算出每条value记录所占的权重值,然后以权重值进行总量的计算。...图片 使用约束说明 在实际使用中,这几个参数之间有一定的使用约束,需要特别注意一下: 如果没有指定weight实现逻辑,则使用maximumSize来限制最大容量,按照容器中缓存记录的条数进行限制;这种情况下...如果指定了weight实现逻辑,则必须使用 maximumWeight 来限制最大容量,按照容器中每条缓存记录的weight值累加后的总weight值进行限制。...这种实际使用的较少,此处不多展开。 图片 主动淘汰 上述通过总体容量限制或者通过过期时间约束来执行的缓存数据清理操作,是属于一种被动触发的机制。
说起Guava Cache,很多人都不会陌生,它是Google Guava工具包中的一个非常方便易用的本地化缓存实现,基于LRU算法实现,支持多种缓存过期策略。...比较 Google Guava工具包中的一个非常方便易用的本地化缓存实现,基于LRU算法实现,支持多种缓存过期策略。...,这里是同步进行的,可以通过buildAsync方法进行异步构建。...我们可以通过cache.getIfPresent(key) 方法来获取一个key的值,通过cache.put(key, value)方法显示的将数控放入缓存,但是这样子会覆盖缓原来key的数据。...这样可以避免与其他线程的写入竞争,这也是为什么使用 get 优于 getIfPresent 的原因。
("word","Hello Guava Cache"); System.out.println(cache.getIfPresent("word")); } 看到Cache非常类似于JDK中的...如果缓存中不包含key对应的记录,Guava会启动一个线程执行Callable对象中的call方法,call方法的返回值会作为key对应的值被存储到缓存中,并且被get方法返回。..." + cache.getIfPresent("key1")); System.out.println("第二个值:" + cache.getIfPresent("key2")); System.out.println...("第三个值:" + cache.getIfPresent("key3")); 设置过期时间 在构建Cache对象时,可以通过CacheBuilder类的expireAfterAccess和expireAfterWrite...}); 与构建Cache类型的对象类似,LoadingCache类型的对象也是通过CacheBuilder进行构建,不同的是,在调用CacheBuilder的build方法时,必须传递一个CacheLoader
com.google.common.escape:提供了对字符串内容中特殊字符进行替换的框架,并包括了Xml和Html的两个实现。...; // 使用Guava的Function来进行数据转换 Function stringToLength = input -> input.length(); int...// 使用Guava的Optional来处理可能为空的值 Optional optionalValue = Optional.fromNullable(null); String value...= optionalValue.or("Default"); // 如果值为空,使用默认值 Guava的函数式编程实践可以帮助开发者更容易地处理数据和异常情况,使代码更加健壮和易于维护。...无论是在开发中处理集合、缓存、多线程问题,还是在进行字符串处理或函数式编程,Guava都提供了强大的工具来简化任务,提高开发效率。通过学习Guava,你将能够更好地应对Java开发中的各种挑战。
(本质上本地缓存是使用Map实现的,差别在于实现方式和性能) ,此篇就使用guava实现本地缓存展开叙述: 一、新建maven项目&添加依赖 新建一个通用的maven工程,并添加一下guava依赖:... com.google.guava guava 18.0</version...; import com.google.common.cache.CacheBuilder; /** * guava本地缓存工具类 * * @author Typhoon * @date 2017...缓存中的get方法是不允许key不存在的,不存在时候会抛异常出来,但是我们的实际业务场景中是允许key不存在的,所以我们使用getIfpresent方法,允许key不存在 这段代码是对get方法的重载,...总结 在有些场景下我们使用本地缓存更加方便和轻量级,但是任何一种事物都有其双面性,我们可以分析出本地缓存的优缺点: 优点:1)使用方便 2)更轻量级 缺点:1)不适合大中型项目中的高并发场景,如果强行使用
一、声明和使用基本枚举 枚举可以被认为是一个密封类的语法糖,该类在编译时仅实例化了若干次,以定义一组常量。...保证返回数组中的值按照声明顺序: Season[] seasons = Season.values(); 注意:这个方法每次调用时都会分配一个新的值数组。...七、枚举的多态性 当一个方法需要接受一组“可扩展”的枚举值时,可以像在普通类上应用多态性一样,创建一个接口,在枚举应使用的任何地方都可以使用这个接口: public interface ExtensibleEnum...这可能很有用,例如,在api中存在一个默认的(不可修改的)枚举,并且这些api的用户希望用更多的值“扩展”枚举。...Guava库提供了一个helper方法Enums.getIfPresent(),它返回一个可选的 Guava,以消除显式异常处理: DayOfWeek defaultDay = DayOfWeek.SUNDAY
简介 Caffeine是一款基于jdk8实现的缓存工具,在设计上参考了google的Guava cach组件,可以理解为是一个GuavaCache的加强版本,性能也是在其基础上有了提升。...二、使用 因为是基于Guava cache实现的,因此二者的API大体是类似的,使用Guava cache的开发者可以很快熟练使用Caffeine cache。...批量查找可以使用getAllPresent()方法或者带填充默认值的getAll()方法。...批量查找可以使用getAll()方法。默认情况下,getAll()将会对缓存中没有值的key分别调用CacheLoader.load方法来构建缓存的值(build中的表达式)。...,所有缓存的读写可以通过CacheWriter进行传递,比如我们可以通过CacheWriter的实现方法进行第三方外部资源的操作。
本地缓存作为单机服务最先触及的缓存层,选择合适的方案对于提升应用性能和响应速度至关重要,其主要的实现方式有以下几种: Ehcache Ehcache是一个纯Java的缓存库,易于使用,提供了丰富的缓存策略...,如LRU(最近最少使用)、FIFO(先进先出)等。...Guava Cache Guava是Google开发的Java核心库,其中的缓存模块简单易用,支持自定义缓存驱逐策略,如大小限制、时间限制等。...Caffeine Caffeine相比Guava,它提供了更好的内存管理机制和更快的读写性能,可以看做是guava的增强版。...> ifPresent = CAFFEINE.getIfPresent(key); if (Objects.isNull(ifPresent)) { return
摘要: 学习Google内部使用的工具包Guava,在Java项目中轻松地增加缓存,提高程序获取数据的效率。 一、什么是缓存?...从内存中获取数据时间明显小于通过IO获取数据,这个数据结构就是缓存的实现。 这里引入一个概念,缓存命中率:从缓存中获取到数据的次数/全部查询次数,命中率越高说明这个缓存的效率好。...也可以采用定时刷新的方式更新数据。 还可以设置移除监听器对被删除的数据进行一些操作。...刷新:主动刷新方法LoadingCache.referesh(K) 信息统计:CacheBuilder.recordStats() 开启Guava Cache的统计功能。...www.cnblogs.com/peida/... https://github.com/tiantianga... http://www.blogjava.net/DLevi... http://ifeve.com/google-guava