- 博客(185)
- 收藏
- 关注
原创 【happens-before 八大规则详解】
如果 A happens-before B,且 B happens-before C,则 A happens-before C。,如果构造函数和 finalize() 之间没有 happens-before 保证,finalize() 可能看到。happens-before 关系,编译器/CPU 可以随意重排序,线程 B 可能看不到线程 A 的修改。同一个线程中,前面的代码 happens-before 后面的代码。,没有这条规则,编译器/CPU 随意重排序,线程间就完全无法通信了。
2026-06-02 20:22:21
196
原创 【ABA问题 全解】
产生原因CAS操作仅比对变量数值,无法识别数值中间被修改后还原的场景危害栈结构错乱、业务数据覆盖、并发逻辑失效解决办法业务层面:增加版本号/时间戳作为二次校验依据JDK工具:使用(引用+版本戳)、(标记位)使用场景高并发无锁设计、队列/栈结构操作、订单状态流转等对数据变更轨迹敏感的场景。
2026-05-20 16:10:05
252
原创 【讲解线程的BLOCKED状态】
线程因为竞争锁失败,被挡在外面,只能在锁的等待队列里排队,就会进入 BLOCKED 状态。只和内置锁有关线程还活着,只是拿不到锁,无法继续执行一旦拿到锁,立刻变回 RUNNABLE 状态线程的BLOCKED状态,是指线程在尝试获取内置锁时,锁已被其他线程持有,导致线程进入锁的竞争队列,暂时无法继续执行的状态。直接进入代码块但抢锁失败;调用wait()后被notify()唤醒,重新抢锁失败。与WAITING不同,BLOCKED。
2026-04-22 21:47:59
232
原创 【HotSpot 是什么?】
HotSpot是Oracle JDK默认的Java虚拟机实现,采用热点探测技术识别频繁执行的代码并进行即时编译(JIT),显著提升性能。它负责字节码执行、内存管理、垃圾回收和线程调度等核心功能。作为JVM规范的具体实现,HotSpot与解释器配合工作,通过统计运行数据优化热点代码。该技术源自Sun公司后被Oracle收购,现已成为Java生态中最主流的JVM实现,同时OpenJDK也提供其开源版本。
2026-04-22 21:39:40
202
原创 【Java线程 vs 虚拟机线程】
概念核心定位通俗类比Java线程开发者编码层面创建的、用于执行业务逻辑的线程(用户态线程)公司里的「业务员工」,负责具体业务(比如接单、发货)虚拟机线程(VM Thread)JVM启动时自动创建的、用于支撑JVM自身运行的内部核心线程(内核态/系统态)公司里的「运维/后勤人员」,负责保障公司正常运转(比如水电、设备维护)Java线程是“做事的”,虚拟机线程是“保障做事的”,前者开发者可控,后者完全由JVM自治,开发者几乎无法直接操作。归属不同。
2026-04-06 17:08:42
375
原创 【Elasticsearch扫盲】
摘要: Elasticsearch(ES)是一个专为海量数据全文检索设计的搜索引擎,适用于电商、问答平台等需要快速查询的场景。相比MySQL(核心业务存储)和Redis(临时缓存),ES擅长处理模糊搜索、日志查询等任务,但不支持事务。三者分工明确:MySQL管账务,Redis加速缓存,ES负责海量检索。使用时要避免混淆,如不能用ES替代MySQL的核心业务存储功能。 关键词: Elasticsearch、MySQL、Redis、全文检索、海量数据
2026-04-01 21:05:12
342
原创 【如何理解递归链表?】
链表递归遍历的核心在于递归的“递”与“归”,对应链表的正序和倒序处理。递归遍历的本质是先处理当前节点(前序),再递归处理下一个节点,最后回溯处理当前节点(后序)。关键点包括:1)必须设置递归终止条件(如head==null);2)前序位置处理正序逻辑,后序位置处理倒序逻辑。这种分离遍历与业务逻辑的方式,使得解决复杂链表问题(如反转链表)更简洁。递归的return仅结束当前层调用,程序会回溯执行上层未完成的逻辑,从而实现完整的遍历过程。
2026-03-11 20:08:08
570
原创 【Cursor 中找不到LeetCode 插件解决办法】
说明:扩展视图顶部的「…」菜单在部分 Cursor 版本中可能没有或位置不同,用命令面板的「从 VSIX 安装」更稳定。或随便点一个请求,在请求列表里选一个,右侧。输入 Install from VSIX。(或「扩展: 从 VSIX 安装…登录,粘贴刚才复制的 Cookie。按 Ctrl + Shift + P。在 Cursor 中再次执行。打开开发者工具,切换到。或 从 VSIX 安装。在弹窗中选中刚下载的。
2026-02-05 15:43:36
1527
原创 【JDK8 vs JDK17 全方位对比】(使用+设计+性能+生态)
JDK8(2014年发布)和JDK17(2021年发布)是Java生态中最具代表性的两个:JDK8是“经典遗产”,至今仍被80%以上的企业使用;JDK17是“现代主力”,是Spring Boot 3.0+、Quarkus等主流框架的标配,也是未来5-10年的技术方向。我从「版本定位、核心特性、设计理念、性能、生态、使用场景」6个维度,帮你彻底理清两者的差异和取舍逻辑。
2026-01-20 11:15:37
954
原创 Spring IoC & AOP 核心知识与原理(完整版)
IoC容器负责生产「原材料」(原始Bean对象),AOP机制负责对需要增强的原材料进行「精加工」(生成代理Bean),最终由IoC容器统一管理和对外提供「成品」(代理Bean)。解决「对象与对象之间」的依赖耦合问题,通过将对象的创建权交给容器,实现业务代码的解耦,让程序更易于测试、扩展和维护。IoC是Spring的骨架,所有功能都基于IoC容器展开。
2026-01-15 09:46:25
779
原创 【DataGrip打不开如何排查?】
先贴报错:。残留进程通常是因为之前的DataGrip没正常关闭(比如闪退、强制关闭、系统异常重启等)导致的。
2025-12-31 09:42:59
601
原创 【怎么理解maven中的镜像和仓库?】
把国外的东西,提前搬到国内仓库放着,你要的时候直接从国内拿,不用等跨国运输。镜像 = 在国内开了个分店,卖的东西和美国总店一样,但离你近,所以送货快!“别去美国那个慢吞吞的仓库了,去杭州那个仓库,东西一模一样,但快得多!这就是为什么配置镜像后速度能提升10-100倍的原因!我们用大白话、最直接的方式来解释这个问题。情况2:配置了镜像(就像国内超市有现货)情况1:没有镜像(就像网购国外直邮)好比GitHub vs Gitee。原因1:物理距离近(最核心!原因2:网络线路优化。用程序员能理解的例子。
2025-12-13 20:35:50
251
原创 【CapsLock 失效,Ctrl 键变成 CapsLock 的原因及解决方法】
许多笔记本电脑(尤其是联想、戴尔等品牌)在BIOS中默认开启了"Ctrl与CapsLock功能互换"选项,这是为了方便程序员和Linux用户的特殊设计。值可以自定义键盘键位。若该值被修改(如安装某些软件后),可能导致Ctrl与CapsLock互换。极少数情况下,键盘硬件本身损坏导致按键功能异常。:按住Shift键可临时输入大写,松开后恢复正常。Windows系统中,通过修改注册表的。
2025-12-13 14:29:43
2271
原创 【OOM是什么?怎么排查?】
OOM 是 JVM 抛出的要么是“内存分配太少,不够用”(比如堆内存设置太小,业务对象太多);要么是“内存泄漏”(对象用完后没被回收,一直占用内存,最终耗尽资源)。先看日志定类型,再抓快照找根源,配置不足就调整,内存泄漏就修复对 Java 开发来说,堆内存溢出(Java heap space)是重点,掌握“配置 JVM 参数自动生成快照→用 VisualVM/MAT 分析→修复内存泄漏/调整堆大小”的流程,就能解决 80% 以上的 OOM 问题。
2025-12-09 11:21:58
1178
原创 【HashSet的本质是HashMap?】
HashSet 由 HashMap 实现,本质是“用 HashMap 的 key 实现 HashSet 的元素存储与去重,用固定空对象填充 HashMap 的 value”——核心目的是复用已有高效实现,减少开发维护成本,同时保持 Java 集合框架的设计一致性。简单说:HashMap 已经解决了“哈希表+去重”的核心问题,HashSet 不需要再造一遍轮子,只需要做一个“包装器”,把自己的方法转发给内部的 HashMap 即可。
2025-12-05 16:40:37
620
原创 【为什么加了锁会效率变低?Vector 是线程安全的,为什么现在不用了?】
要理解“加锁后效率变低”,核心是搞懂 synchronized,再加上锁本身的开销,最终导致效率下降。
2025-12-05 16:29:54
365
原创 【Lombok库常用注解】
Lombok是一个Java库,它通过注解的方式,在编译期自动生成样板代码,极大地减少了Java开发中冗长且重复的代码,如getter、setter、构造函数等,使代码更加简洁易读。
2025-11-24 13:27:42
469
原创 【匿名函数是什么?java中有匿名函数吗?】
无显式函数名:没有给函数起名字(比如是“命名函数”,是匿名函数);临时使用:通常作为参数传递(比如回调函数)或一次性执行,不用复用;语法简洁:省略函数名,聚焦核心逻辑(这是它的核心价值)。无显式名字、临时使用、简洁聚焦逻辑;Java 中没有独立的匿名函数(受“面向接口/类”设计限制);Java 通过两种方式实现匿名函数的效果:Java 8 前:匿名内部类(繁琐,依附接口/抽象类);Java 8 后:Lambda 表达式(简洁,依附函数式接口,推荐使用);
2025-11-17 16:36:30
843
原创 【JS中 箭头函数的核心优势:避免了传统匿名函数 this 指向混乱的问题、契合 Lambda 无副作用的特点】
/ 外部变量// 有副作用的函数:修改了外部变量 globalNum// 副作用:修改外部变量add(2, 3);// 15(外部环境被修改了)这个函数虽然能实现两数相加,但它修改了外层的globalNum,属于“有副作用”,不符合 Lambda 纯函数的思想。一个函数可以「解决了thisname: "张三",hobbies: ["篮球"],this.name = "李四";// 有副作用:修改了外部对象的属性。
2025-11-17 14:58:16
1040
原创 【什么是传统匿名函数?】
匿名」:函数没有自己的名字(比如是“命名函数”,是“匿名函数”);「传统」:相对于 ES6 箭头函数(() => {})而言,是 ES6 之前就存在的写法;function(参数) { 函数体 }(没有函数名,直接用function开头)。本质:无名字 +function关键字定义的函数,ES6 前的“匿名函数唯一写法”;核心用途:作为回调函数(如forEachsetTimeout)、赋值给变量复用、立即执行函数(IIFE);this动态绑定、有arguments对象、可作为构造函数;
2025-11-17 14:49:34
283
原创 【JS 有 lambda表达式吗】
JavaScript没有专门的Lambda表达式语法,但其箭头函数(() => {})完全实现了Lambda的核心功能。箭头函数作为匿名函数的简洁写法,完美契合Lambda表达式的三大特征:作为高阶函数参数、表达简单逻辑、实现纯函数。在数组操作(map/filter)、简化函数定义、异步回调等场景中,箭头函数与其他语言的Lambda表达式功能完全一致。虽然语法形式略有差异(使用=>符号而非lambda关键字),但JS箭头函数通过自动绑定this、不能用作构造函数等特性,充分体现了Lambda函数
2025-11-17 14:04:55
673
原创 StringBuilder 和 StringBuffer核心区别
单线程场景(90% 的开发场景,比如你的 SQL 拼接)优先用或字符串拼接/文本块(语法糖),性能最优、写法简洁;多线程场景(并发共享拼接)简单需求:用(自带锁,无需手动处理);高性能需求:用StringBuilder + 手动锁(比如或),锁粒度更灵活,避免全局锁的开销;线程安全换性能,无并发用 StringBuilder,有并发用 StringBuffer 或加锁的 StringBuilder。
2025-11-07 11:23:34
941
原创 【volatile】
想象有一个多人合作的项目,大家都在一个共享的办公室工作,办公室里有一块公共的白板,上面记录着项目的关键信息,比如项目进度、待办事项等。这块白板就好比是计算机内存中的共享变量。每个开发人员都有自己的办公桌(好比每个线程都有自己的工作内存),他们会时不时地去白板上查看信息,然后在自己的桌子上工作,完成一些任务后再把结果更新到白板上。但是,这里可能会出现一个问题:由于每个人都在自己的桌子上工作,有时候一个人更新了白板上的信息,其他人可能不会马上知道。
2025-10-17 15:04:27
179
原创 【Java序列化与反序列化详解】
→ 对象→字节序列;→ 字节序列→对象;(版本控制)、transient(排除临时字段);核心价值:支持数据持久化、网络传输、跨语言交互、缓存优化,是复杂Java程序(如分布式系统、客户端/服务器应用)的基础能力。
2025-10-16 17:20:52
801
原创 throw && throws
Java中throw和throws的区别: 用途:throw用于手动抛出异常,throws声明方法可能抛出的异常类型 语法:throw在方法体内使用,throws在方法声明中使用 处理:throw抛出的异常需要捕获,throws声明的异常由调用者处理 场景:throw用于主动抛出错误,throws用于传递受检异常 示例: void method() throws IOException { // 声明 if(error) throw new IOException(); // 抛出 }
2025-10-14 10:37:36
301
原创 【垃圾回收】
后,从程序逻辑上看这两个对象应该不再被使用,可被回收。但由于它们相互引用,按照引用计数法,它们的引用计数器值都不会变为0,导致这两个对象一直无法被回收,造成内存泄漏。所以,尽管引用计数法实现简单且判断效率较高,但由于这个严重缺陷,未被Java主流垃圾回收器采用。所指向的对象生命周期结束时,该对象的引用计数器值就会变为0,从而被认为是可回收对象。都指向同一个对象,该对象的引用计数器的值为2。引用计数法最大的问题在于无法处理对象之间的循环引用。,所以对象的引用计数器值减为1。,此时指向该对象的引用还剩。
2025-09-11 17:19:50
524
原创 【深入理解JVM】
JVM(Java虚拟机)是Java技术的核心,它实现了Java次编写,到处运行的平台无关性,通过将字节码转换为具体平台的机器指令。JVM负责内存管理,包括对象内存分配和垃圾回收,无需开发者手动管理内存释放。作为运行时环境,JVM通过解释执行或即时编译(JIT)技术执行字节码。其设计遵循Java规范,确保不同JVM实现上的程序兼容性。 关键JVM相关关键字: synchronized:实现线程同步,基于JVM的Monitor机制 volatile:保证变量可见性,防止指令重排序
2025-09-09 10:29:24
596
原创 【synchronized】
Java的synchronized关键字通过对象锁实现线程同步,确保线程安全。可使用方式包括修饰实例方法、静态方法或代码块,分别基于实例对象、Class对象或指定锁对象。JVM层面通过Monitor机制实现,字节码使用ACC_SYNCHRONIZED标志或monitorenter/monitorexit指令。JDK对锁进行了优化,包括偏向锁(减少同一线程重复获取的开销)、轻量级锁(CAS避免阻塞)和适应性自旋(动态调整自旋次数)。这些机制共同提升了多线程环境下的性能表现。
2025-09-04 09:42:44
900
原创 Java和数据库的关系
一个只会写Java代码但不懂数据库的工程师,就像一个物流调度员不知道仓库的容量、货架规则、叉车性能一样,他发出的指令很可能效率低下,甚至导致仓库瘫痪(数据库瓶颈)。数据库(MySQL, Oracle等) 就像一个专业的仓库,它有自己的管理体系、安保措施(权限)、货物摆放规则(索引)和进出流程(事务)。数据库本身是一个独立的、巨大的知识领域,但“数据库的使用、优化和深度理解”绝对是Java后端工程师进阶的核心组成部分。Java后端程序 就像是操作这个仓库的整个物流系统,包括下单、调度、打包、运输等。
2025-08-23 21:55:20
368
原创 (existing, replacement) -> existing
是 Java 中处理 Map 键冲突的合并函数,主要用于等需要处理重复键的场景。这是一个existingexisting当使用定义当时,如何处理值的冲突。
2025-07-04 17:21:20
450
原创 关于Stream
Stream API 通过中间操作和终止操作的组合,提供了一种高效、灵活且易读的方式来处理集合数据。掌握这些操作可以让你的代码更简洁、更具表现力。
2025-05-07 15:07:07
1236
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅