![](https://img-blog.csdnimg.cn/20201014180756913.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
进阶语法与原理
文章平均质量分 71
Java进阶语法与原理
月犹依依
RPG、Flow、Loop & Zoom! Have fun every day~
一天一天成长为架构师~
展开
-
Java8 函数式去重过滤规则
文章目录需求参考实现需求根据从另一个微服务取到的用户自定义过滤规则,完成实体的去重,并返回给调用方进行后续更新操作规则定义非常灵活:不同实体类型有不同的过滤规则,且过滤规则的过滤字段数目不定、指定字段名称不定参考https://blog.csdn.net/Draymond_feng/article/details/108304165list<Bean> java8根据某几个属性去重实现 /** * 根据传入的属性列表返回去重字段的Function * * Fu原创 2021-10-09 14:23:00 · 720 阅读 · 0 评论 -
Java8 Stream distinct 去重
文章目录参考总结参考Stream distinct 去重总结1,distinct去重原理:类实现hashCode()和equals()方法2,filter根据属性过滤去重:支持单属性与多重属性去重。不足:多重属性去重必须提前已知属性个数。核心代码:// 去重predict方法public static <T> Predicate<T> distinctByKey(Function<? super T, ?> keyExtractor){原创 2021-10-09 09:59:14 · 6354 阅读 · 0 评论 -
guava限流器与redis限流器
文章目录参考原理实例参考guava rate Limite原理参考:https://www.cnblogs.com/fnlingnzb-learner/p/13086185.html原理guava的限流器,可以理解为并发包中的信号量。通过tryAcquire方式获取有限的令牌(即你要限制的qps),获取到就可以进入Controller中执行。因此结合拦截器去做限流是最合适的。将预先设置的限流策略配置在DynamicConfig(放置在配置文件中,服务启动时会解析配置文件获取到限流策略,做的更好的原创 2021-08-31 11:02:52 · 595 阅读 · 0 评论 -
JMX实现JVM运行时监控
参考文章https://juejin.cn/post/6856949531003748365https://www.liaoxuefeng.com/wiki/1252599548343744/1282385687609378作用提供了一种JVM运行时的监测和管理,比如 JVM 内存、CPU 使用率、线程数、垃圾收集情况等等。另外,还可以用作日志级别的动态修改,比如 log4j 就支持 JMX 方式动态修改线上服务的日志级别。最主要的还是被用来做各种监控工具。需要提供监控的Mbean接口以及具体实习原创 2021-08-23 13:01:49 · 223 阅读 · 0 评论 -
Java8 StringJoiner,字符串连接器
参考https://www.jianshu.com/p/538df9b1b6f9实例StringJoiner sj = new StringJoiner(","); sj.add("aaa"); sj.add("bbb"); sj.add("ccc"); String result = sj.toString(); //aaa,bbb,cccStringJoiner sj = new StringJoiner("/", "prefix原创 2021-08-09 12:07:01 · 118 阅读 · 0 评论 -
Arthas(阿尔萨斯)定位线上问题
Arthas 阿尔萨斯使用参考实际使用案例线上安装与挂载常规命令火焰图查找类、查看类具体代码查看入参、返回值线上修改代码性能监控dump参考官方文档:https://arthas.aliyun.com/doc/用户案例:https://github.com/alibaba/arthas/issues?q=label%3Auser-case一图流:https://github.com/alibaba/arthas/issues/1003实际使用案例线上安装与挂载wget https://alib原创 2021-07-20 21:57:01 · 815 阅读 · 0 评论 -
java8 List常用功能:元素去重、快速打印、按size拆分
java8 List集合元素去重参考去重快速打印参考https://segmentfault.com/a/1190000023914939去重https://juejin.cn/post/6844903842132262926方法二针对Object的时候需要指定属性,否则无法使用distinct// 1List<String> newList = new ArrayList<>(new HashSet<>(list));// 2// 使用了 Lombok原创 2021-07-14 14:24:40 · 1452 阅读 · 0 评论 -
Java8容器之间互相转化(持续更新)
Java8容器转化List & SetList 2 SetSet 2 List项目代码实例数组 List数组 to List项目代码实例List & MapList 2 MapList & ListList & Sethttps://www.baeldung.com/convert-list-to-set-and-set-to-listList 2 SetList<Integer> sourceList = Arrays.asList(0, 1, 2, 3原创 2021-07-14 12:59:58 · 204 阅读 · 0 评论 -
SpringBoot支持国际化功能
SpringBoot支持国际化功能参考具体项目参考Spring Boot、SpringMVC进行i18n国际化支持:使用MessageSourcehttps://www.jianshu.com/p/a354d3f849echttps://www.jianshu.com/p/69f5a19468db具体项目需求:数据库信息展示时要实现国际化关键核心类:LocaleMessage.java(@Component注解)关键对象:@Autowired private MessageSou原创 2021-04-17 10:44:13 · 240 阅读 · 0 评论 -
guava笔记:不止是guava(持续更新)
guava学习笔记教程Optional类API通过教程查阅,记录实践范例教程https://www.yiibai.com/guavahttps://ifeve.com/google-guava/Optional类https://www.yiibai.com/guava/guava_optional_class.html原创 2021-07-06 11:06:26 · 516 阅读 · 0 评论 -
@Mapper,mapstruct与自定义注解:实体间字段映射的优雅写法
实体间字段映射的优雅写法背景自定义注解与切面自定义注解工具类方法实现使用lombok提供的mapping注解背景实体之间进行covert操作时,如果使用函数将会出现大量的set、get方法,代码很丑陋。查阅到两种优化方案。自定义注解与切面参考:https://cloud.tencent.com/developer/article/1771768自定义注解import java.lang.annotation.*;@Target({ElementType.FIELD,ElementType.原创 2021-06-21 21:46:10 · 3943 阅读 · 0 评论 -
volatile修饰数组或者引用对象的问题
volatile修饰数组或者引用对象的问题对项目使用sonarLint扫描的时候,得到警告“Non-primitive fields should not be “volatile””,意思就是非基本字段不应该用volatile修饰。其原因是volatile修饰对象或数组时,只能保证他们的引用地址的可见性。实例测试:http://1024.notacat.cn/2020/05/性能优化-volatile修饰数组和对象/对数组元素分析其汇编代码:对数组分析其汇编代码:...原创 2021-06-21 21:33:59 · 2016 阅读 · 1 评论 -
JVM定位线上问题
线上问题定位参考核心思路定位流程图示核心排查步骤几个核心步骤的排查例子内存消耗过大,导致Full GC次数过多代码中有大量消耗CPU的操作,导致CPU过高,系统运行缓慢由于锁使用不当,导致死锁。随机出现大量线程访问接口缓慢。某个线程由于某种原因而进入WAITING状态,此时该功能整体不可用,但是无法复现环境排查部分,Linux命令详解top命令:内存:free与vm_stat命令磁盘代码排查部分,Linux命令详解火焰图其他分析工具(Arthas、JProfiler、MAT)案例参考PDF教程《Java原创 2021-06-15 12:14:18 · 1661 阅读 · 3 评论 -
UT:Jacoco统计插件、Groovy(Spock)、PowerMock、Whitebox、MockMVC、Mockito、PowerMockito、Junit介绍与使用
UTUT工程搭建PowerMock详解Whitebox详解:注入属性等MockMVC写法参考Mockito指南spy:只mock部分方法,其余方法按照真实执行Powermockito典型的静态方法、类内对象、类内对象方法mock实例UT类的注解常用注解junit 常用注解 + junit 断言详解JUnit测试控制@Test执行顺序的三种方法JUnit测试异常Jmeter测试多线程测试资料UT工程搭建实际上借助了jacoco插件有三种统计的方法:jacoco的参考链接:https://blog.cs原创 2021-04-15 19:29:31 · 2709 阅读 · 0 评论 -
Java并发包的理解
Java并发包的理解并发包相对于Synchronize的优势AQS理解AQS实现自定义锁的要点并发包同步队列底层总结并发包对wait、notify机制的优化:并发包相对于Synchronize的优势并发包相对于synchronize而言,提供了获取与释放锁的可操作性。支持非阻塞式、可中断以及超时获取锁的机制。AQS理解并发包提供的各种锁比如可重入锁、读写锁等的底层是通过AQS实现的。AQS解决了实现锁时涉及当的大量细节问题,例如获取锁的同步状态(通过volatile变量实现)、维护了与synchr原创 2021-04-09 17:15:27 · 475 阅读 · 0 评论 -
乐观锁与悲观锁
乐观锁与悲观锁常见问题总结文字总结常见问题总结git本身也是MVCC的典型例子。文字总结悲观锁悲观锁(Pessimistic Lock),顾名思义,就是很悲观,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会block直到它拿到锁。Java synchronized 就属于悲观锁的一种实现,每次线程要修改数据时都先获得锁,保证同一时刻只有一个线程能操作数据,其他线程则会被block。乐观锁乐观锁(Optimistic Lock),顾名思义,就原创 2021-04-09 17:07:22 · 61 阅读 · 0 评论 -
Java多线程学习笔记
Java多线程学习笔记JMM内存模型由CPU内存模型到JMM内存模型JMM真正的原子操作JMM内存模型竞态条件原因volatile、synchronize、CAS的原子性、可见性、有序性Volatile + CAS原理理解总结具体解释缓存一致性协议CAS + volatile实例:AtomicCAS的问题CAS + Volatile 实例:并发包的理解CAS减少线程切换原因Java锁的分类Synchronize1.6 -》 1.8锁的优化锁的实际存储结构锁的底层锁的优化实例:分段思想其他关于线程的内容使用原创 2021-04-09 17:03:37 · 332 阅读 · 0 评论 -
Java单例的五种模式
https://www.cnblogs.com/LemonFive/p/11149034.html最推荐Enum的模式:《Effective Java》第三条,P13原创 2021-04-09 16:35:18 · 79 阅读 · 0 评论 -
Java 类加载器详解
Java 类加载器什么是类的加载类的加载过程类的加载过程(生命周期)加载.class文件的方式加载验证:确保被加载的类的正确性。准备:为类的静态变量分配内存,并将其初始化为默认值/零值或常量值。解析:把类中的符号引用转换为直接引用初始化(类)使用卸载:结束生命周期类加载器JVM类加载机制类的初始化类加载方式JVM初始化步骤对象初始化方式参考资料对象的初始化对象初始化过程双亲委派模型自定义类加载器什么是类的加载类的加载指的是将类的.class文件中的二进制数据读入到方法区内,然后在堆区创建一个java.l原创 2021-04-08 11:30:28 · 3718 阅读 · 0 评论 -
PO,VO,DAO,BO,POJO,DO 之间的区别
转自:https://blog.csdn.net/xmtblog/article/details/102740105VOvalue object: 值对象。通常用于业务层之间的数据传递,由new创建,由GC回收。POpersistant object: 持久层对象。对应数据库中表的字段。 VO 和 PO 都是属性加上属性的 get 和 set 方法; 表面看没什么不同,但代表的含义是完全不同的。DTOdata transfer object: 数据传输对象。表里面有十几个字段: id,na转载 2021-03-30 16:09:00 · 155 阅读 · 0 评论 -
DumperOptions:配置文件yml读写
DumperOptions:配置文件yml读写demodemo// list版本:public static List<MyConfigYaml> readYaml(String filePath) throws Exception { ObjectMapper mapper = new ObjectMapper(new YAMLFactory()); List<MyConfigYaml> dataDirList = mapper.readVal原创 2021-03-29 20:23:05 · 1546 阅读 · 0 评论 -
AutoCloseable接口
AutoCloseable接口简介优势简介接口AutoCloseable是jdk1.7出现的新接口,存在于java.lang包中,可配合jdk1.7出现的try-with-resources新语法特性一起使用,用于自动关闭某个系统资源,如:文件,网络等。该接口只定义了一个方法:void close()throws Exception具体的使用如下代码:public class AutoCloseableStudy { public static void main(String[] args)原创 2021-03-29 20:18:33 · 379 阅读 · 0 评论 -
由BIO到NIO:NIO解决了BIO的哪些问题
三个socket:server端服务器:第一个socket:ServerSocket serverSocket = new ……第二个socket:Socket socket = serverSocket.accept()client端:Socket socket = new Socket()原创 2021-02-22 11:43:38 · 553 阅读 · 0 评论 -
Java软引用、弱引用、虚引用原理
Java软引用、弱引用、虚引用原理Reference数据结构Java层回收代码JVM层初步处理软引用process_soft_ref_reconsider处理软引用和弱引用process_soft_weak_final_refs处理虚引用process_phantom_refs总结参考链接在Java中总共有4中核心的引用类型——强引用、软引用、弱引用、虚引用。一般情况下我们往往用到强引用比较多,很少会遇到场景用到其他三种引用,所以对其原理的掌握就更加是一纸空白。此次,恰遇机会就正好研究一下这四种引用的原转载 2021-02-20 15:29:21 · 216 阅读 · 0 评论 -
活性失败、快速失败、安全失败
活性失败、快速失败、安全失败原创 2021-01-31 15:37:41 · 241 阅读 · 0 评论 -
Object.requireNonNull
Object.requireNonNullObject.requireNonNull介绍java8中的优化写法Object.requireNonNull源码Object.requireNonNull介绍Object.requireNonNull是用于参数有效性检查的API。使用Object.requireNonNull方法的好处在于可以显式的指定在哪里抛出异常。举个栗子public class Foo { private List<Bar> bars; public Foo(Lis原创 2021-01-31 15:26:15 · 4556 阅读 · 0 评论 -
(转)JVM常用分析工具JPS/JINFO/JSTACK/JSTAT/JMAP详解
JVM常用分析工具JPS/JINFO/JSTACK/JSTAT/JMAP详解转载 2020-12-14 21:40:34 · 190 阅读 · 0 评论 -
Spring JdbcTemplate
参考:Spring JdbcTemplate详解问题记录:一、jdbcTemplate.update(sql, para1……)update接口中传入的sql语句中无法动态配置表名,即如下写法会抛出异常,告知badSql错误:String DELETE_SQL = "delete from ? where FIELD_NAME < ? ";解决方案:String DELETE_SQL = "delete from TABLE_NAME where FIELD_NAME < ? "转载 2020-12-04 11:12:57 · 246 阅读 · 0 评论 -
java StopWatch来计算时间差
以前在进行时间耗时时我们通常的做法是先给出计算前后两个的时间值,然后通过详见来计算耗时时长。eg:long start = System.currentTimeMillis(); ......业务处理System.out.println("耗时:" + (System.currentTimeMillis() - start) + "ms"); 我们可以使用已有的工具类中的秒表来替代上述的使用方式,现有的秒表工具类有org.springframework.util.Sto转载 2020-11-26 10:00:39 · 268 阅读 · 0 评论 -
Java类加载器的准备和初始化
Java类加载器的准备和初始化一道面试题类加载准备初始化总结转载:Java类加载器的准备和初始化一道面试题一道面试题:给出一个包含 main 方法的类,一些输出语句,让读者判断这些语句的输出顺序。考察Java 类的初始化的顺序,主要为Java 类加载器在加载类时候的两个阶段:准备 和 初始化。题目:public class StaticTest { public static void main(String[] args) { staticFunction();转载 2021-01-12 15:30:07 · 372 阅读 · 1 评论 -
Java 资源优雅回收语法糖:TryWithResources与IO 流的Close方法
Java 资源回收TryWithResources与IO 流的Close方法转载 2021-01-09 17:38:17 · 538 阅读 · 0 评论 -
Java8接口默认方法与静态方法
Java8接口默认方法与静态方法引入原因引申,不同类型的兼容性默认方法写法与通常用法默认方法继承冲突的三条规则静态方法在Java8中,接口中可以声明默认方法和静态方法。引入原因默认方法主要优势是提供了一种扩展接口的方法,而不破坏现有代码。向接口添加新方法是二进制兼容的,这意味着如果不重新编译该类,即使不实现新的方法,现有类的实现依旧可以运行。但是如果该类有重新编译的需求,则需要扩展新的方法,否则无法编译通过。即:1.重新编译。2.使用到接口新增API。都会导致编译报错,都要求实现新增方法。注意:原创 2021-01-07 14:49:19 · 135 阅读 · 0 评论 -
Java安全编程规范总结
安全编程规范学习不可信数据定义数据校验规则1:跨信任边界传递的不可信数据使用前必须进行校验说明:收录日常工作中会涉及到的不可信数据定义文件(包括程序的配置文件)注册表网络环境变量命令行用户输入(包括命令行、界面)用户态数据(对于内核程序)进程间通信(包括管道、消息、共享内存、socket等、RPC)函数参数(对于API)全局变量(在本函数内,其他线程会修改全局变量)数据校验规则1:跨信任边界传递的不可信数据使用前必须进行校验Low Level分析中要具备信任边界这样的意识原创 2020-12-25 15:09:19 · 5671 阅读 · 0 评论 -
Java通用编程规范学习
Java编程规范学习命名注释排版变量和类型方法说明:记录内容为平常代码中常用到的且容易忽视的内容命名变量命名:\w{2,64},建议不超过31个不应使用特殊前缀或后缀。例如下面是不合适的:name_, mName, s_name 和kName包名称小写以点号隔开,包名允许有数字方法命名如图:不要使用魔鬼数字,用有意义的常量代替。SQL或日志的字符串,不应视为“魔鬼数字”,不需定义为字符串常量;不应该取NUM_FIVE = 5或NUM_5 = 5这样的魔鬼常量。避免使用否定的布尔变量名,原创 2020-12-08 14:57:54 · 4680 阅读 · 2 评论 -
Java8日期与时间API(LocalDate、LocalDateTime、Instant等)
Java8日期与时间API(LocalDate、LocalDateTime、Instant等)原创 2021-01-08 10:19:53 · 1125 阅读 · 0 评论 -
Java8 CompletableFuture详解以及API part2
CompletableFuture API2thenCombine 合并任务thenAcceptBothapplyToEither 方法acceptEither 方法runAfterEither 方法runAfterBoththenCompose 方法转载:CompletableFuture 使用详解thenCombine 合并任务thenCombine 会把 两个 CompletionStage 的任务都执行完成后,把两个任务的结果一块交给 thenCombine 来处理。public <U转载 2021-01-07 19:09:26 · 96 阅读 · 0 评论 -
Java8 CompletableFuture详解以及API part1
CompletableFuture APIrunAsync 和 supplyAsync方法计算结果完成时的回调方法thenApply 方法handle 方法thenAccept 消费处理结果thenRun 方法转载:CompletableFuture 使用详解runAsync 和 supplyAsync方法CompletableFuture 提供了四个静态方法来创建一个异步操作。public static CompletableFuture<Void> runAsync(Runnable原创 2021-01-07 19:08:25 · 269 阅读 · 1 评论 -
自定义一个类加载器
自定义一个类加载器为什么要自定义类加载器类加载机制:http://www.cnblogs.com/xrq730/p/4844915.html类加载器:http://www.cnblogs.com/xrq730/p/4845144.html这两篇文章已经详细讲解了类加载机制和类加载器,还剩最后一个问题没有讲解,就是自定义类加载器。为什么我们要自定义类加载器?因为虽然Java中给用户提供了很多类加载器,但是和实际使用比起来,功能还是匮乏。举一个例子来说吧,主流的Java Web服务器,比如Tom转载 2020-12-30 16:48:26 · 85 阅读 · 0 评论 -
JAVA从内存模型到GC
Java GC内存划分虚拟机栈StackOverflowError内存划分根据 JVM 规范,JVM 内存共分为虚拟机栈、堆、方法区、程序计数器、本地方法栈五个部分。虚拟机栈每个线程有一个私有的栈,随着线程的创建而创建。存放了局部变量表(基本数据类型和对象引用)、操作数栈、方法出口等信息。StackOverflowError栈的大小可以固定也可以动态扩展。当栈调用深度大于JVM所允许的范围,会抛出StackOverflowError的错误,不过这个深度范围不是一个恒定的值,我们通过下面这段程序可原创 2021-01-12 11:53:57 · 130 阅读 · 0 评论 -
Java8 Optional详解
Java8 Optional详解原创 2021-01-07 15:37:36 · 997 阅读 · 0 评论