caffeine
Caffeine本地缓存详解1 概述简介Caffeine是一种高性能的缓存库,是基于Java 8的最佳(最优)缓存框架。 基于Google的Guava Cache,Caffeine提供一个性能卓越的本地缓存(local cache) 实现, 也是SpringBoot内置的本地缓存实现。(Caffeine性能是Guava Cache的6倍) Caffeine提供了灵活的结构来创建缓存,并且有以下特性: 自动加载条目到缓存中,可选异步方式 可以基于大小剔除 可以设置过期时间,时间可以从上次访问或上次写入开始计算 异步刷新 keys自动包装在弱引用中 values自动包装在弱引用或软引用中 条目剔除通知 缓存访问统计 依赖引入Maven依赖 123456<dependency> <groupId>com.github.ben-manes.caffeine</groupId> <artifactId>caffeine</artifactId> <version>2.9.2</version...
02 Java的三种变量
概述三种变量 VM options是JVM变量 Programp arguments是程序变量 Environment variables是环境变量 JVM变量是什么 所谓的JVM变量和平时见到的不太一样,比如-Xmx1024m这样的,这里说的JVM变量更确切的说是java命令中的一个选项,我们前边在idea中进行配置的时候,使用的也是“-D”这个选项,在服务启动的时候会设置一个key-value的属性。并且从上面的注释也可以看到对“-D”的解释是“设置系统属性” 怎么用 需要注意一点这里的配置除了JVM已经定义好的,其他的自定义配置请使用前面说到的“-D”的形式,多个配置使用空格隔开 JVM启动参数 获取JVM变量Syst...
03 javax postconstrct
1、@PostConstruct注解好多人以为是Spring提供的。其实是Java自己的注解。Java中该注解的说明:@PostConstruct该注解被用来修饰一个非静态的void()方法。被@PostConstruct修饰的方法会在服务器加载Servlet的时候运行,并且只会被服务器执行一次。PostConstruct在构造函数之后执行,init()方法之前执行。2、通常我们会是在Spring框架中使用到@PostConstruct注解 该注解的方法在整个Bean初始化中的执行顺序:Constructor(构造方法) -> @Autowired(依赖注入)/@Value -> @PostConstruct(注释的方法)3、应用:在静态方法中调用依赖注入的Bean中的方法
02 AOP详解
1 概述概念AOP(Aspect Oriented Programming)面向切面思想,是Spring的三大核心思想之一(AOP-面向切面、IOC-控制反转、DI-依赖注入)。 为什么AOP 有多少个业务操作,就要写多少重复的校验和日志记录代码,这显然是无法接受的。当然用面向对象的思想,可以把这些重复的代码抽离出来,写成公共方法,就是下面这样: 代码冗余和可维护性的问题得到了解决,但每个业务方法中依然要依次手动调用这些公共方法,也是略显繁琐。 有没有更好的方式呢?有的,那就是AOP,AOP将权限校验、日志记录等非业务代码完全提取出来,与业务代码分离,并寻找节点切入业务代码中 AOP体系结构AOP要做的三件事: 在哪里切入,也就是权限校验等非业务操作在哪些业务代码中执行;(切入点) 什么时候切入,是业务代码执行前还是执行后;(通知) 切入后做什么事,比如做权限校验、日志记录等。 Pointcut:切点,决定处理如权限校验、日志记录等在何处切入业务代码中(即织入切面)。切点分为execution方式和annotation方式。前者可以用路径表达式指定哪些类织入切面,后者可...
04 Queue
Queue0 Queue介绍主要方法Queue队列,在 JDK 中有两种不同类型的集合实现:单向队列(AbstractQueue) 和 双端队列(Deque) Queue 中提供了两套增加、删除元素的 API,当插入或删除元素失败时,会有两种不同的失败处理策略。 方法及失败策略 插入方法 删除方法 查找方法 抛出异常 add() remove() get() 返回失败默认值 offer() poll() peek() 选取哪种方法的决定因素:插入和删除元素失败时,希望抛出异常还是返回布尔值 add() 和 offer() 对比: 在队列长度大小确定的场景下,队列放满元素后,添加下一个元素时,add() 会抛出 IllegalStateException异常,而 offer() 会返回 false 。 但是它们两个方法在插入某些不合法的元素时都会抛出三个相同的异常。 remove() 和 poll() 对比: 在队列为空的场景下, remove() 会抛出 NoSuchElementException异常,而 poll() 则返回 null 。 get()和...
05 Set
0 Set 接口Set接口Set接口继承了Collection接口,是一个不包括重复元素的集合,更确切地说,Set 中任意两个元素不会出现 o1.equals(o2),而且 Set 至多只能存储一个 NULL 值元素,Set 集合的组成部分可以用下面这张图概括: 在 Set 集合体系中,我们需要着重关注两点: 存入可变元素时,必须非常小心,因为任意时候元素状态的改变都有可能使得 Set 内部出现两个相等的元素,即 o1.equals(o2) = true,所以一般不要更改存入 Set 中的元素,否则将会破坏了 equals() 的作用! Set 的最大作用就是判重,在项目中最大的作用也是判重! 接下来我们去看它的实现类和子类: AbstractSet 和 SortedSet AbstractSet 抽象类AbstractSet 是一个实现 Set 的一个抽象类,定义在这里可以将所有具体 Set 集合的相同行为在这里实现,避免子类包含大量的重复代码 所有的 Set 也应该要有相同的 hashCode() 和 equals() 方法,所以使用抽象类把该方法重写后,子类无需关...
06 Map
0 Map 集合体系详解Map接口是由<key, value>组成的集合,由key映射到唯一的value,所以Map不能包含重复的key,每个键至多映射一个值。下图是整个 Map 集合体系的主要组成部分,我将会按照日常使用频率从高到低一一讲解。 不得不提的是 Map 的设计理念:定位元素的时间复杂度优化到 O(1) Map 体系下主要分为 AbstractMap 和 SortedMap两类集合 AbstractMap是对 Map 接口的扩展,它定义了普通的 Map 集合具有的通用行为,可以避免子类重复编写大量相同的代码,子类继承 AbstractMap 后可以重写它的方法,实现额外的逻辑,对外提供更多的功能。 SortedMap 定义了该类 Map 具有 排序行为,同时它在内部定义好有关排序的抽象方法,当子类实现它时,必须重写所有方法,对外提供排序功能。 1 HashMap底层原理HashMap 是一个最通用的利用哈希表存储元素的集合,将元素放入 HashMap 时,将key的哈希值转换为数组的索引下标确定存放位置,查找时,根据key的哈希地址转换成数组的索引下标确...
08 Comparable&Comparator
Comparable概述Java Comparable接口,用于根据对象的natural order对array或对象list进行natural order 。 元素的自然排序是通过在对象中实现其compareTo()方法来实现的。 1234public interface Comparable<T> { public int compareTo(T o);} 使用123456789101112131415import java.time.LocalDate; public class Employee implements Comparable<Employee> { private Long id; private String name; private LocalDate dob; @Override public int compareTo(Employee o) { return this.getId().compareTo( o.g...
07 Iterable&Ieterator
Iterator Iterable ListIterator1 Iterator所有Java集合类都提供iterator()方法,该方法返回Iterator的实例以遍历该集合中的元素。 12345public interface Iterator<E> { boolean hasNext(); E next(); void remove();} 提供的API接口含义如下: hasNext():判断集合中是否存在下一个对象 next():返回集合中的下一个对象,并将访问指针移动一位 remove():删除集合中调用next()方法返回的对象.每次调用next()只能调用一次此方法。 在早期,遍历集合的方式只有一种,通过Iterator迭代器操作 12345678910List<Integer> list = new ArrayList<>();list.add(1);list.add(2);list.add(3);Iterator iter = list.iterator();while (iter....
09 Sort
1 数组排序Arrays.sortJava程序使用Arrays.sort()方法升序排序 12345678910111213141516import java.util.Arrays; public class JavaSortExample { public static void main(String[] args) { //Unsorted array Integer[] numbers = new Integer[] { 15, 11, 9, 55, 47, 18, 520, 1123, 366, 420 }; //Sort the array Arrays.sort(numbers); //Print array to confirm System.out.println(Arrays.toString(numbers)); }} 逆序1234567Integer...














