- 博客(33)
- 收藏
- 关注
原创 Windows版 Docker + WSL2 超详细安装路线
我这台轻薄本 C 盘本来就不宽裕,第一次按教程 wsl --install 装完,Ubuntu 和 Docker 的镜像盘全落在了 C 盘,一个多星期就少了好几个 G。这篇是重装一遍的完整记录:Ubuntu 用 import 放进 D 盘、Docker 用安装参数放进 F 盘、内存用 .wslconfig 按住,最后 Windows 和 Ubuntu 两边都能敲 docker。
2026-11-06 20:35:23
原创 MyBatis-Plus 比 MyBatis 到底多了什么
本文分享了从原生MyBatis迁移到MyBatis-Plus的实战经验。作者指出,MP并非替代MyBatis,而是其增强工具,核心优势在于减少样板代码:通过BaseMapper实现单表CRUD无需编写SQL;使用Lambda条件构造器以Java方式构建动态查询;分页只需传入Page对象并注册插件;实体类注解(如@TableLogic、@Version、自动填充)大幅简化开发。同时提醒:多表关联仍需手写SQL,性能无提升,日志需开启以便排查问题。迁移建议分步进行,避免因逻辑删除等特性导致数据异常。最后强调,M
2026-11-03 20:27:07
96
原创 Shiro 整合 JWT 的过程
:课设做前后端分离,登录本来用的是 session,第二天就出事了——前端换个端口、我重启一次后端,登录状态就没了。这篇记录我怎么把 Shiro 里的 session 换成 JWT:三个类、一个配置类,加上踩的一堆坑。代码都能直接跑。
2026-11-02 23:33:24
131
原创 MySQL 的四种隔离级别
本文聚焦数据库事务隔离级别,阐述SQL标准的四个级别:读未提交(RU)、读已提交(RC)、可重复读(RR)、串行化(Serializable),按严格程度递增。核心观点为:隔离性通过加锁换取,级别越高,并发越差。重点解析脏读(读未提交)、不可重复读(读已提交)、幻读(可重复读)的本质及应对机制。指出MySQL默认使用RR,而Oracle/PostgreSQL默认为RC,迁移时需注意隔离级别差异。关键区别在于ReadView生成时机:RC每次查询刷新快照,RR仅首次SELECT时生成,确保事务内一致性。建议生
2026-11-02 19:02:53
220
原创 什么是Elasticsearch、ES
Elasticsearch 是一个基于 Lucene、分布式、近实时的全文检索引擎,用来快速对海量数据做搜索、过滤、聚合统计。
2026-10-27 18:06:17
422
原创 面试官问的 Redis 都在这了
两个月前我以为加个缓存是"五分钟的事"。现在回头看,Redis 真正难的地方不在命令记不记得住 —— SETGET十分钟就学会了。为什么单线程反而更快?→ IO 多路复用为什么SETEX比SETEXPIRE好?→ 原子性为什么同样是存字符串,有的叫embstr有的叫raw?→ 编码优化为什么缓存突然变慢?→ 可能是大 key、可能是内存碎片、可能是持久化在 fork缓存和数据库不一致了怎么办?→ 接受最终一致,用 TTL 兜底数据结构 → 内存管理 → 持久化 → 高可用 → 应用场景。
2026-10-23 00:10:29
188
原创 谈谈《MySQL 事务》
学 MySQL 绕不开事务。这四个字听着简单,真往下挖,底下压着 undo log、redo log、binlog、MVCC、Read View、临键锁一大串东西。这篇文章我从一个转账的事故讲起,先聊聊 ACID 到底在保证什么,再一层层往下拆:脏读、不可重复读、幻读是怎么来的,四种隔离级别各自堵住了哪个洞,InnoDB 又是靠什么把默认的可重复读(RR)做到"基本没有幻读"的。中间所有关键机制都配了图和可以直接跑的 SQL 演示,读完至少能跟面试官把这条线从头到尾讲一遍,而不是只会背四个字母。
2026-10-19 17:42:23
164
原创 SpringMVC 到底是怎么干活的?
SpringMVC 把一次 HTTP 请求拆分成多个组件分工协作,每个组件各司其职、解耦配合,弄懂这套流程,再写接口时就不再只停留在调用 API 的表层,能够看透框架背后到底在帮我们做哪些事。
2026-10-16 17:47:52
133
原创 Spring Bean 生命周期
Spring Bean生命周期可分为四大阶段:实例化、属性填充、初始化(含Aware接口、BeanPostProcessor、InitializingBean及自定义init方法)和完成(存入单例池)。通过BeanDefinition管理配置,利用BeanFactoryPostProcessor和BeanPostProcessor实现扩展。核心在于从创建到可用再到销毁的全过程,本质是Spring对对象生命周期的全面管理。
2026-10-15 15:18:29
158
原创 CMS 与 G1 垃圾收集器的对比
CMS 和 G1 是 Java 两款经典垃圾收集器。CMS 采用传统连续堆布局,基于标记 - 清除算法,仅初始标记、重新标记阶段 STW,追求低延迟,但不压缩内存,容易产生大量碎片,停顿时间不可控,存在并发模式失败风险,适合小堆稳定的老项目,JDK9 后逐步淘汰。G1 将堆切分为多个 Region,采用标记 - 复制做局部压缩,拥有可预测停顿模型,可配置最大 GC 停顿时间,分片回收垃圾最多的 Region,大幅缓解内存碎片问题,适合 6G 以上大堆业务,JDK9 起成为默认 GC。两者都存在浮动垃圾;
2026-10-12 10:52:36
246
原创 为什么ThreadLocal会内存泄漏?
在 Java 开发中,ThreadLocal 是解决线程变量隔离的神器,广泛用于用户上下文传递、事务标识、参数透传等场景。但很多的Java开发者都听过:ThreadLocal 使用不当会导致内存泄漏。可能很多人会说,不就是"弱引用、未调用remove"搞得鬼吗?那今天我们就从JDK源码底层,完整拆解 ThreadLocal 内存泄漏的核心原理、发生流程、关键诱因,最后给出生产环境最佳实践,吃透这个高频面试+生产问题。
2026-08-14 17:24:46
352
原创 Java 并发锁的底层基石---AQS的深入理解
本文深入剖析 Java 并发底层基石 AQS,讲解 AQS 核心组成、独占锁获取完整流程,区分独占模式与共享模式,对比公平锁与非公平锁底层实现差异,结合ReentrantLock源码与流程图梳理竞争、排队、阻塞唤醒机制,厘清并发锁底层原理。
2026-08-11 21:04:56
196
原创 布隆过滤器的组成、原理、特点?以及面试手撕代码练习
先说说在日常使用场景中,什么时候我们会使用布隆过滤器,布隆过滤器又是什么呢?在日常开发中,我们经常会遇到海量数据判重、黑名单过滤、缓存穿透拦截等场景。就比如面试时面试官问你怎样判断1000w条手机号码是否在黑名单?如我们果直接使用数据库查询、HashMap、HashSet 存储,会面临内存溢出、查询效率低下、IO 耗时过高等问题。而此时布隆过滤器就是解决这类海量数据存在性判断场景的最优解之一。
2026-07-28 17:33:05
197
原创 Spring与MyBatis:谁先诞生?两者有何联系与区别?详细解析
Spring比MyBatis(前身iBatis)成熟更早,二者通过mybatis-spring整合互补,Spring管全局、MyBatis专注数据库,是Java后端必备技能。
2026-05-02 19:48:12
397
原创 来看看对《ConcurrentHashMap》总结
ConcurrentHashMap 是 Java 并发编程中线程安全且高性能的哈希集合,核心解决了 HashMap 线程不安全、Hashtable 锁粒度太粗的痛点。本文基于 JDK1.8 版本,从数据结构、putVal 核心插入流程、get 核心查询流程三个维度,拆解其底层实现与并发安全机制。
2026-04-18 14:58:52
381
原创 CopyOnWriteArrayList 源码:读写分离的线程安全 List 实现
本文深入解析 Java 并发包中CopyOnWriteArrayList的源码实现,围绕其读写分离、写时复制的核心设计思想,拆解锁定义、add/remove/set/get 等关键方法的执行逻辑,阐明其线程安全机制、优缺点与适用场景,帮助读者彻底掌握该读多写少场景下的高性能线程安全 List 容器。
2026-04-14 23:02:46
414
原创 新手-关于静态的小细节
/所以在main()主函数方法里不能创建非静态方法(创建了也没法在main()方法里直接用非静态方法),//普通的顶层类不能用 static 修饰 , 只有内部类才能用 static 修饰。解决:可以创建内部类,通过对象调用里面的非静态方法 --- 具体内部类两种。//只有内部类才能被称为"静态类"(内部类可静态可非静态)普通内部类:需要先 new 外部类,再 new 内部类。//main() 方法是静态的,属于类,不属于对象。//非静态方法属于对象,必须先创建对象才能调用。//关于静态的小细节。
2026-04-04 14:54:32
29
原创 蓝桥杯java-简易计算器历史记录功能
LinkedList:适合频繁的头删尾插(队列、栈、历史记录)ArrayList:适合随机访问、遍历多、增删少的场景 --- 特有方法 -> 头部删除 removeFirst()
2026-03-29 16:35:41
53
原创 java小细节1---trs == null || strs.length == 0这个顺序能不能颠倒
/ 如果 strs 为 null,访问 strs.length 会抛 NullPointerException。// 如果 strs 为 null,直接返回 true,不会执行后面。// 正确顺序(短路或)
2026-03-29 16:31:13
35
原创 线程池的执行流程
线程池的执行流程是核心参数的逻辑联动,记住「核心线程→任务队列→非核心线程→拒绝策略」的优先级,就能清晰理解其工作机制;而Executors提供的三种常用线程池,本质是对ThreadPoolExecutor参数的预配置,适配不同的业务场景:FixedThreadPool:固定线程数,稳定可靠,适合任务量稳定的CPU密集型场景;CachedThreadPool:弹性伸缩,适合大量短生命周期的I/O密集型场景;SingleThreadExecutor:单线程串行,适合需要顺序执行的任务场景。
2026-03-28 22:12:17
483
原创 泛型里的‘E’,是一种类吗?
如下代码public class MyArrayList <E> { // 这里的 E我们都知道这里的<E>是泛型类型参数,它本质上是一个 “变量”,用来代表 “某种具体的类型”。它不算是一种类。而且这里的E可以用任何合法的标识符来命名取代它,只要符合 Java 标识符规范。这里它的身份:它是一个“形参”(就像方法的参数int a一样)。这里它的作用:它在告诉编译器:“我现在不确定存什么类型,先留个坑,等使用者创建对象时,再把具体的类填进来。2. 使用阶段:E 被替换为具体的类。
2026-03-07 21:25:33
383
原创 Java 匿名内部类与普通接口实现类的区别
我常常在想匿名内部类的有名创建接口对象,和直接用一个类去implements这个接口,这俩有啥区别?不都是要重写接口里的方法,然后实现吗?
2026-02-10 10:50:28
361
原创 《ArrayList的初始化和扩容源代码解读》
解读 ArrayList 初始化与扩容逻辑:三种构造方法初始化数组,add()触发容量检查,grow()默认扩容 1.5 倍并处理容量上限,兼顾性能与内存优化。
2026-02-03 21:26:08
351
原创 谈谈《HashMap保存一个key-value键值对的过程》
HashMap 保存键值对的过程,本质是哈希计算定位桶 → 空桶直接插入 → 冲突则链表 / 红黑树处理 → 触发扩容则迁移节点的闭环逻辑,兼顾了插入效率与查询性能。
2026-01-29 09:30:55
556
原创 如何实现目录文件统计:计数、大小与类型汇总
Java 开发中,遍历目录并统计文件信息是常见需求,Java NIO 的Files.walkFileTree()方法封装了底层遍历逻辑,无需手动写循环 / 递归,结合SimpleFileVisitor能优雅实现该需求。本文通过实战案例,讲解如何快速实现目录文件的数量、总大小统计及文件类型分布汇总。
2026-01-28 19:07:24
389
原创 静态类和类的区别
普通类:是一个独立的、可以直接实例化的类,不需要依附于任何其他类。静态类:只能作为另一个类的静态内部类存在,不能单独定义在包下。它是静态成员的一种。// 可以直接创建对象// 静态内部类// 通过外部类.静态类 访问2.访问方式普通类:直接通过类名实例化,和其他类没有依赖关系。静态类:必须通过 “外部类。静态类” 的方式访问,不能脱离外部类。3.成员访问权限普通类:可以访问任何作用域内的变量和方法,没有特殊限制。静态内部类:只能直接访问外部类的静态成员。
2026-01-24 16:58:10
137
原创 String字符串进行==和equals(比较时的差异)
本文解析 Java String 内存机制:字面量赋值复用常量池对象,new 创建则堆中生成新对象;== 比地址,equals 比内容,intern () 可将堆字符串入常量池
2026-01-22 19:31:57
392
原创 Comparable 和 Comparator的区别,及使用场景
这种 “无侵入式” 的设计太实用了 —— 如果后续需要按标题长度、发布时间排序,只需新增对应的。最后我把代码里两次排序的逻辑合并了,实际开发中选一种方式就够了。如果让我推荐,我更倾向于。,因为它的灵活性和无侵入性,能让代码更健壮、更容易扩展。
2026-01-21 21:27:18
416
原创 《Java程序从编译到运行的过程》
二阶段:运行期由JVM主导,核心分两步:1.是加载字节码,JVM通过类加载器读取.class文件,完成验证、内存分配、符号解析等流程后初始化类,使字节码具备执行条件;运行中再识别频繁执行的热点代码,通过JIT一次性编译为本地机器码并缓存,后续直接复用提升效率,兼顾启动速度与运行性能。该字节码是JVM专属中间语言,与操作系统无关,这是跨平台的基础。大家好,我们知道Java程序的执行核心是“一次编译,到处运行”,整体分为编译期和运行期两个关键阶段,二者要协同实现跨平台与高效执行。
2026-01-12 17:09:14
137
原创 《Java为什么可以跨平台》
大家好,对于Java为什么可以跨平台这个问题,我来说说我的看法。我认为有两方面原因,一:我们无论使用什么操作系统下的电脑,我们所用java语言编写出来的java文件都能够通过不同JDK的javac编译器将java后缀文件,翻译成Class字节码文件,而这个字节码文件是通用的( 因为标准 javac 编译出的字节码本身与平台无关)。二:同样的Class字节码文件,能在不同操作系统下通过该操作系统下的JDK中的JVM将同样的Class字节码文件,解释执行成该操作系统能够识别的机器指令,再进而运行。
2026-01-12 16:40:25
171
原创 《我的单片机学习之旅》
无论是简单的传感器数据采集,还是复杂的设备控制,我都希望通过自己的努力,能够独立完成各种单片机项目的设计和实现。我也希望通过我的博客,能够记录下我在学习过程中的点点滴滴,包括遇到的困难、解决的方法以及收获的喜悦,希望能给同样对单片机感兴趣的朋友一些参考和帮助。最后我相信,只要我努力工作,积极进取,一定能够实现我的工作目标。我相信,在这样的团队中,我能够学到更多的知识,也能更好地发挥自己的优势。最后,我想说的是,学习单片机只是我实现目标的一个起点,我会不断努力,不断进步,朝着我的目标前进。
2025-03-17 22:10:45
279
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅