
精通Java
文章平均质量分 72
以精通Java为目的的专栏
秃秃爱健身
熟读JDK、SSM、SpringCloud生态源码,对源码有独特的见解,可以写出让大多数人看懂的源码分析文章。
展开
-
Java Switch中使用多字段的枚举类
Java Switch中使用多字段的枚举类原创 2022-09-07 18:02:21 · 3634 阅读 · 0 评论 -
Java类初始化、实例化流程你真的清楚吗
1、Java类初始化流程?2、Java类实例化流程?3、Java父类和子类在初始化、实例化、方法重写时的体现原创 2022-07-04 13:16:28 · 1728 阅读 · 4 评论 -
Java自定义Comparator实现复杂排序(什么情况返回-1?返回0?返回1?)
1、Java自定义Comparator实现复杂排序?2、Comparator接口的compare(T o1, T o2)方法中o1 和 o2对象在原集合中的顺序是什么?原创 2022-06-10 13:06:31 · 4251 阅读 · 22 评论 -
走进java比较器Comparator的底层实现原理
1、Java比较器Comparator的底层实现原理?2、JDK的快速排序算法是如何实现的?原创 2022-06-11 17:38:50 · 3628 阅读 · 26 评论 -
从GC日志与GC调优着手聊一聊JVM的常用参数
JVM常用参数原创 2022-04-19 21:47:05 · 712 阅读 · 2 评论 -
Java程序启动时-D指定参数详解
Java程序启动时-D指定参数详解原创 2022-04-06 15:08:10 · 4158 阅读 · 0 评论 -
UML图六种箭头
UML图六种箭头含义原创 2022-03-18 13:42:04 · 13680 阅读 · 0 评论 -
源码剖析Java8HashMap的resize扩容时机?扩容机制?
从两个面试题分析HashMap的resize()方法源码,分别是:HashMap什么时候扩容?HashMap扩容做了什么?含resize()方法源码分析原创 2022-02-08 20:59:47 · 2086 阅读 · 0 评论 -
《Java8源码分析》图解HashMap链表如何转红黑树(含红黑树插入节点、平衡、变色、左/右旋)
一、前言1、链表是什么时候转红黑树的?1、在putVal()方法中如果链表长度大于阈值8;会进入到treeifyBin()方法中执行链表转红黑树操作;2、HashMap中有个MIN_TREEIFY_CAPACITY变量 等于64,表示允许执行treeifyBin()链表转红黑树操作时HashMap数组的最小容量;如果数组容量容量小于64,则先执行扩容操作;聊完了链表什么时候转红黑树,下面我们来看一下链表是怎么转红黑树的?上面我们提到了treeifyBin()这个方法,链表转红黑树的逻辑也就原创 2021-11-28 19:06:22 · 5151 阅读 · 7 评论 -
图解TreeMap的红黑树平衡操作fixAfterInsertion(),接着手撕红黑树添加节点
一、前言啥也不想说,就卷、卷技术;手撕红黑树搞起。1、红黑树简介红黑树就是一种平衡的二叉查找树,其有五个特点:1.每个节点要么是红⾊,要么是⿊⾊;2. 根节点⼀定是⿊⾊的;3. 每个叶⼦节点⼀定是⿊⾊的NULL节点;4. 如果⼀个节点是红⾊,那么它的左右⼦节点⼀定都是⿊⾊的;5. 从任意⼀个节点到叶⼦节点,所经过的⿊⾊节点的数量⼀样多;2、TreeMap简介TreeMap 继承于AbstractMap ,其是一个 有序的key-value集合,内部基于 红黑树 实现;TreeM原创 2021-11-21 22:39:30 · 1315 阅读 · 1 评论 -
Java线程虚假唤醒是什么、如何避免?
一、什么是虚假唤醒?多线程环境下,有多个线程执行了wait()方法,需要其他线程执行notify()或者notifyAll()方法去唤醒它们,假如多个线程都被唤醒了,但是只有其中一部分是有用的唤醒操作,其余的唤醒都是无用功;对于不应该被唤醒的线程而言,便是虚假唤醒。比如:仓库有货了才能出库,突然仓库入库了一个货品;这时所有的线程(货车)都被唤醒,来执行出库操作;实际上只有一个线程(货车)能执行出库操作,其他线程都是虚假唤醒。下图为JAVA8中对wait()方法虚假唤醒的介绍:意思是:虚假唤醒是可能原创 2021-11-02 08:56:01 · 4826 阅读 · 4 评论 -
Java8 LocalDate、LocalTime、LocalDateTime详细使用场景+案例+常用工具类
代码:package com.saint.base.localdate;import java.time.*;import java.time.format.DateTimeFormatter;import java.time.temporal.ChronoUnit;import java.util.Date;/** * @author Saint */public class CurrentDate { public static void main(String[] arg原创 2021-09-09 08:55:34 · 1595 阅读 · 0 评论 -
架构基础--保姆级详解Java反射机制原理+应用
一、什么是反射?1)Java反射机制的核心是在程序运行时动态加载类并获取类的详细信息,从而操作类或对象的属性和方法。本质是JVM得到class对象之后,再通过class对象进行反编译,从而获取对象的各种信息。2)Java属于先编译再运行的语言,程序中对象的类型在编译期就确定下来了,而当程序在运行时可能需要动态加载某些类,这些类因为之前用不到,所以没有被加载到JVM。通过反射,可以在运行时动态地创建对象并调用其属性,不需要提前在编译期知道运行的对象是谁。二、反射的原理?...原创 2021-09-01 20:20:41 · 1104 阅读 · 0 评论 -
JDK1.8 HashMap源码解析+最全面试题
HashMap简介HashMap底层数据结构采用数组+ 链表 + 红黑树。数组是HashMap的主体,链表是为了解决Hash冲突的问题、红黑树是为了解决Hash冲突达到一定程度后影响查询效率问题。其通过散列映射来存储键值对数据,所以根据key的哈希值取模数组长度可以以O(1)的时间复杂度快速查询到键值对数据。另外,它是非线程安全的,并且因为散列hash的缘故,它是无序的。HashMap继承于AbstractMap,实现了Map、cloneable、Serializable接口;是线程不安全的;key、原创 2021-08-23 09:29:00 · 833 阅读 · 0 评论 -
面试官:单例模式静态内部类为什么线程安全?
背景最近面试一家外企,面试官问我为什么静态内部类单例模式是线程安全的?按我的理解,应该是类初始化的时候,维护了一个static boolean类型的变量,用来表示类有没有被初始化过,类初始化的时候会判断这个变量进而决定是否初始化。面试官也没说什么,但我总感觉少了点什么。于是查阅资料、记录一下。代码样例public class StaticInnerClassSingleton { private StaticInnerClassSingleton() { } public原创 2021-08-14 22:41:18 · 3084 阅读 · 9 评论 -
Java反射常见问题(一):java.lang.reflect.Field.set(null, value)的作用
1、Filed.set()方法的作用// Field将指定对象参数上此对象表示的字段设置为指定的新值void set(Object obj, Object value)2、概述今天在阅读源码的时候发现这样一行代码:field.set(null, value);真是奇了怪了,还能给null设置一个新值!然后查看Field源码注释发现:如果Field是static的,JVM会忽略obj参数;所以在这种情况下入参可以为null。最后,感叹一下,反射大法是真的强;当然鱼与熊掌不可兼得,效率就原创 2021-06-02 21:13:54 · 1529 阅读 · 0 评论 -
Method threw ‘java.lang.StackOverflowError‘ exception. Cannot evaluate 问题
一、背景今天在做项目中发现A类与B类的关系是1:n,即A类中有一个List<B> bList的成员变量,B类中有一个A a的成员变量。当执行A.getBList().add(b)方法时会报错:Method threw 'java.lang.StackOverflowError' exception. Cannot evaluate com.saint.start.gaia.A.toString()二、原因StackOverFlow问题,顾名思义是栈溢出的意思,Java虚拟机.原创 2021-05-27 19:03:11 · 14563 阅读 · 0 评论 -
lombok注解的特殊用法
1. 背景之前在Spring框架中,一直使用@AutoWired注解注入成员变量。现在使用公司封装的框架做标品开发,突然发现了@AllArgsConstructor、@RequiredArgsConstructor的特殊用法,类似于Spring中的构造函数注入。2. 场景报错:引入的成员变量未被初始化。解决措施:加上@AllArgsConstructor注解或@RequiredArgsConstructor注解。3. lombok详细介绍3.1. 构造方法相关注解@NoArgsConstr原创 2021-05-26 18:56:53 · 449 阅读 · 0 评论 -
Java启动脚本实例与解析
启动信息#source /etc/profileexport LANG=zh_CN.UTF-8nohup /usr/local/jdk18/bin/java -jar -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=./oom/ -XX:+PrintGCDateStamps -XX:+PrintGCDetails -XX:+PrintGCCause -Xloggc:./logs/gc/pie-cache-gc-%t.log -XX:+UseGCLogF原创 2021-05-25 21:13:59 · 823 阅读 · 2 评论 -
Java异步注解@Async结合自定义线程池的使用
import lombok.extern.slf4j.Slf4j;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.scheduling.annotation.EnableAsync;import org.springframework.scheduling.concurren原创 2021-05-23 22:24:30 · 635 阅读 · 0 评论 -
JDK1.8新特性--函数式接口(详解)
主要内容:1: 自定义函数式接口2: 函数式编程3: 常用函数式接口3.1 Supplier 你要作为一个供应者,自己生产数据3.2 Consumer 你要作为一个消费者,利用已经准备数据3.3 Function 输入一个或者两个不同或者相同的值转为另一个值3.4 Predicate 输入一个或者两个不同或者相同的值总是输出boolean3.5 UnaryOperator 输入一个值转换为相同值输出3.6 BinaryOperator 输入两个相同类型的值 转为相同类型的值输出主要语法原创 2020-11-08 11:27:59 · 2748 阅读 · 0 评论