- 博客(70)
- 收藏
- 关注
原创 JVM常见问题总结(2)
本文摘要: JVM内存管理与垃圾回收机制涉及多个关键概念。堆内存分为新生代(Eden+Survivor)和老年代,采用不同回收算法:新生代使用标记-复制避免碎片,老年代采用标记-整理或标记-清除。跨代引用通过RememberSet(如CardTable)解决。垃圾回收器包括串行(Serial)、并行(Parallel)、并发(CMS)和分代式(G1/ZGC),G1从JDK9起成为默认。CMS采用三色标记法,分初始标记、并发标记等阶段;G1通过Region划分和RS集优化回收。内存溢出分为堆溢出和栈溢出,对象
2026-03-11 20:36:11
391
原创 JVM常见问题总结(1)
本文主要探讨了Java虚拟机(JVM)的关键机制及其优化技术。首先介绍了Java平台无关性的实现原理,包括字节码和JVM的作用,以及JIT和AOT编译方式的区别。其次详细分析了JVM的类加载过程、内存区域划分和对象分配策略,重点讨论了逃逸分析、标量替换等优化技术。文章还深入讲解了垃圾回收机制,包括可达性分析算法和三色标记法的实现原理,以及STW(Stop-The-World)对系统性能的影响。最后,对比了不同JDK版本中类加载器的变化,并解释了常量池的实现方式。这些内容全面展示了JVM的核心工作原理和性能优
2026-03-11 17:00:00
468
原创 Java 并发常见问题总结(3)
本文总结了Java线程池和多线程编程中的关键知识点: 线程顺序执行: 单线程池保证任务顺序执行 使用CompletableFuture编排任务依赖关系 线程安全: synchronized保证原子性、可见性和有序性 volatile保证可见性和有序性,但不保证原子性 原子类(AtomicLong/LongAdder)实现无锁线程安全 锁机制: synchronized锁升级过程(无锁→偏向锁→轻量级锁→重量级锁) ReentrantLock相比synchronized更灵活(可中断、公平锁等) 读写锁(Re
2026-03-02 22:21:04
977
2
原创 Java 并发常见问题总结(4)
Java线程异常不会导致进程退出,因为Java采用线程独立模型,各线程互不影响。线程状态可通过isAlive()方法判断,但需注意同步问题。CAS操作依赖硬件指令保证原子性,不一定需要自旋。读写锁通过ReentrantReadWriteLock实现,区分读锁(共享)和写锁(独占)。AQS是同步器基础框架,核心包括同步状态、同步队列和模板方法,支持独占和共享模式。条件队列用于线程间协调,与同步队列配合实现await()和signal()机制。CompletableFuture相比FutureTask提供更丰富
2026-03-02 22:19:10
1347
原创 Java 并发常见问题总结(2)
本文摘要: 本文系统性地介绍了Java多线程编程中的核心概念和常见问题。主要内容包括:1) 死锁的定义、四个必要条件及解决方案;2) 守护线程与普通线程的区别;3) 可重入锁的实现原理;4) 上下文切换的概念及优化方法;5) 并发与并行的区别;6) ThreadLocal的实现机制;7) Java内存模型(JMM)和happens-before原则;8) CAS操作及其ABA问题解决方案;9) AQS的独占与共享模式;10) 多线程顺序打印的实现方式;11) Condition的使用及与wait的区别;12
2026-03-01 00:32:18
1396
原创 Java 并发常见问题总结(1)
本文主要记录的是Java并发的常见问题源码分析以及总结,同时也会从我个人的角度进行分析,内容会比较多,我分成几个进行介绍,可以结合着一起看。当然因为协程是比较新的版本才有,如果有需要协程(虚拟线程)相关的问题总结可以评论区留言
2026-03-01 00:30:05
547
原创 Java 集合常见问题总结(3)
本文摘要: Java集合框架常见问题解析: BitSet底层使用long数组实现位图操作,通过位运算高效处理二进制数据; JDK1.8 HashMap改进:引入红黑树、尾插法扩容、优化hash计算; 线程安全方案:同步容器、并发容器(如ConcurrentHashMap)、COW机制; 集合排序方式:Comparable接口、Comparator比较器、Stream排序; 遍历修改List的5种方式:普通for循环、迭代器、COW容器、Stream过滤、removeIf; HashMap设计要点:容量取2^
2026-02-16 11:00:00
627
1
原创 Java 集合常见问题总结(2)
本文主要分析了Java集合框架中的并发控制机制及数据结构特点。重点包括: ConcurrentHashMap的并发控制:通过CAS+synchronized实现线程安全,包括初始化桶的自旋CAS控制、put操作的分段锁机制以及多线程扩容策略。 集合类的对比分析: ConcurrentHashMap与ConcurrentSkipListMap的区别:前者基于哈希表无序存储,后者基于跳表有序存储 SynchronizedList与Vector的区别:同步方式(代码块锁vs方法锁)、扩容机制及迭代器同步策略 Ha
2026-02-16 10:30:00
278
原创 Java 集合常见问题总结(1)
摘要:ArrayList、LinkedList和Vector是List接口的主要实现,区别在于底层数据结构与线程安全性。ArrayList基于数组,查询性能高;LinkedList基于双向链表,增删性能好;Vector是线程安全的ArrayList。ArrayList通过重写序列化方法优化存储效率。ConcurrentHashMap在JDK1.8中采用CAS+synchronized实现线程安全,相比1.7的分段锁粒度更细。JDK1.8选择synchronized而非ReentrantLock,主要因其性能
2026-02-15 20:52:06
1257
原创 Java 基础常见问题总结(5)
本文摘要: 不建议用异常控制业务流程,因性能损耗、维护困难且影响事务回滚 Java负数取绝对值可能仍为负,因数值溢出,需转更大类型处理 推荐多用组合少用继承,组合更灵活且避免不当继承关系 建议自定义无参构造函数,满足框架需求、反射调用和继承要求 需同时实现equals和hashCode,确保哈希集合正常运作 异常处理需注意:不必要声明、捕获顺序、资源关闭等 修改private字段可通过反射或setter方法实现
2026-02-15 20:50:02
993
原创 Java 基础常见问题总结(4)
本文摘要: Java核心概念解析:泛型字母约定(E-元素、K-key、V-value等);上下界限定符区别(extends限定子类,super限定父类);多态实现条件(继承+重写+父类引用子类对象);面向对象与面向过程差异;IO模型比较(BIO/NIO/AIO);SPI扩展机制实现;UUID版本特性;反射机制原理与性能影响;泛型优点与类型擦除;深/浅拷贝实现方式;常见语法糖示例(switch字符串、lambda等);main方法设计原因分析。全文涵盖Java基础到进阶核心知识点。
2026-02-07 20:22:32
1327
原创 Java 基础常见问题总结(3)
JDK9对字符串拼接进行了重大优化,将拼接策略从编译期转为运行期实现。主要改进包括: 引入InvokeDynamic指令和StringConcatFactory,支持运行时动态选择最优拼接策略(如StringBuilder、MethodHandle等6种方式) 存储结构优化,将char数组改为byte数组+coder标识,节省内存(英文1字节,中文2字节) 字符串常量池优化,intern()方法在JDK7+会直接存储引用而非复制对象 不可变特性通过final修饰类和存储数组实现,保证线程安全 并行流性能取决
2026-02-07 18:15:00
653
原创 Java 基础常见问题总结(2)
Java核心知识点摘要: 排序算法:Arrays.sort对基本类型使用双轴快排,对象类型使用TimSort(归并+插入排序混合) BigDecimal:字符串构造精确,double构造不精确;比较用compareTo而非equals 异常区别:ClassNotFoundException(类加载失败)与NoClassDefFoundError(类解析失败) 序列化:需实现Serializable接口,可自定义Externalizable控制序列化字段 定时器:Timer单线程执行,通过守护线程循环检测任务
2026-02-05 21:39:15
1017
原创 hot100打卡——day20
本文汇总了LeetCode中四个经典算法题的解题思路和代码实现。62题"不同路径"使用动态规划,通过构建二维数组记录到达每个位置的路径数;56题"合并区间"先排序后合并重叠区间;55题"跳跃游戏"采用从后往前遍历的方法判断可达性;53题"最大子数组和"通过动态规划计算以每个元素结尾的子数组最大和。所有题目均给出了完整的Java实现代码和解题思路分析,涵盖了动态规划、贪心算法等常见解题方法。
2026-02-05 12:03:56
363
原创 Java 基础常见问题总结(1)
摘要:本文系统介绍了Java数据类型及相关概念,主要包括:1)基本数据类型分类(整数、浮点、布尔、字符型)及其存储差异;2)数据类型转换方式(隐式/显式/字符串转换)及精度风险;3)BigDecimal与double的精度差异及金融场景应用;4)装箱拆箱机制与包装类作用;5)面向对象特性(封装、继承、多态)与设计原则;6)抽象类与接口的区别及互补性;7)静态成员特性与内部类分类(静态/非静态内部类的访问差异)。全文通过技术对比和典型示例,深入解析了Java核心数据类型体系的设计原理与应用场景。
2026-02-04 21:56:49
837
原创 hot100打卡——day19
本文摘要:四个算法题解:1) 编辑距离使用动态规划,比较字符是否相等来更新操作数;2) 爬楼梯问题通过状态转移方程f(i)=f(i-1)+f(i-2)求解;3) 最短无序子数组通过前后遍历确定边界;4) 最小路径和采用动态规划,每个位置取上方或左方较小值加上当前值。均使用动态规划思想,时间复杂度O(n)或O(n^2)。
2026-02-04 16:18:30
309
原创 hot100打卡——day18
本文包含四个LeetCode算法题的解法: 两数之和:使用哈希表存储元素值及其索引,遍历数组时检查目标差值是否存在,时间复杂度O(n)。 子集:采用回溯法,通过维护start索引避免重复,每次递归都生成新的子集,时间复杂度O(2^n)。 最小覆盖子串:滑动窗口法,先统计目标字符串字符频率,扩展右边界匹配字符,收缩左边界寻找最小窗口,时间复杂度O(n)。 颜色分类:实现快速排序算法,选取中间元素作为pivot,将数组分为小于和大于pivot的两部分递归排序,时间复杂度O(nlogn)。 这些解法涵盖了哈希表、
2026-02-03 16:14:44
326
原创 JVM内存模型常见总结
摘要:Java内存模型包含5个部分:线程私有的栈、本地方法栈、程序计数器,以及共享的堆和方法区。栈存储方法调用信息,堆存储对象实例。程序计数器记录线程执行位置,是唯一不会OOM的区域。堆分为新生代(Eden、Survivor)和老年代,采用分代回收机制。方法区存储类信息、常量等。String对象根据创建方式不同可能存储在常量池或堆中。内存泄漏指无用对象无法回收,内存溢出则是内存不足。ThreadLocal采用弱引用机制减少内存泄漏风险,但仍需手动remove清理。
2026-02-02 07:00:00
718
原创 hot100打卡——day17
本文介绍了几个二叉树和数组相关的算法题解。98题验证二叉搜索树通过中序遍历检查序列是否递增;96题使用动态规划计算不同二叉搜索树的数量,递推公式为dp[i] += dp[j-1]*dp[i-j];94题实现二叉树的中序遍历。84和85题都利用单调栈求最大矩形面积:84题直接处理柱状图,85题将二维矩阵转化为柱状图后处理。核心思路都是通过维护单调栈来高效找到每个元素左右第一个比它小的边界,从而计算最大面积,时间复杂度优化到O(n)。
2026-02-01 15:57:18
776
原创 hot100打卡——day16
本文总结了6道LeetCode二叉树和任务调度相关题目的解题思路和代码实现。任务调度器问题通过统计任务频率并分情况处理;合并二叉树采用递归同步遍历;从前序中序构建二叉树利用哈希表定位根节点;二叉树最大深度通过深度优先搜索计算;层序遍历使用队列实现;对称二叉树通过双指针递归判断。各题均给出了简洁的Java实现代码和关键解题思路,涵盖了常见的树形结构和调度问题处理方法。
2026-02-01 09:00:00
524
原创 hot100打卡——day15
本文总结了LeetCode中6道经典算法题的解题思路和代码实现: 无重复字符的最长子串:使用滑动窗口和哈希表记录字符位置,时间复杂度O(n) 两数相加:链表模拟加法运算,处理进位情况 单词搜索:回溯法DFS遍历二维矩阵,标记已访问位置 二叉树展开为链表:通过右指针重组树结构 最长回文子串:中心扩散法处理奇偶两种情况 寻找两个正序数组的中位数:合并数组后直接取中位数 所有解法都提供了清晰的代码实现和关键思路说明,涵盖了字符串处理、链表操作、树结构转换、矩阵搜索等常见算法问题。
2026-01-30 14:38:09
740
原创 hot100打卡——day14
本文总结了LeetCode中多个经典算法题的解题思路: 有效的括号:使用栈结构匹配括号,遇到左括号入栈,右括号则与栈顶匹配,最后检查栈是否为空。 删除链表倒数第N个节点:先计算链表长度,找到要删除节点的前驱节点进行删除操作。 电话号码字母组合:采用回溯法递归生成所有可能的字母组合。 三数之和:排序后使用三指针法,固定一个指针,另外两个指针从两端向中间扫描。 盛水最多的容器:双指针法,每次移动高度较小的指针并计算当前容量。 正则表达式匹配:动态规划解法,分情况处理普通字符和'*'通配符的情况。 这些题目涵盖了
2026-01-26 17:06:07
528
原创 Netty 常见问题总结
Netty封装ByteBuf解决了原生ByteBuffer的不足,具备自动扩容和读写指针分离特性,避免了手动flip操作。ByteBuf分为堆内存/直接内存和池化/非池化类型,默认使用直接内存和池化模式提升性能。Netty通过零拷贝技术(如CompositeByteBuf、FileRegion)减少内存拷贝,提高效率。其线程模型采用Reactor模式,支持单线程、多线程和主从架构。粘包拆包问题通过定长、分隔符等解码器解决。Netty性能优势源于非阻塞IO、高效线程模型、零拷贝、内存池和无锁串行化设计。此外还
2026-01-25 19:27:02
701
原创 hot100打卡——day13
本文包含四个LeetCode算法题的解法:1. 二叉搜索树转累加树:通过反向中序遍历(右-根-左)累加节点值;2. 合并K个升序链表:采用两两合并的暴力方法;3. 和为K的子数组:使用前缀和配合哈希表统计满足条件的子数组数量;4. 合并两个有序链表:通过双指针比较节点值依次合并。各解法均给出了核心代码实现和简要思路说明。
2026-01-25 12:20:38
51
原创 hot100打卡——day12
本文摘要: 接雨水问题:使用双指针法,分别计算每个位置左右的最大高度,取较小值减去当前高度得到储水量。时间复杂度O(n)。 组合总和:回溯法求解,通过剪枝优化,允许重复使用元素。递归时维护当前和与候选列表。 二叉树直径:后序遍历计算每个节点的左右子树深度,同时更新最大路径长度(直径)。 搜索排序数组:二分查找处理旋转排序数组,判断有序区间后调整搜索范围。两种解法:O(n)遍历和O(logn)二分。 最长有效括号:使用栈记录括号位置,遇到不匹配时重置起始点,计算连续有效区间长度。 下一个排列:从后向前找到降序
2026-01-23 14:21:04
593
原创 hot100打卡——day11
本文分析了四个LeetCode算法题的解法: 括号生成(22题):使用DFS回溯法,通过维护左右括号数量确保有效性,时间复杂度O(4^n/√n)。 字母异位词分组(49题):利用哈希表,将排序后的字符串作为key分组,时间复杂度O(n*klogk)。 旋转图像(48题):通过四角元素交换实现顺时针旋转,注意下标处理,时间复杂度O(n²)。 全排列(46题):采用回溯算法,使用标记数组避免重复选择,时间复杂度O(n!)。 这些解法都采用了经典算法思想(DFS、哈希、矩阵操作、回溯),需要注意边界条件和状态管理
2026-01-21 13:49:56
302
原创 hot100打卡——day10
本文介绍了四个LeetCode算法题的解法。1.移动零:使用双指针遍历数组,非零元素前移后补零;2.完全平方数:动态规划求解,dp[i]表示凑成i的最少平方数;3.搜索二维矩阵II:从右上角开始DFS,根据值大小决定搜索方向;4.滑动窗口最大值:维护单调递减队列,队首即为当前窗口最大值。这些解法分别运用了双指针、动态规划、深度优先搜索和单调队列等算法思想,展示了不同场景下的高效解决方案。
2026-01-18 12:09:39
74
原创 hot100打卡——day09
本文摘要: 删除无效括号(301):通过统计需要删除的左右括号数量,递归尝试删除并验证有效性; 最长递增子序列(300):使用动态规划,双重循环比较元素大小更新dp数组; 二叉树序列化(297):采用前序遍历进行序列化和反序列化,使用"null"标记空节点; 寻找重复数(287):将数组视为链表,运用弗洛伊德算法检测环的入口点。 各题均给出了Java实现代码和解题思路,涉及递归、动态规划、树遍历和链表环检测等算法技巧。
2026-01-17 13:13:52
361
原创 hot100打卡——day08
本文分析了四道动态规划问题的解法:1. "打家劫舍III"采用树形DP,每个节点返回取/不取两种状态的最大值;2. "买卖股票最佳时机"通过维护持有/不持有两种状态的每日最大利润;3. "含冷冻期的股票买卖"在状态转移中考虑冷冻期限制;4. "戳气球"通过区间DP逆向求解,枚举每个气球最后被戳破时的最大价值。四道题都展示了动态规划在不同场景下的状态定义和转移技巧,包括树形结构、序列问题和区间划分等典型应用。
2025-12-31 21:36:26
418
原创 hot100打卡——day07
本文总结了5道LeetCode算法题的解题思路: 406.根据身高重建队列:先按身高降序和k值升序排序,再按k值插入到列表中,利用矮个子插入不影响高个子的特性。 399.除法求值:构建图的邻接表表示,通过DFS搜索路径并计算权值乘积来求解除法表达式。 347.前K个高频元素:使用哈希表统计频率,排序后取前k个元素。 394.字符串解码:用StringBuilder模拟栈处理嵌套结构,遇到右括号时处理重复子串。 338.比特位计数:遍历每个数,通过位运算统计1的个数。 这些解法都采用了合理的数据结构和算法策略
2025-12-30 14:13:21
341
原创 hot100打卡——day06
本文展示了5道LeetCode算法题的Java解法:1)461题汉明距离使用异或和位运算计算不同位数;2)448题通过哈希表找出数组中缺失的数字;3)438题用滑动窗口和频率数组查找字符串中的所有字母异位词;4)437题使用深度优先搜索和哈希表统计二叉树中路径和等于目标值的路径数;5)416题采用动态规划判断数组是否能分割成两个和相等的子集。这些解法涵盖了位运算、哈希表、滑动窗口、DFS和动态规划等常用算法技巧。
2025-12-29 10:43:00
270
原创 hot100打卡——day05
本文摘要: 最长连续序列(128题):使用HashSet去重后,通过寻找序列起点元素并统计连续序列长度,时间复杂度O(n)。关键思路是只统计不存在前驱元素的数字作为序列起点。 二叉树最大路径和(124题):采用后序遍历,计算包含当前节点的最大路径和,但返回时只能选择左右子树中的一条路径。使用全局变量记录最大值,处理负值情况。 零钱兑换(322题):记忆化搜索的动态规划解法,自顶向下计算凑成目标金额的最小硬币数,避免重复计算。 目标和(494题):回溯算法遍历所有加减组合可能性,统计满足目标和的路径数,时间复
2025-12-28 13:29:36
420
原创 hot100打卡——day04
摘要: 本文包含多个LeetCode算法题解:1) 乘积最大子数组使用动态规划记录最大最小值;2) 排序链表采用归并排序思想;3) LRU缓存实现使用双向链表和哈希表;4) 环形链表检测使用快慢指针;5) 单词拆分使用动态规划;6) 只出现一次数字使用异或运算;7) 回文子串统计采用动态规划或中心扩展法。各解法均包含关键思路说明和代码实现。
2025-12-27 08:30:00
458
原创 hot100打卡——day03
本文汇总了6个LeetCode算法题的解题思路:1.反转链表(迭代法,双指针反转节点指向);2.岛屿数量(DFS深度优先搜索标记已访问岛屿);3.打家劫舍(动态规划记录偷/不偷两种状态);4.多数元素(排序后取中位数);5.除自身外数组乘积(前缀积×后缀积);6.最小栈(数组模拟栈,同步维护最小值数组)。所有解法均给出核心代码和关键思路说明,采用数组、DFS、动态规划等典型算法思想解决问题。
2025-12-26 10:49:26
379
原创 hot100打卡——day02
本文总结了5道LeetCode算法题的解题思路: 翻转二叉树:使用后序遍历递归交换左右子树; 最大正方形:动态规划,dp[i][j]记录以(i,j)为右下角的最大正方形边长; 数组第k大元素:快速选择算法,通过比较pivot值分区处理; 前缀树实现:使用26叉树结构实现字符串的插入、查找和前缀匹配; 课程表:拓扑排序判断图中是否存在环,统计入度为0的节点数量验证是否完成所有课程。
2025-12-25 13:58:05
389
原创 hot100打卡——day01
本文总结了四个经典算法问题的解法:1. 相交链表使用双指针法,通过交替遍历两个链表找到交点;2. 二叉树最近公共祖先采用后序遍历递归判断子树情况;3. 回文链表通过快慢指针找中点并反转后半段进行比较;4. 每日温度问题使用单调栈快速找到每个温度后面第一个更高温度的天数。这些解法都体现了常见算法技巧(双指针、递归、单调栈)的巧妙应用,代码简洁高效。
2025-12-24 20:58:41
531
原创 牛客周赛 Round 119解析
本文展示了5道编程竞赛题目的Java解题代码及思路: A题:比较两个数值x和y,若x大输出A,y大输出B;相等时比较附加参数p1和p2,p1大输出B,p2大输出A,都相等输出C。 B题:计算序列极差。对每组测试数据排序后取首尾元素差值取绝对值。 C题:预处理平方数后二分查找区间。预处理1-100000中平方数各位和等于自身的数,用二分查找给定区间内的数量。 D题:模拟位移操作。统计净位移量,左移时累加位数,右移时优先抵消左移位数,剩余左移位数用快速幂计算。 E题:三角形计数。先排序,分三种情况统计:全等三角
2025-11-24 12:55:05
300
原创 牛客周赛 Round 118 —— 题目详细解析+答案
本文包含6道编程题的解题思路和Java代码实现:A题"小红的博弈"通过简单判断石子数量决定胜负;B题"小红选点"暴力枚举所有点对求最远距离;C题"小红的矩形"根据已知两点坐标补全矩形;D题"小红拿石子1.0"通过排序和贪心策略计算最大可拿石子数;E题"小红玩树"使用BFS计算节点距离并判断博弈结果;F题"小红拿石子2.0"通过比较最大值和出现次数决定胜负。每道题都提供了清晰的解题思路和对应
2025-11-18 00:07:05
709
原创 AcWing第一章——基础算法详解
本文总结了多个基础算法的实现模板和解题思路。主要包括快速排序(785题)、归并排序(787题)及其在计算逆序对数(788题)中的应用,二分查找(789、790题)处理数的范围和三次方根问题,高精度运算(791-794题)实现大数加减乘除,前缀和(795题)与差分(797题)及其二维扩展(796、798题),滑动窗口解决最长连续不重复子序列问题(799题),双指针处理数组元素目标和(800题),位运算统计二进制中1的个数(801题),离散化处理区间和(802题),以及区间合并算法(803题)。这些模板包含了算
2025-11-13 13:59:20
1024
原创 常见排序算法
本文介绍了常见的排序算法及其Java实现,包括冒泡排序、选择排序、插入排序、希尔排序、归并排序、快速排序、堆排序、计数排序、基数排序和桶排序。每种算法都通过代码示例展示了具体实现方式,并简要说明了其基本原理和特点。这些排序算法涵盖了从简单到复杂的不同类型,包括基于比较的排序(如快速排序)和非比较排序(如计数排序),适用于不同场景和数据结构。
2025-10-20 16:35:45
456
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅