自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

LiLiYuan.的博客

种一棵树最好的时间是十年前,其次是现在。

  • 博客(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

原创 【Java 6种线程状态】

2026-04-22 21:49:24 262

原创 【讲解线程的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

原创 【Spring MVC 请求链路,从浏览器到你的代码,完整走一遍】

Spring 会在启动时扫描所有。Spring MVC 找到对应的。

2026-04-17 10:57:04 51

原创 【MYSQL基础】

(别人插入/删除了数据并提交)**多了一行或少了一行**。

2026-04-14 10:53:40 42

原创 【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

原创 【什么是二叉树?什么是二叉堆?】

二叉堆和二叉树讲解

2026-03-15 15:24:53 186

原创 【如何理解递归链表?】

链表递归遍历的核心在于递归的“递”与“归”,对应链表的正序和倒序处理。递归遍历的本质是先处理当前节点(前序),再递归处理下一个节点,最后回溯处理当前节点(后序)。关键点包括: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

原创 在资源管理器打开IDEA未进行版本管理的文件的方法

【代码】打开IDEA未进行版本管理的文件的方法。

2026-01-23 16:35:27 265

原创 【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

原创 Arrays类和List接口的关联

在Java中,Arrays类和List接口之间存在多方面的关联,它们相互配合,方便对数据集合进行操作。

2025-11-13 11:17:53 441

原创 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

原创 静态方法没有独立的实例

静态方法没有独立的实例

2025-10-13 17:01:19 448

原创 【垃圾回收】

后,从程序逻辑上看这两个对象应该不再被使用,可被回收。但由于它们相互引用,按照引用计数法,它们的引用计数器值都不会变为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

原创 Comparator 比较器

假设存在。

2025-05-15 15:17:57 1596

原创 关于Stream

Stream API 通过中间操作和终止操作的组合,提供了一种高效、灵活且易读的方式来处理集合数据。掌握这些操作可以让你的代码更简洁、更具表现力。

2025-05-07 15:07:07 1236

原创 Filename too long 错误

Filename too long 错误表明文件名超出了文件系统或版本控制系统允许的最大长度。

2025-04-22 19:28:23 1106

空空如也

空空如也

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

TA关注的人

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