Java
文章平均质量分 60
Winn~
这个作者很懒,什么都没留下…
展开
-
Java语法糖写法
2、遍历list,获取每一个对象的name属性,转化为list返回。1、如果model不为空,获取他的data属性,否则返回null。原创 2024-06-19 15:57:43 · 558 阅读 · 0 评论 -
什么是JMM以及 Volatile
Java内存模型,不存在的东西,概念!约定!原创 2024-04-24 12:15:46 · 221 阅读 · 0 评论 -
函数式接口及Stream流式计算
ForkJoin 特点:工作窃取,这个里面维护的都是双端队列。原创 2024-04-24 12:02:00 · 475 阅读 · 0 评论 -
Arthas 使用方法简介
Arthas是阿里开源的一款 Java 诊断工具,可以在无需重启 JVM 的情况下,实时查看应用 load、内存、gc、线程等状态信息,还能实时查看方法调用入参、出参、方法调用耗时等。原创 2023-08-15 15:05:42 · 222 阅读 · 0 评论 -
每天100w次登陆请求, 8G 内存该如何设置JVM参数?
对象进入老年代的动态年龄判断规则 (动态晋升年龄计算阈值):Minor GC 时,Survivor 中年龄 1 到 N 的对象大小超过 Survivor 的 50% 时,则将大于等于年龄 N 的对象放入老年代。核心的优化策略是:是让短期存活的对象尽量都留在survivor里,不要进入老年代,这样在minor gc的时候这些对象都会被回收,不会进到老年代从而导致full gc。原创 2023-07-28 15:21:27 · 257 阅读 · 0 评论 -
五大限流设计方式
计数器是一种最简单限流算法,其原理就是:在一段时间间隔内,对请求进行计数,与阀值进行比较判断是否需要限流,一旦到了时间临界点,将计数器清零。这个就像你去坐车一样,车厢规定了多少个位置,满了就不让上车了,不然就是超载了。原创 2023-07-17 14:27:28 · 232 阅读 · 0 评论 -
三分钟了解 SpringBoot 的启动流程
背景:最近有位开发同学说面试被问到Spring Boot 的启动流程,以及被问到Spring Boot 的嵌入式Web容器是什么时候加载的。如何加载的。是怎么无缝切换的。这些问题,其实回答起来也是比较复杂的。我们今天就从 SpringApplication.run(EasyPaasAdminApplication.class, args);入口,逐渐向下看下执行流程。来试着回答一下前面这两个问题。原创 2023-07-11 10:57:24 · 353 阅读 · 0 评论 -
订单自动取消的11种实现方式(上)
DelayQueue是JDK提供的api,是一个延迟队列DelayQueue泛型参数得实现Delayed接口,Delayed继承了Comparable接口。getDelay方法返回这个任务还剩多久时间可以执行,小于0的时候说明可以这个延迟任务到了执行的时间了。compareTo这个是对任务排序的,保证最先到延迟时间的任务排到队列的头。原创 2023-07-07 12:06:41 · 226 阅读 · 0 评论 -
Spring Boot + Disruptor = 王炸!
Disruptor是英国外汇交易公司LMAX开发的一个高性能队列,研发的初衷是解决内存队列的延迟问题(在性能测试中发现竟然与I/O操作处于同样的数量级)。基于Disruptor 开发的系统单线程能支撑每秒 600 万订单,2010 年在 QCon 演讲后,获得了业界关注。Disruptor是一个开源的Java框架,它被设计用于在生产者—消费者(producer-consumer problem,简称PCP)问题上获得尽量高的吞吐量(TPS)和尽量低的延迟。原创 2023-07-04 10:56:41 · 144 阅读 · 0 评论 -
json字符串转复杂嵌套map
【代码】json字符串转复杂嵌套map。原创 2023-06-07 18:11:23 · 583 阅读 · 0 评论 -
CompletableFuture真香,可以替代CountDownLatch!
之前我们提到了 Future 和 Promise。Future 相当于一个占位符,代表一个操作将来的结果。一般通过 get 可以直接阻塞得到结果,或者让它异步执行然后通过 callback 回调结果。但如果回调中嵌入了回调呢?如果层次很深,就是回调地狱。Java 中的 CompletableFuture 其实就是 Promise,用来解决回调地狱问题。Promise 是为了让代码变得优美而存在的。原创 2023-06-06 11:43:00 · 373 阅读 · 0 评论 -
Java 的 8 种异步实现方式,让性能炸裂起来
*** 线程池参数配置,多个线程池实现线程池隔离,@Async注解,默认使用系统自定义线程池,可在项目中设置多个线程池,在异步调用的时候,指明需要调用的线程池名称,比如:@Async("taskName")/*** 自定义线程池//返回可用处理器的Java虚拟机的数量 12 int i = Runtime . getRuntime() . availableProcessors();System . out . println("系统最大线程数 : " + i);原创 2023-06-06 10:41:09 · 510 阅读 · 0 评论 -
聊透Spring事件机制
事件机制是Spring为企业级开发提供的神兵利器之一,它提供了一种低耦合、无侵入的解决方式。但其实Spring事件的设计其实并不复杂,它由三部分组成:事件、发布器、监听器。事件是主体,发布器负责发布事件,监听器负责处理事件。2.1定义自定义事件// 事件需要继承ApplicationEvent public class MyApplicationEvent extends ApplicationEvent {super(id);return id;} }2.2 发布自定义事件。原创 2023-01-09 18:08:15 · 811 阅读 · 0 评论 -
Java 8 Stream 之 collect() 的奇技淫巧
我今天想分享的是 收集 这part的玩法。原创 2022-12-27 10:37:37 · 114 阅读 · 0 评论 -
构建高性能内存队列:Disruptor
为了提高CPU的速度,Cpu有高速缓存Cache,该缓存最小单位为缓存行CacheLine,他是从主内存复制的Cache的最小单位,通常是64字节。一个Java的long类型是8字节,因此在一个缓存行中可以存8个long类型的变量。如果你访问一个long数组,当数组中的一个值被加载到缓存中,它会额外加载另外7个。因此你能非常快地遍历这个数组。原创 2022-12-22 14:52:28 · 692 阅读 · 0 评论 -
Java反射和new效率差距有多大?
其中JIT在程序运行期会对程序进行优化,但是反射是通过动态解析的方式,因此可能无法执行某些java虚拟机的优化。new的对象无法访问其中的私有属性,反射出来的可以通过设置setAccessible()方法来省略访问权限符。接下来,程序运行期间,可能会通过一个JIT,即时编译器将字节码文件转换为计算机认识的机器码文件。我们一般都是通过一个前端编辑器,比如javac,把java文件转为class文件。首先第一点,一般我们的Java代码是需要编译后在虚拟机里面运行的。逆向代码 例如反编译。原创 2022-12-22 11:17:57 · 439 阅读 · 0 评论 -
JDK8使用Optional避免NullPointerException
Optional真么好用,真的可以完全替代if判断吗?我想这肯定是大家使用完之后Optional之后可能会产生的想法,答案是否定的举一个最简单的栗子:例子1:如果我只想判断对象的某一个变量是否为空并且做出判断呢?只是一个很简单判断,如果用了Optional我们还需要考虑包装值,考虑代码书写,考虑方法调用,虽然只有一行,但是可读性并不好,如果别的程序员去读,我觉得肯定没有if看的明显Optional的使用:......原创 2022-07-01 12:18:27 · 154 阅读 · 0 评论 -
Lambada Java具体用法
import java.math.BigDecimal;import java.util.*;import java.util.stream.Collectors;public class Lambada { public static void main(String[] args) { List<Apple> appleList = new ArrayList<>();//存放apple对象集合 Apple apple1 =原创 2022-05-25 16:45:07 · 173 阅读 · 0 评论 -
一张图看懂Java内存模型
原创 2021-11-04 19:42:13 · 92 阅读 · 0 评论 -
一张图看懂Java垃圾回收
原创 2021-11-04 19:40:29 · 97 阅读 · 0 评论 -
一张图看懂JDK命令行工具
原创 2021-11-04 19:38:22 · 114 阅读 · 0 评论 -
堆外内存---Java的一块飞地
1、什么是堆外内存?通常,我们在Java中创建的对象都处于堆内内存(heap)中,堆内内存是由JVM所管控的Java进程内存,并且它们遵循JVM的内存管理机制,JVM会采用垃圾回收机制统一管理堆内存。与之相对的是堆外内存,存在于JVM管控之外的内存区域,Java中对堆外内存的操作,依赖于Unsafe提供的操作堆外内存的native方法。2、为什么要使用堆外内存?对垃圾回收停顿的改善。由于堆外内存是直接受操作系统管理而不是JVM,所以当我们使用堆外内存时,即可保持较小的堆内内存规模。从而在GC时减少回原创 2021-08-02 21:01:21 · 157 阅读 · 0 评论 -
Disruptor高性能队列
一、Java内置队列通过不加锁的方式实现的队列都是无界的(无法保证队列的长度在确定的范围内);而加锁的方式,可以实现有界队列。在稳定性要求特别高的系统中,为了防止生产者速度过快,导致内存溢出,只能选择有界队列;同时,为了减少Java的垃圾回收对系统性能的影响,会尽量选择array/heap格式的数据结构。这样筛选下来,符合条件的队列就只有ArrayBlockingQueue。二、ArrayBlockingQueue的问题ArrayBlockingQueue在实际使用过程中,会因为加锁和伪共享等出现严转载 2021-08-02 15:05:47 · 177 阅读 · 0 评论 -
红黑树插入原理
红黑树性质1、每个结点或是红色的,或是黑色的2、根节点是黑色的3、每个叶结点(NIL)是黑色的4、没有两个相邻的红色节点5、对于每个结点,从该结点到其叶子结点构成的所有路径上的黑结点个数相同。和AVL树的比较AVL树是一棵严格的平衡树,它所有的子树都满足二叉平衡树的定义。因此AVL树高被严格控制在XXX,因此AVL树的查找比较高效。但AVL树插入、删除结点后旋转的次数比红黑树多。红黑树用非严格的平衡来降低插入删除时旋转的次数。因此,如果你的业务中查找远远多于插入、删除,那选AVL树;如果原创 2021-03-09 14:18:10 · 269 阅读 · 0 评论 -
AQS内幕原理
原创 2021-02-23 15:50:05 · 93 阅读 · 0 评论 -
Spring工厂模式生成 Bean
设计模式里,工厂方法模式分静态工厂和实例工厂,我们分别看看 Spring 中怎么配置这两个,来个代码示例就什么都清楚了。静态工厂:<bean id="clientService" class="examples.ClientService" factory-method="createInstance"/>public class ClientService { private static ClientService clientService = new Cl原创 2020-07-27 18:16:10 · 259 阅读 · 0 评论 -
JAVA 8 函数式接口--Consumer
从JDK8开始java支持函数式编程,JDK也提供了几个常用的函数式接口,这篇主要介绍Consumer接口。源码介绍:package java.util.function;import java.util.Objects;/** * Represents an operation that accepts a single input argument and returns no * result. Unlike most other functional interfaces, {@co原创 2020-07-22 14:00:07 · 295 阅读 · 0 评论 -
springboot启动流程源代码分析
springboot 的启动入口是 SpringApplication run方法,代码如下:public ConfigurableApplicationContext run(String... args) { StopWatch stopWatch = new StopWatch(); stopWatch.start(); ConfigurableApplicationContext context = null; Collection&转载 2020-07-01 18:14:38 · 234 阅读 · 0 评论 -
Mybatis四种分页方式
数组分页查询出全部数据,然后再list中截取需要的部分。mybatis接口List<Student> queryStudentsByArray();xml配置文件 <select id="queryStudentsByArray" resultMap="studentmapper"> select * from student </select>service接口List<Student> queryStudentsByA转载 2020-05-22 16:16:17 · 290 阅读 · 0 评论 -
互联网Java面试-Java篇
1、HashMap是有序的吗?2、有没有有顺序的一个map实现类?TreeMap、LinkedHashMap3、TreeMap、LinkedHashMap是如何保证他的顺序的?哪个有序的实现比较好?你觉得有没有更高效的实现方式?4、HashMap是线程安全的吗?并发下使用的是什么Map?5、CurrentHashMap的实现原理?比如扩容、HashCode、存储方式、默认容量6、has...原创 2020-04-11 10:34:50 · 411 阅读 · 0 评论 -
Effective Java(静态工厂类、构建器)
一、静态工厂方法代替构造器1、它是一个“方法”,那么它不同于构造器,它可以随意修改方法名,这就带来第一个优点——有名称。有时一个类的构造器往往不止一个,而它们的名称都是相同的,不同的仅仅是参数,如果不同参数带来不同的含义这样对于调用方来说除了注释很难理解它们有什么不同的含义。例如BigInteger(int, int, Random)返回一个素数,但调用者很难理解API设计者所要想表达转载 2017-09-14 15:46:00 · 255 阅读 · 0 评论 -
Effective Java
1.要么为继承而设计,并提供文档说明,要么禁止使用继承,不要过度设计 面向对象编程,从一开始被洗脑难免在上手写代码时都会首先思考有没有公共方法啊,能不能把两个类抽象成一个父类再继承啊等,慎重使用继承,当要使用继承时一定要在文档注释中写明重写这个方法会给其他方法带来什么影响。书中给出建议如果类并不是为了继承而生,那么这个类应该用final修饰禁止子类化。2.接口优先于抽象类接口和抽象类的异同这是Ja转载 2017-09-25 11:55:33 · 696 阅读 · 0 评论 -
Effective Java(用函数对象表示策略、优先使用静态成员类)
1、用函数对象表示策略什么是函数对象?实际上这是在JDK8之前没有Java不支持lamda表达式,方法参数不能传递一个方法只能通过传递对象的方式“曲线救国”,例如 Arrays.sort(T[] a, Comparator<? super T> c) 方法,第一个参数传递数组,根据传入第二个自定义的比较类中的比较方法进行排序。如果能传入函数指针、Lambda表达式等,那就自然不用传递一个类。转载 2017-09-25 13:25:10 · 338 阅读 · 0 评论 -
Effective Java(鼓励使用泛型、消除非受检警告)
1、鼓励使用泛型从这条开始涉及泛型相关的点。 从JDK5开始Java新增了“泛型”新特性,例如:List,在这之前则只有List不会限定类型。 如今的JDK版本中还是可以写原生类型,但这会带来隐藏的不安全问题。如果在声明一个列表变量时不使用泛型而使用原生类型,如下:/** * * Created by zzy on 2017/9/23 */public class Main {原创 2017-09-25 14:51:22 · 505 阅读 · 0 评论 -
Effective Java(列表优先于数组)
列表优先于数组这条建议可引申出列表和数组的区别是什么,列表的内部实现。 首先数组是协变的,这里的“变”指的是数据类型,对于以下代码确实合法的:/** * * Created by zzy on 2017/8/17 */public class Main { public static void main(String[] args) throws Exception{转载 2017-09-25 15:32:24 · 305 阅读 · 0 评论 -
Effective Java(数组和泛型的实现方式、用无限制的通配符提高API的灵活性)
1、优先考虑泛型引用书中的话“一般来说,将集合声明参数化,以及使用JDK所提供的泛型和泛型方法,这些都不太困难。编写自己的泛型会比较困难一些,但是值得花些时间去学习如何编写”。 举一个简单例子来帮助我们如何正确编写泛型:/** * Created by zzy on 2017/9/24/0017. */public class Test<E> { private E[] elemen转载 2017-09-25 15:57:46 · 452 阅读 · 0 评论 -
HashMap与ConcurrentHashMap的区别
从JDK1.2起,就有了HashMap,正如前一篇文章所说,HashMap不是线程安全的,因此多线程操作时需要格外小心。在JDK1.5中,伟大的Doug Lea给我们带来了concurrent包,从此Map也有安全的了。ConcurrentHashMap具体是怎么实现线程安全的呢,肯定不可能是每个方法加synchronized,那样就转载 2017-09-09 10:59:41 · 294 阅读 · 0 评论 -
找出一堆数中最小的前K个数
描述:给定一个整数数组,让你从该数组中找出最小的K个数思路:最简洁粗暴的方法就是将该数组进行排序,然后取最前面的K个数即可。但是,本题要求的只是求出最小的k个数即可,用排序可以但显然有点浪费,比如让求10000个整数数组中的最小的10个数,用排序的话平均时间复杂度差为Nlog(N)。于是想到了,用堆来实现,但是自己实现又太麻烦,想转载 2017-09-09 11:03:26 · 600 阅读 · 0 评论 -
Java详解WebService技术
一、什么是 webserviceWebService是一种跨编程语言和跨操作系统平台的远程调用技术。所谓跨编程语言和跨操作平台,就是说服务端程序采用java编写,客户端程序则可以采用其他编程语言编写,反之亦然!跨操作系统平台则是指服务端程序和客户端程序可以在不同的操作系统上运行。谓远程调用,就是一台计算机a上的一个程序可以调用到另外一台计算机b上的一个对象的方法,譬如,转载 2017-09-15 11:44:29 · 684 阅读 · 0 评论 -
Effective Java(避免创建不必要的对象、消除过期的引用对象)
避免创建不必要的对象 此条目下书中提到“当你应该重用现有对象的时候,请不要创建新的对象”。 最为突出的例子莫过于字符串常量的创建,众所周知String字符串有两种创建方式。 String str=“hello"; String str = new String("hello");第一种String字符串的创建是在方法区(JDK转载 2017-09-18 14:36:52 · 494 阅读 · 0 评论