自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(73)
  • 收藏
  • 关注

原创 从源码看 ReentrantLock:公平锁 vs 非公平锁 + tryAcquire 深度解析

摘要:ReentrantLock是Java提供的一种可重入独占锁,相比synchronized提供更强大的锁控制能力。它支持可重入、公平/非公平锁、可中断、可限时获取锁以及条件变量等特性。核心实现基于AQS框架,通过Sync、NonfairSync和FairSync三个内部类分别处理通用逻辑、非公平和公平锁获取。公平锁通过hasQueuedPredecessors()确保先到先得,而非公平锁直接CAS抢占。使用时应遵循lock()/unlock()配对原则,unlock操作需放在finally块中以避免死锁

2025-12-27 16:47:53 431

原创 Spring 事务全解:一次读懂 @Transactional 的前世今生

Spring事务管理通过编程式和声明式两种方式实现,后者基于AOP代理机制,使用@Transactional注解简化配置。事务的核心是确保ACID特性,涉及传播机制(如REQUIRED、REQUIRES_NEW)和隔离级别(如READ_COMMITTED、REPEATABLE_READ)。事务失效常见原因包括非public方法、自调用、异常处理不当或数据库不支持等。理解这些机制有助于避免事务失效问题。

2025-10-21 19:45:19 1363

原创 Spring IoC 超清晰讲解:Bean、容器、依赖注入全流程

Spring IOC 核心概念解析 IoC(控制反转)是一种设计模式,将对象的创建和管理权从开发者转移到Spring容器。其核心是一个IoC容器(如ApplicationContext),负责管理Bean的整个生命周期。容器通过BeanDefinition(元数据)创建Bean,并处理依赖注入(DI)关系,包括构造器、Setter和字段注入三种方式。依赖查找遵循类型优先、名称匹配、@Qualifier指定和@Primary标记的规则。IoC通过解耦对象创建与使用、统一管理和增强可扩展性等优势,简化了开发流程

2025-10-04 11:27:00 698

原创 Spring Bean 到底是什么?5 分钟搞懂 Bean 与 BeanDefinition 的区别

本文系统解析了Spring框架中Bean的核心概念。首先阐明SpringBean是由IoC容器管理的对象,可通过多种方式定义;其次介绍BeanDefinition作为Bean的配置元信息,与Bean是"蓝图与实例"的关系;然后区分"声明为Bean"(将类交由容器托管)和"注入Bean"(使用已托管的Bean)这两个关键操作;最后通过代码示例展示二者的实际应用。全文揭示了Spring容器作为"工厂"管理Bean生命周期的核心机制,

2025-10-02 11:54:55 595

原创 贪心秒杀!一道题让你爱上区间切割

摘要:本文详细解析了力扣763题“划分字母区间”的解题思路。通过记录每个字母的最后出现位置,采用贪心算法动态确定片段的边界,确保同一字母只出现在一个片段中。文章包含示例演示、图解说明和Java代码实现,时间复杂度为O(n),空间复杂度O(1)。核心思想是扫描字符串时不断更新当前片段的最远边界,并在边界处切分片段,最终返回各片段长度的列表。

2025-08-10 20:47:55 836

原创 Redis 数据结构底层原理图解:搞懂这篇,面试稳了

Redis数据类型操作及底层实现摘要 String类型提供SET、GET等基本键值操作,底层采用三种编码:int(整数存储)、embstr(短字符串连续存储)、raw(长字符串分开存储)。List类型支持双向操作,底层由QuickList实现(结合链表和压缩块优点),替代了早期的LinkedList和ZipList。Set类型提供集合运算,底层根据元素类型选择intset(整数集合)或hashtable实现。各数据类型针对不同场景优化了内存和性能,如String的embstr编码适合短字符串,QuickLi

2025-08-08 10:53:48 1244

原创 【链表专题】面试官:请写出这道链表翻转题的递归与迭代两种解法!

文章摘要 本文详细解析了LeetCode 25题「K个一组翻转链表」的两种解法(递归+迭代)。递归法通过分段翻转与递归拼接实现,代码简洁但存在递归栈开销;迭代法借助dummy节点和指针操作,空间效率更优。两种方法均基于核心步骤:定位k节点段、翻转区间、处理剩余节点,并附有复杂度分析(时间O(n),空间递归O(n/k)/迭代O(1))。文章对比了递归与迭代的优劣(简洁性/空间/性能),强调链表翻转的通用技巧,适合面试准备与算法学习。 关键词:链表翻转、递归、迭代、LeetCode、算法题解

2025-08-03 10:39:02 505

原创 「你以为对象没用了就消失了?」一文读懂 Java 垃圾收集器内幕!

参数作用-Xms-Xmx初始/最大堆大小新生代 : 老年代 = 1:2大对象阈值(单位:字节)启用 G1 收集器启用 ZGCG1 最大停顿时间期望「Eden 生,Survivor 挤,老年代养老,Full GC 清场,ZGC 保命!

2025-08-02 21:34:32 899

原创 【技巧专题】刷题必备!下一个排列最通俗讲解:只用 O(n) 时间就搞定

本文详细解析了LeetCode 31题"下一个排列"的解法。题目要求原地修改数组,找出字典序中的下一个更大排列。核心思路分为三步:1)从后往前找到第一个降序对nums[i]<nums[i+1];2)从后往前找到第一个大于nums[i]的数并交换;3)反转nums[i+1:]部分。通过实例[1,2,3,6,5,4]演示了具体操作过程,最终得到[1,2,4,3,5,6]。对于已是最大排列的情况(如[3,2,1]),直接反转整个数组即可。算法时间复杂度O(n),空间复杂度O(1)。该解法

2025-08-02 11:34:39 523

原创 【回溯专题】我用这段 Java 代码,轻松搞定了 N 皇后,逻辑太优雅了!

本文详细解析了LeetCode 51题"N皇后"问题的解法。该问题要求在n×n棋盘上放置n个互不攻击的皇后,采用回溯算法逐行尝试放置。解题关键在于使用三个集合记录列、主对角线和副对角线的占用状态,通过递归实现回溯。文章提供了完整的Java代码实现,包含详细注释,并给出了n=4时的示例输出。分析了算法的时间复杂度为O(n!),空间复杂度为O(n)。最后指出该题是回溯算法的经典案例,体现了"选择→递归→撤销"的核心思想,并建议了进一步优化方向。

2025-08-01 23:39:08 519

原创 线程基础太杂?这份 Java 多线程总结帮你梳理清楚

本文介绍了Java并发编程中的线程基础,包括线程状态、构造方式、中断机制和通信方法。线程状态包含NEW、RUNNABLE、BLOCKED等6种;构造方式有继承Thread类、实现Runnable接口和使用Callable+FutureTask三种;线程中断通过interrupt()方法实现;线程通信则借助wait()/notify()和join()等方法完成。这些知识点是Java多线程编程的核心基础,为构建高效并发程序提供了必要支持。

2025-08-01 18:19:08 946

原创 【链表专题】字节高频面试题:这道链表题你会用堆写吗?

本文探讨了合并K个升序链表的三种解法:暴力排序法(O(N logN))、分治两两合并法(O(N logK))和最优的最小堆法(O(N logK))。重点推荐使用最小堆(优先队列)策略,通过每次取出所有链表头中的最小值构建新链表,结合Java代码实现详细解析了算法流程。三种方法在时间/空间复杂度上对比鲜明,最小堆法在保持O(K)空间的同时实现了最优时间复杂度,是处理海量数据合并的高效方案。文章通过清晰的步骤拆解和复杂度分析,帮助读者深入理解多路归并问题的优化思路。

2025-07-31 20:49:12 610

原创 “面试官:ConcurrentHashMap 为啥能并发?你答得出我就 hire!”

本文介绍了 Java 中几种主要的并发安全容器及其实现原理。JDK 1.7 的 ConcurrentHashMap 采用分段锁机制,将哈希表分为多个 Segment 来提高并发性能;而 JDK 1.8 则改用更细粒度的 Node + CAS + synchronized 实现。CopyOnWriteArrayList 通过写时复制机制保证线程安全,适合读多写少场景。ConcurrentLinkedQueue 是基于 CAS 的非阻塞线程安全队列。BlockingQueue 支持阻塞操作,常用于生产者-消费者

2025-07-31 11:51:52 825

原创 【堆专题】谁说堆不重要?这道题告诉你它有多香(LeetCodeHot100 347)

本文介绍了LeetCode 347题“前K个高频元素”的Java解法。题目要求从一个整数数组中找到出现频率最高的k个元素。解法分为三步:1)使用HashMap统计每个数字的出现频率;2)构建大小为k的最小堆,动态维护频率最高的k个元素;3)从堆中取出结果。该方法时间复杂度为O(nlogk),空间复杂度O(n)。文章重点解释了为何使用最小堆而非排序来优化效率,并分析了代码中的关键细节,如Lambda表达式比较器和堆的性质。最后提出扩展思考,建议在需要排序输出时可改用大顶堆或后续排序。该解法适用于大数据场景下的

2025-07-30 09:43:14 604

原创 Java 并发中的“无锁江湖”:CAS、原子类和并发神器详解

摘要 本文系统介绍了Java并发编程中的锁机制和原子类。在锁机制方面,对比了悲观锁(如synchronized)和乐观锁的区别:悲观锁通过阻塞避免冲突,适用于写多读少场景;乐观锁通过CAS/版本号机制实现无锁并发,适合读多写少场景。重点分析了CAS算法的原理、三大问题(ABA、循环开销、单变量限制)及解决方案。在原子类部分,详细介绍了四类原子类(基础型、引用型、数组型、字段型)的特点和使用场景,并解析其底层基于CAS+volatile+Unsafe的实现机制。文章指出原子类适合于低竞争并发场景,在高冲突时需

2025-07-29 18:02:15 867

原创 【链表专题】一道链表题带你掌握模拟加法的本质:力扣第2题:两数相加

本文解析了力扣第2题《两数相加》的解题思路和实现方法。题目要求用链表模拟两个逆序存储的非负整数的加法运算。通过竖式加法的思路,从链表头开始逐位相加,处理进位问题。Java实现中使用了哨兵节点简化操作,通过取余和除法运算分别获得当前位和进位值。时间复杂度为O(max(m,n)),空间复杂度为O(max(m,n))。需要注意处理链表长度不同、最后进位以及大数溢出的情况。该题很好地体现了链表操作与数学运算的结合。

2025-07-29 10:38:56 381

原创 99% 的 Java 工程师都忽略的类加载细节,你踩过坑吗?

本文介绍了Java类加载器和双亲委派模型的核心机制。主要内容包括:类加载器的作用、Java内置的类加载器层次结构(Bootstrap、Extension、AppClassLoader)、双亲委派模型的工作流程(自顶向下委托加载,自底向上检查缓存)及其安全性和避免重复加载等优势。同时详细讲解了如何通过继承ClassLoader实现自定义类加载器,包括重写findClass()方法实现自定义加载逻辑,以及通过重写loadClass()方法打破双亲委派模型的场景和应用(如Tomcat隔离、热部署等)。最后对比了l

2025-07-28 13:48:53 1153

原创 JVM 如何创建一个对象?别再只说“new”了

本文深入解析Java类加载与对象创建的核心机制。类加载过程分为加载、验证、准备、解析和初始化五个阶段:加载获取二进制字节流并生成Class对象;验证确保字节码安全性;准备为静态变量分配内存并赋默认值;解析将符号引用转为直接引用;初始化执行静态变量赋值和静态代码块。对象创建过程则包括类加载检查、堆内存分配(指针碰撞或空闲列表)、内存零值初始化、对象头设置和执行构造函数。通过理解这些底层原理,开发者能编写更高效稳定的代码,并解决类初始化异常等问题。

2025-07-28 10:32:46 876

原创 JVM其实没那么神秘:你写的代码,它是怎么“变魔术”的?

本文通俗地介绍了JVM的核心工作原理。JVM作为Java程序的执行环境,负责将字节码转换为机器指令,实现跨平台运行。文章重点解析了JVM的内存管理机制,包括方法区、堆、栈等五大内存区域,以及垃圾回收(GC)的可达性分析原理和常见GC收集器。同时阐述了JIT编译器如何通过热点代码优化提升执行效率,并提供了实用的JVM调优参数示例。掌握这些知识能帮助开发者诊断OOM、性能瓶颈等问题,实现更高效的Java应用。JVM并非神秘黑盒,而是理解Java程序运行机制的关键。

2025-07-26 15:27:13 1000

原创 【矩阵专题】Leetcode48.旋转图像(Hot100)

本文介绍了如何原地顺时针旋转n×n矩阵90度的方法。解题思路分为两步:首先沿主对角线转置矩阵(交换matrix[i][j]和matrix[j][i]),然后对每一行进行左右翻转(交换matrix[i][j]和matrix[i][n-j-1])。通过Java代码实现并给出具体示例,展示了从原始矩阵到最终结果的转换过程。该方法时间复杂度为O(n²),空间复杂度为O(1),满足原地操作的要求。

2025-07-25 23:42:02 503

原创 一文吃透 Java 并发三大核心问题:可见性、原子性、有序性

本文介绍了Java并发编程中的核心问题及解决方案。主要探讨了多线程并发不安全的根源:共享资源缺乏同步导致的数据错误,表现为可见性问题(线程间数据不可见)、原子性问题(操作被中断)和有序性问题(指令重排序)。针对这些问题,文章提出了两种主要解决方案:使用synchronized关键字(通过同步方法、代码块和静态方法实现线程安全)和volatile关键字(保证可见性和禁止指令重排)。文中通过示例代码演示了各种同步机制的具体应用场景和效果,为处理Java多线程并发问题提供了实践指导。

2025-07-25 19:34:40 1449

原创 【矩阵专题】Leetcode54.螺旋矩阵(Hot100)

本文介绍了螺旋矩阵问题的解法,通过模拟从外向内逐层遍历的过程。使用四个边界变量(left,right,top,bottom)控制遍历范围,依次按顺时针方向遍历矩阵元素,每完成一圈后缩小边界范围。关键点在于遍历过程中需要判断是否还有未访问的行/列,避免重复或越界访问。该方法时间复杂度O(mn),空间复杂度O(1)(不计输出空间)。

2025-07-24 10:52:10 377

原创 【矩阵专题】Leetcode73.矩阵置零(Hot100)

给你一个m x n的矩阵,如果某个元素为 0,则将其所在的和都设为 0。请你进行操作,尽量减少额外空间的使用。

2025-07-23 23:22:58 294

原创 一文搞懂JVM-内存区域

摘要: JVM内存区域分为线程私有(程序计数器、虚拟机栈、本地方法栈)和线程共享(堆、方法区)。程序计数器是唯一不会OOM的区域,记录线程执行地址;虚拟机栈存储方法调用的栈帧,可能抛出StackOverflowError/OOM;本地方法栈服务于Native方法。堆是最大区域,存放对象实例,分为新生代和老年代,是GC主战场。方法区存储类元信息,JDK1.8后由元空间实现。运行时常量池解析符号引用并管理字符串常量。直接内存位于本地内存,提升I/O效率。字符串常量池在JDK1.7后移至堆中,避免重复创建。

2025-07-23 20:34:46 1028

原创 【源码揭秘】Java中==、equals与hashCode的真相,你真的懂了吗?

本文深入解析Java中对象比较机制,重点讲解==、equals()和hashCode()的区别与联系。==比较内存地址,equals()默认比较地址但可重写为内容比较(如String类)。关键点在于:重写equals()时必须同时重写hashCode(),否则在HashSet/HashMap等集合中会出现查找失败问题。文章通过Person类示例演示了正确实现方式,并分析哈希集合底层查找原理(先hashCode定位桶,再用equals精确匹配)。结论:==比较引用,equals比较内容,两者配合hashCod

2025-07-22 11:48:27 293

原创 当你输入一个网址到页面显示时发生了什么

摘要: 本文详细介绍了从输入URL到页面显示的过程。首先浏览器解析URL并构造HTTP请求;然后通过DNS解析将域名转换为IP地址。接着选择TCP或UDP协议,建立连接后发送HTTP请求。在网络层,添加IP头进行路由转发;数据链路层则通过MAC地址确保子网内通信。物理层负责实际数据传输。完成三次握手后,服务器响应HTTP请求,返回页面内容,浏览器解析渲染后呈现给用户。整个过程涉及DNS解析、TCP连接、网络路由和数据传输等多个环节。

2025-05-28 23:01:04 927

原创 HTTP基本概述

HTTP报文分为请求报文和响应报文两种格式。请求报文包含请求行、请求头、空行和可选的请求体,常用方法有GET、POST等;响应报文包含状态行、响应头、空行和响应体。HTTP协议支持短连接和长连接,其中长连接可复用TCP连接提高效率。HTTP默认端口为80(HTTP)和443(HTTPS)。报文头部与主体间用空行分隔,GET请求通常不带请求体。HTTP方法具有安全和幂等特性,如GET是安全且幂等的。URI用于标识资源,URL是URI的子集,包含定位信息。HTTP/1.1默认采用长连接,但存在队头阻塞问题。

2025-05-24 23:23:41 903

原创 网络体系结构(OSI,TCP/IP)

这层负责在本地网络上传数据,比如用网线、WiFi、光纤,把数据变成电信号或无线信号在局域网里传输,相当于在一个小区里投递信件(对应OSI的物理层+数据链路层)。不同机器、不同系统,数据格式可能不一样,这一层负责翻译数据(编码/解码)、加密解密、压缩解压,确保双方能读懂彼此发的东西。直接面对用户的,比如你用浏览器打开网页(HTTP)、用微信聊天、用邮箱发信,这一层就是应用软件跟网络打交道的地方。关键词:TCP(可靠)、UDP(快速)、端口号、分段重组。关键词:HTTP、FTP、DNS、SMTP、SSH 等。

2025-05-13 16:33:55 1124

原创 【二叉树专题】一道深入浅出的 DFS 题:求二叉树的直径(含通俗易懂讲解)

每个节点都可以是“最长路径”的中心,左边能走多远 + 右边能走多远,就是它能提供的最长路径!通过 DFS 遍历整棵树,记录所有节点作为“中心”时的最长路径长度,找出最大的那一个,就是二叉树的直径。

2025-04-20 22:41:40 507

原创 Java常用数论(gcd,lcm,埃氏筛)

【代码】Java快读快写模版。

2025-04-11 23:13:53 153

原创 进制转换算法模版(Java)

【代码】进制转换算法模版(Java)

2025-04-11 23:09:16 117

原创 Floyd算法模版(Java)

【代码】Floyd算法模版(Java)

2025-04-11 23:08:19 150

原创 Dijkstra算法模版(Java)

【代码】Dijkstra算法模版(Java)

2025-04-11 23:07:43 159

原创 秒懂HTTP协议

HTTP 协议就是一套浏览器和服务器“说话”的规则,帮助你访问网页、发送数据、拿到结果。如果你想继续深入,比如学习抓包工具(如 Fiddler、浏览器的开发者工具),或者如何写一个简单的网页/服务器,也可以告诉我,我们一步一步来~你现在最感兴趣的是哪一部分?😄。

2025-04-10 21:45:51 387

原创 LeetCode 相交链表题解:双指针的精妙应用

⚠️ 注意:题目中所说的「相交」,指的是节点地址相同,而非节点值相同。两个链表在节点值为 8 的位置相交(当然我们比较的是节点地址)。当其中一个到达链表尾部时,跳到另一个链表的头部继续走;:O(m + n),m 和 n 分别为两个链表的长度;如果两个链表有交点,最终它们会在交点相遇;:O(1),只用了两个指针,无需额外空间。如果没有交点,两个指针都会在走完。如果两个链表没有交点,返回。两个指针开始分别走各自的链表;,请你找出并返回它们的。

2025-04-09 19:48:22 801

原创 从零开始彻底掌握二叉树(Java版详解 + 图解 + 面试题)

在程序设计中,二叉树(Binary Tree)是每个节点最多拥有两个子节点(通常称为“左子节点”和“右子节点”)的一种树形数据结构。其天然结构递归性极强,因此广泛应用于算法设计、表达式解析、搜索优化等领域。在 Java 中,二叉树通常以链式结构存在,每个节点是一个对象,其左右子树由两个引用指向。int val;// 存储的数据// 指向左子树// 指向右子树二叉树是一个“值得反复练习”的基础模块。它让我们更深入理解递归、栈、搜索、分治等核心思想,也在面试中频频出现,是写出漂亮代码的基石。

2025-04-08 14:50:46 923

原创 一文搞懂 Dijkstra 算法:最短路径的经典之选(含 Java 代码详解)

Dijkstra 算法适用于边权非负的有向图或无向图;通过优先队列可以将时间复杂度降为;实现时要注意下标从 0 开始,避免越界;常用于图论入门、路径优化、交通网络等场景。

2025-04-05 18:06:45 1451

原创 【Leetcode 994】腐烂的橘子 - 多源 BFS 解题思路与 Java 实现详解

这道题作为 BFS 的经典题目,锻炼了你对于:多源 BFS 的理解;BFS 分层处理(每一层表示时间);细节边界判断(新鲜橘子统计、flag 控制时间);的全面掌握。掌握之后,你可以轻松应对更多类似题目,比如:火焰蔓延问题岛屿感染问题最短路径带时间传染传播更多图解题解,欢迎关注我!

2025-04-05 10:56:11 530

原创 Floyd 算法 Java

Floyd-Warshall 是处理稠密图、所有点对路径问题的强力工具,使用简单,效率可接受。

2025-04-04 21:01:30 497

原创 Java 实现 字母异位词分组

本文详细解析了字母异位词分组问题,并使用排序 + 哈希表进行求解。时间复杂度为。通过字符计数法,可以进一步优化到O(NK)。这是一道典型的哈希表应用题目,考察了字符串处理和数据结构的使用。希望本文能帮助你更好地理解该问题!如果有任何疑问或优化建议,欢迎交流讨论!🎯。

2025-04-03 23:36:52 599

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除