Guava

Java中的不可变集合,我们换个方式理解!!!

|▌冷眼眸甩不掉的悲伤 提交于 2020-08-07 20:54:20
不可变集合例: public static final ImmutableSet<String> COLOR_NAMES = ImmutableSet.of( "red", "orange", "yellow", "green", "blue", "purple"); class Foo { Set<Bar> bars; Foo(Set<Bar> bars) { this.bars = ImmutableSet.copyOf(bars); // defensive copy! } } 为什么要使用不可变集合 不可变对象有很多优点,包括: 当对象被不可信的库调用时,不可变形式是安全的; 不可变对象被多个线程调用时,不存在竞态条件问题 不可变集合不需要考虑变化,因此可以节省时间和空间。所有不可变的集合都比它们的可变形式有更好的内存利用率(分析和测试细节); 不可变对象因为有固定不变,可以作为常量来安全使用。 创建对象的不可变拷贝是一项很好的防御性编程技巧。Guava为所有JDK标准集合类型和Guava新集合类型都提供了简单易用的不可变版本。 JDK也提供了Collections.unmodifiableXXX方法把集合包装为不可变形式,但我们认为不够好: 笨重而且累赘:不能舒适地用在所有想做防御性拷贝的场景; 不安全:要保证没人通过原集合的引用进行修改,返回的集合才是事实上不可变的;

Guava的布隆过滤器

家住魔仙堡 提交于 2020-08-06 11:39:13
https://juejin.im/post/5cc5aa7ce51d456e431adac5 BitSet原理和使用场景 https://blog.csdn.net/u012736409/article/details/53735429 BitMap 是一种很常用的数据结构,它的思想和原理是很多算法的基础,比如Bloom Filter 。 对于 BitMap 这种经典的数据结构,在 Java 语言里面,其实已经有对应实现的数据结构类 java.util.BitSet https://juejin.im/post/5c90d5fbe51d454e773a64ea 来源: oschina 链接: https://my.oschina.net/u/3847203/blog/4327329

跟我学Springboot开发后端管理系统6:缓存框架Caffeine

≡放荡痞女 提交于 2020-08-06 09:45:37
Caffeine是一个基于Java8的高性能缓存框架,号称趋于完美。Caffeine受启发于Guava Cache的API,使用API和Guava是一致的。它借鉴了Guava Cache和ConcurrentLinkedHashMap的设计经验。 性能比较 基准测试使用Java microbenchmark工具提供准确的分析。 缓存配置为 Caffeine和ConcurrentLinkedHashMap根据CPU数量确定其内部结构的大小 Guava的并发级别配置为64(默认为4,以减少内存使用)。 Ehcache v2在内部被硬编码为100个段,而v3未分段 100%的读操作 读75% 写25% 写100% 上面三种测试图来自于Caffeine官网,从图可知,Caffeine的性能玩爆其他缓存框架。 在Matrix-Web中使用Caffeine 在工程的pom文件引入caffeine的依赖,如下: <dependency> <groupId>com.github.ben-manes.caffeine</groupId> <artifactId>caffeine</artifactId> <version>${caffeine.version}</version> </dependency> 创建一个抽象类AbstractCaffineCache,该类使用范型来约束缓存的数据类型

这 6 种统计代码执行时间的方法,你知道几个?

旧巷老猫 提交于 2020-08-06 01:21:07
我们在日常开发中经常 需要测试一些代码的执行时间 ,但又 不想使用向 JMH (Java Microbenchmark Harness,Java 微基准测试套件)这么重的测试框架,所以本文就汇总了一些 Java 中比较常用的执行时间统计方法,总共包含以下 6 种,如下图所示: 方法一:System.currentTimeMillis 此方法为 Java 内置的方法,使用 System#currentTimeMillis 来统计执行的时间(统计单位:毫秒),示例代码如下: public class TimeIntervalTest { public static void main (String[] args) throws InterruptedException { // 开始时间 long stime = System.currentTimeMillis(); // 执行时间(1s) Thread.sleep( 1000 ); // 结束时间 long etime = System.currentTimeMillis(); // 计算执行时间 System.out.printf( "执行时长:%d 毫秒." , (etime - stime)); } } 以上程序的执行结果为: 执行时长:1000 毫秒. 方法二:System.nanoTime 此方法为 Java 内置的方法

Guava RateLimiter限流器使用示例

北慕城南 提交于 2020-08-04 15:02:46
Guava中的RateLimiter可以限制单进程中某个方法的速率,本文主要介绍如何使用,实现原理请参考文档: 推荐:超详细的Guava RateLimiter限流原理解析 和 推荐:RateLimiter 源码分析(Guava 和 Sentinel 实现) 。 1 基于spring-mvc的controller测试限流 完整代码可参考: https://github.com/sxpujs/spring-cloud-examples/tree/master/rest-service 1.1 增加Maven依赖: <dependency> <groupId>com.google.guava</groupId> <artifactId>guava</artifactId> <version>29.0-jre</version> </dependency> 1.2 AccessLimitService 限流Service类 @Service public class AccessLimitService { // 每秒发出5个令牌 RateLimiter rateLimiter = RateLimiter.create(5.0); /** * 尝试获取令牌 */ public boolean tryAcquire() { return rateLimiter.tryAcquire();

Guava RateLimiter限流器使用示例

点点圈 提交于 2020-07-27 05:56:18
Guava中的RateLimiter可以限制单进程中某个方法的速率,本文主要介绍如何使用,实现原理请参考文档: 推荐:超详细的Guava RateLimiter限流原理解析 和 推荐:RateLimiter 源码分析(Guava 和 Sentinel 实现) 。 1 基于spring-mvc的controller测试限流 完整代码可参考: https://github.com/sxpujs/spring-cloud-examples/tree/master/rest-service 1.1 增加Maven依赖: <dependency> <groupId>com.google.guava</groupId> <artifactId>guava</artifactId> <version>29.0-jre</version> </dependency> 1.2 AccessLimitService 限流Service类 @Service public class AccessLimitService { // 每秒发出5个令牌 RateLimiter rateLimiter = RateLimiter.create(5.0); /** * 尝试获取令牌 */ public boolean tryAcquire() { return rateLimiter.tryAcquire();

@Java知识点--ImmutableMap

橙三吉。 提交于 2020-07-27 04:11:09
immutable [ɪˈmjuːtəbl] adj. 不变的;不可变的;不能变的 Java中的Immutable对象:简单地说,如果一个对象实例不能被更改就是一个Immutable的对象,Java SDK提供的大量值对象,比如String等都是Immutable的对象。 创建ImmutableMap Map<String,Object> immutableMap = new ImmutableMap.Builder<String,Object>().build(); 在创建时放值 Map<String,Object> immutableMap = new ImmutableMap.Builder<String,Object>() .put("k1","v1") .put("k2","v2") .build(); 创建后不可变 immutableMap.put("k1","v3");//会抛出java.lang.UnsupportedOperationException ImmutableMap中key和value均不能为null,放入null值会抛出NPE ImmutableMap的使用场景 1.适合 确定性的配置, 比如根据不同的key值得到不同的请求url 写单元测试 2.不适合 key, value为未知参数, 可能有null产生的情况 3.优化大量的if else

防止数据重复提交的6种方法(超简单)!

本秂侑毒 提交于 2020-07-25 10:33:29
有位朋友,某天突然问磊哥: 在 Java 中,防止重复提交最简单的方案是什么 ? 这句话中包含了两个关键信息,第一: 防止重复提交 ;第二: 最简单 。 于是磊哥问他,是单机环境还是分布式环境? 得到的反馈是单机环境,那就简单了,于是磊哥就开始装*了。 话不多说,我们先来复现这个问题。 模拟用户场景 根据朋友的反馈,大致的场景是这样的,如下图所示: 简化的模拟代码如下(基于 Spring Boot): import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RequestMapping("/user") @RestController public class UserController { /** * 被重复请求的方法 */ @RequestMapping("/add") public String addUser(String id) { // 业务代码... System.out.println("添加用户ID:" + id); return "执行成功!"; } } 于是磊哥就想到:通过前、后端分别拦截的方式来解决数据重复提交的问题。 前端拦截 前端拦截是指通过 HTML

Guava api

╄→尐↘猪︶ㄣ 提交于 2020-07-24 14:53:01
Google Guava官方教程(中文版) https://wizardforcel.gitbooks.io/guava-tutorial/content/1.html Guava: Google Core Libraries for Java 18.0 API https://guava.dev/releases/18.0/api/docs/ 来源: oschina 链接: https://my.oschina.net/u/3847203/blog/4330004

Comparator for Optional<T>

我是研究僧i 提交于 2020-07-06 11:25:34
问题 I have abstract class OptionalComparator<T extends Comparable<T>> implements Comparator<Optional<T>> So far, so good. Following the model used by Optional itself, I figured it would be best to have a single instance of this class, and cast it when necessary (for example, to OptionalComparator<Integer> ). So I made private static final OptionalComparator<? extends Comparable<?>> ABSENT_FIRST . The trouble came when I tried to assign a value. What should the type be? new OptionalComparator