- 博客(131)
- 收藏
- 关注
原创 MySQL索引优化
使用EXPLAIN + SQL语句可以模拟 MySQL 优化器执行查询,清晰看到 SQL 的执行路径、索引使用情况、性能瓶颈,是索引优化的必备工具。
2026-04-07 18:10:51
279
原创 MySQL索引
索引是帮助 MySQL 高效获取数据的数据结构。索引的本质可以理解为排好序的快速查找数据结构,通过特定的数据结构指向数据表数据,依托高效的查找算法,大幅提升数据检索速度。
2026-04-07 18:04:25
320
原创 B树和B+树详解
B 树也叫 B- 树,是一种平衡的多路查找树,这里的 “路” 可以理解为每个节点能存储的关键字数量。B+ 树是 B 树的优化版本,MySQL InnoDB 索引底层就是 B+ 树,也是实际工程中最常用的结构。B 树是多路平衡查找树,解决了二叉树过高、磁盘 I/O 过多的问题;B+ 树是 B 树的优化版,非叶子节点只存索引,数据全在叶子节点且链表化;B 树适合随机查找,B+ 树适合范围查询、数据库索引场景;
2026-04-01 17:18:51
487
原创 Redis(三)
哨兵(Sentinel)是一个独立运行的进程,核心作用是 “监控 + 自动故障转移”,基于主从复制架构,实现 Redis 集群的高可用。监控:实时监测主节点、从节点的运行状态,通过发送命令,判断节点是否正常;自动故障转移:当监测到主节点宕机,自动投票选举一个从节点,将其切换为新主节点,并通知其他从节点更新主节点配置,全程无需人工干预。为了避免单哨兵故障,生产环境通常采用 “多哨兵模式”,哨兵之间互相监控,提升集群稳定性。去中心化:无中心节点,连接任意一个主节点,都能操作整个集群;
2026-04-01 14:46:48
349
原创 Java并发面经(三)
AQS 是 Java 并发包的底层同步框架,它通过一个 state 变量来标识资源的占用状态,使用 CAS 对 state 进行原子修改,同时依靠一个 CLH双向FIFO队列对抢锁失败的线程进行排队管理,队列里等待最久的线程能优先获取资源实现公平锁,也支持线程从队列两端操作实现非公平锁的插队,并实现线程的阻塞与唤醒,以此完成整套线程同步机制。它们一直盯着主节点,一旦主节点崩了,哨兵会自动在从节点里选举一个新的主节点,让系统继续能用,不用人手动去改配置,保证 Redis 不会因为主节点挂掉就直接瘫痪。
2026-04-01 14:34:37
318
原创 Redis(二)
读写性能差,无法满足高并发的高效读写需求;存储空间利用率低,空字段仍需分配空间;表结构固定,灵活度低,难以适配快速变化的业务需求。Redis 作为高性能的内存数据库,不仅是缓存工具,更是支撑高并发、海量数据场景的核心组件。掌握其核心数据类型和应用场景,结合关系型数据库的持久化优势,能极大提升系统的性能和稳定性。本文从基础概念到实战命令,覆盖了 Redis 的核心知识点,后续可深入学习 Redis 持久化(RDB/AOF)、主从复制、哨兵模式、集群等高级特性,进一步夯实 Redis 技术栈。
2026-03-30 15:09:57
390
原创 Redis (一)
Redis 是内存数据库,数据默认存于内存,持久化即把内存数据写入磁盘。重启时通过持久化文件恢复数据,混合持久化下优先使用 AOF 恢复,因其数据完整性更高。
2026-03-30 14:34:49
735
原创 MySQL事务
事务(Transaction)是数据库中一组不可分割的操作集合,这组操作遵循 “要么全部执行成功,要么全部执行失败” 的原则,不存在 “部分成功、部分失败” 的中间状态,简单来说就是 “要么做完,要么不做”。重要前提:MySQL 中只有InnoDB 引擎支持事务,MyISAM 引擎无事务特性,这也是 InnoDB 成为后端开发主流存储引擎的核心原因之一。此外,MySQL 默认开启自动提交模式,即每一条 SQL 语句都是一个独立事务;若需将多个 SQL 组合为一个事务,需手动控制事务的开启、提交与回滚。
2026-03-30 14:27:28
457
原创 AQS详解
AQS 是包下的抽象类,它封装了一套通用的线程同步机制管理同步状态(资源的占用 / 释放标记)阻塞 / 唤醒等待的线程维护线程等待队列当线程获取锁失败时,不进入阻塞状态,而是通过无限循环(自旋)不断尝试获取锁,直到成功为止。线程不休息,一直循环 “问” 锁是否释放。// 自旋锁核心逻辑if(尝试获取锁成功){break;// 否则继续循环AQS 是什么?抽象队列同步器,JUC 核心,用state状态 + CLH 双向队列实现线程同步。AQS 核心原理?用标记资源状态,CAS 原子修改。
2026-03-29 21:56:23
360
原创 Java并发面经(二)
JDK7:核心是分段锁机制。操作数据时,先定位到对应的 Segment,然后对该 Segment 加锁(),只阻塞操作同一 Segment 的线程,不影响其他 Segment 的读写,既保证了线程安全,又避免了全表锁的低效。JDK8:通过组合实现。读操作利用volatile修饰的 Node 节点保证可见性,无需加锁;写操作时,先通过 CAS 尝试无锁更新,若失败(存在并发冲突)则对当前桶节点加锁,只锁当前桶,锁粒度极细,并发效率大幅提升。
2026-03-28 09:58:54
414
原创 原子操作的实现原理
原子操作是计算机系统中最小的不可分割执行单元执行不可中断:操作从开始到结束,不会被线程切换、中断或其他执行流打断。结果要么全有要么全无:不会出现 “执行一半” 的脏数据,保证数据一致性。简单来说,原子操作就像 “要么做完、要么不做” 的最小执行步骤,是实现无锁并发、轻量级同步的基础。单核:关中断 / 临界区,阻止线程切换与中断,实现单执行流原子性。多核早期:锁总线,粗粒度独占内存,保证原子性但效率低。多核现代。
2026-03-26 17:11:56
450
原创 Java并发面经(一)
偏向锁的作用是为了消除无竞争情况下的锁开销锁会偏向于第一个获取它的线程,如果在接下来的运行过程中,没有其他线程竞争这把锁,那么持有偏向锁的线程后续再次获取锁时,不需要进行任何 CAS 操作,也不需要同步开销,直接可以重入进入同步块,从而大幅提高执行效率。只有当有其他线程尝试竞争该锁时,偏向锁才会停止偏向,进行偏向锁撤销,并升级为轻量级锁。轻量级锁是 JDK1.6 对的一种锁优化,适用于多个线程交替执行同步代码、竞争不激烈的场景。当偏向锁升级为轻量级锁时,线程会在自己的栈帧。
2026-03-26 10:22:11
315
原创 Java线程池
OverrideSystem.out.println(Thread.currentThread().getName() + " 执行业务");// 自定义线程池new ArrayBlockingQueue<>(3), // 有界队列new ThreadPoolExecutor.AbortPolicy() // 默认拒绝策略try {// 模拟提交 9 个任务i < 9;i++) {前 2 个:核心线程执行接下来 3 个:进入队列。
2026-03-25 15:58:24
883
原创 ConcurrentHashMap讲解
ConcurrentHashMap 是 Java 并发集合的巅峰设计之一,核心思路是用细粒度并发控制替代全局锁JDK1.7 靠分段锁实现基础并发安全;JDK1.8 升级为 CAS + synchronized 桶级锁,搭配红黑树与并发扩容,成为高并发首选。
2026-03-25 15:52:01
535
原创 AI 视觉图像形状识别全流程解析
先通过灰度化、颜色过滤等手段简化图像信息;再通过边缘检测、池化等操作提取核心轮廓特征;最后通过形状分析、求导运算完成对象识别。这套思路不仅适用于形状识别,也为更复杂的图像分类、目标检测任务奠定了基础,是计算机视觉入门的核心知识点。
2026-03-25 14:01:59
459
原创 线程间的通信
线程操作资源类:将共享数据和操作封装到独立的资源类中,高内聚低耦合判断 - 干活 - 通知:在资源类方法中遵循 "判断条件→执行逻辑→通知其他线程" 的流程防止虚假唤醒:使用 while 循环替代 if 判断等待条件。
2026-03-23 22:43:14
492
原创 Lock锁
支持公平 / 非公平策略;支持可重入(读锁可重复获取读锁,写锁可重复获取写锁 / 读锁);支持锁降级(写→读),不支持锁升级(读→写);读多写少场景下效率远高于独占锁,但需注意写线程饥饿问题。是灵活的独占锁,支持可重入、公平锁、限时等待,可解决无法处理的死锁、中断等问题;适配读多写少场景,通过 “读读共享、写写 / 读写互斥” 平衡安全性和效率;锁降级是读写锁的重要优化手段,需遵循 “先获取读锁、再释放写锁” 的规则;
2026-03-23 22:37:44
481
原创 Java 并发编程核心:CAS 原理
很多同学疑惑:比较 + 交换明明是两步,为什么不会被其他线程打断?CAS 不是 Java 代码实现,而是 CPU 硬件级别的单条原子指令。单条指令执行过程不可分割、不可中断,要么全部完成,要么完全不执行,从硬件层面保证了原子性。CAS = 比较并交换,无锁、轻量、基于 CPU 原子指令;三参数:V(当前值)、A(预期值)、B(新值);流程:读取 → 计算 → 比较交换 → 失败自旋;Java 中使用 Atomic 原子类快速实现 CAS;
2026-03-23 10:57:16
497
原创 深入理解 synchronized:到底锁的是谁?
写法锁对象作用范围实例方法 synchronized当前实例 this同一实例互斥静态方法 synchronized当前类 Class全局所有实例互斥同步代码块 synchronized (obj)指定对象 obj仅锁 obj 范围。
2026-03-22 22:55:22
241
原创 Java死锁
死锁是并发编程中最隐蔽、最危险的问题之一,指两个或多个线程在执行过程中,因互相持有对方需要的资源而陷入无限等待的状态,若无外力干涉,所有线程将永远阻塞,程序无法继续运行。你拿着我要的锁,我拿着你要的锁,谁都不放手,谁都动不了。死锁是并发编程的经典陷阱,看似简单却极易在复杂业务中隐藏。理解 4 个必要条件、掌握检测工具、遵守编码规范,就能有效避免死锁。少用锁嵌套、固定加锁顺序、优先使用定时锁,让你的并发程序稳定运行,远离死锁困扰。
2026-03-22 22:39:51
262
原创 K8s详解
Kubernetes 是云原生时代的操作系统,以声明式 API为核心,通过 Master-Worker 架构实现容器的自动化部署、调度、自愈、扩缩容、滚动更新、负载均衡。它彻底解决了大规模容器集群的管理难题,是现代微服务、DevOps、云平台的基石。不懂 K8s,未来三年一定会被淘汰;学好 K8s,就是握住了进入大厂、升职加薪的钥匙。
2026-03-21 11:02:36
442
原创 普通成员变量、静态变量、static final 常量的赋值全过程
普通成员变量:属于对象,不 new 就不存在,类加载全程不管,只在创建对象时赋值。静态变量:属于类,类加载时先给默认值,初始化阶段才给你代码里的真实值。static final 常量:编译期就确定值,准备阶段直接赋值,一步到位。
2026-03-20 14:53:01
354
原创 Java垃圾回收器
垃圾回收(GC)是 Java 区别于 C/C++ 的核心特性之一,它让 JVM 自动管理内存,释放无用对象,大大降低了内存泄漏与野指针的风险。JVM 自动识别堆中 “死亡” 的对象,并释放其占用内存的过程。怎么判断对象已死?怎么回收垃圾?单线程回收,简单高效,适合客户端。初始标记(STW)→ 并发标记 → 最终标记(STW)→ 筛选回收(STW)。通过可控停顿、优先回收高价值 Region,实现低延迟、无碎片、高稳定。Java 垃圾回收是 JVM 自动管理内存的核心机制,通过可达性分析。
2026-03-19 10:54:11
358
原创 Java 四种引用:强、软、弱、虚
强引用为什么会 OOM?强引用只要存在,GC 绝不回收,内存不够直接 OOM。软引用和弱引用的区别?软引用:内存不足才回收。弱引用:只要 GC 就回收。软引用适合做什么?缓存,防止 OOM。弱引用常见场景?虚引用能干什么?监听对象回收,无法获取对象,用于资源释放。哪种引用完全不影响 GC?虚引用。
2026-03-19 10:45:26
309
原创 Java的垃圾回收机制
判断哪些对象是垃圾(可以回收)回收垃圾内存所以,“如何判定对象已死”是 GC 的第一道关卡,也是面试必问。对象没有任何有效引用时,就可以被判定为垃圾,等待回收。Java 如何判断对象可回收?通过可达性分析,从 GC Root 搜索引用链,不可达即判定为垃圾。为什么不用引用计数法?无法解决循环引用问题。哪些可以作为 GC Root?栈帧里的局部变量、方法参数类静态变量本地方法(JNI)引用活动线程循环引用的对象能回收吗?能。只要和 GC Root 断开连接,就会被判定为垃圾。对象可以自救吗。
2026-03-19 10:41:38
391
原创 Java双亲委派模型
要理解双亲委派模型,得先知道类加载器(ClassLoader)是什么。简单说,类加载器就是负责把.class字节码文件加载进 JVM 内存,生成对象的工具。类加载器类型全称加载范围核心作用引导类加载器JVM 核心类库(rt.jarjre/lib下的核心类)加载 Java 最基础的核心类(如),由 C++ 实现,是所有类加载器的顶层平台类加载器JDK 扩展类库(下的类)加载扩展功能的类,承上启下应用类加载器项目自身的类路径(classpath下的类,包括我们写的代码、第三方依赖)
2026-03-19 10:38:21
437
原创 JAVA类的加载过程
类加载就是 JVM 把.class文件读进内存,并对数据进行校验、转换、解析、初始化,最终形成可以被虚拟机直接使用的 Java 类型的过程。加载 → 验证 → 准备 → 解析 → 初始化 → 使用 → 卸载验证 + 准备 + 解析 = 链接(Linking)加载(读文件) → 链接(验、备、解) → 初始化(执代码) → 使用 → 卸载只要把这 5 步的作用、关键点、面试坑点记牢,JVM 类加载这一块你就彻底稳了。
2026-03-19 10:33:52
455
原创 Java OOM异常
是 JVM 抛出的错误(Error),表示内存资源耗尽,无法完成对象分配,且垃圾回收(GC)后仍无足够内存。⚠️注意:OOM 是错误,不是异常(Exception),无法通过 try-catch 捕获处理,只能通过优化配置或代码解决。OOM 是什么?JVM 堆内存耗尽,无法分配对象,GC 后仍无足够内存的错误。OOM 和 StackOverflowError 的区别?OOM 是堆内存不足,StackOverflowError 是栈深度超出限制(线程栈溢出)。如何避免 OOM?
2026-03-19 10:31:52
462
原创 Java序列化和反序列化
序列化和反序列化是一对互逆的操作,核心围绕Java 对象与字节序列的转换展开,是实现对象数据跨存储、跨网络传输的基础。序列化:将内存中的 Java 对象转换成二进制字节序列的过程。转换后的字节序列可以脱离 JVM 独立存在,支持写入文件、存入数据库、通过网络传输到其他服务器等场景。反序列化:将二进制字节序列恢复成Java 对象的过程。通过反序列化,可在其他 JVM 进程、其他服务器中重建与原对象数据一致的实例,恢复对象的属性和状态。核心应用场景对象持久化。
2026-03-17 22:45:51
541
原创 HTTPS 加密传输原理
HTTPS 采用对称加密与非对称加密结合的方式:服务器通过下发数字证书证明身份,客户端验证证书后获取合法公钥;使用公钥加密对称密钥完成安全交换,后续通信全程使用对称密钥加密数据;既保证了密钥传输的安全性,又保证了数据传输的效率,实现防窃听、防篡改、防伪造。
2026-03-17 14:50:25
451
原创 JSoup:Java 处理 HTML 的实用利器,从基础到实战爬取教程
JSoup 凭借轻量、易用、功能强大的特点,成为 Java 开发中处理 HTML 的必备工具,无论是简单的 HTML 解析,还是复杂的网页数据爬取,都能高效完成。本文介绍的核心特性、核心类、基础步骤是使用 JSoup 的基础,而豆瓣电影、智联招聘的案例则为实际应用提供了参考,最后的 2024 中国大学排名爬取作业,更是检验学习成果的重要实践。在实际开发中,使用 JSoup 爬取数据时,需遵守目标网站的robots.txt。
2026-03-17 14:46:12
629
原创 必须掌握的八大JAVA排序(二)
排序算法平均时间复杂度最坏时间复杂度空间复杂度稳定性核心适用场景冒泡排序O(n²)O(n²)O(1)稳定少量数据、入门学习选择排序O(n²)O(n²)O(1)不稳定少量数据、交换成本高插入排序O(n²)O(n²)O(1)稳定小规模、近乎有序数据快速排序O(n log n)O(n²)O(log n)不稳定大规模无序数据(工程首选)归并排序O(n log n)O(n log n)O(n)稳定大规模数据、对稳定性要求高堆排序。
2026-03-16 15:19:43
1000
原创 计算机网络面经
使用三次握手是为了确认客户端和服务器的发送、接收能力都正常,并且同步双方的初始序列号。两次握手无法确认客户端的接收能力和服务器的发送能力正常,还可能因为网络延迟导致失效的连接请求到达服务器,造成服务器资源浪费,三次握手是保证可靠连接的最小次数。
2026-03-16 14:27:26
653
原创 HashMap的扩容和迁移
扩容触发条件size > 容量 * 0.75(1.7/1.8 共用);1.8 新增「链表长度 > 8 且数组长度 < 64」时优先扩容。新下标计算:利用快速判断,避免重复计算hash % 新容量。1.7 与 1.8 核心差异:头插法 vs 尾插法、逐个迁移 vs 整体拆分、无红黑树 vs 红黑树支持。并发安全问题:1.7 头插法可能导致环形链表死循环,1.8 尾插法解决此问题。红黑树降级规则:扩容后树节点数 ≤ 6 时退化为链表,避免频繁树化 / 链表化切换。
2026-03-15 22:00:09
469
原创 新Java基础(二十五):lamada表达式
要掌握 Lambda 表达式,首先要明白它背后的函数式编程思想数学中的函数:有输入量和输出量的一套计算方案,核心是拿数据做操作,关注操作本身;面向对象编程:强调必须通过对象的形式做事情,所有操作都要依附于对象,即使是简单的逻辑,也需要创建类、实例化对象才能执行;函数式编程思想忽略对象的复杂语法,强调做什么,而不是以什么形式去做,把函数(方法)作为独立的操作单元,直接传递和执行。
2026-03-14 10:52:42
268
原创 新Java基础(二十四):接口
接口(Interface)是 Java 中一种纯粹的抽象类型,它是对一组行为的抽象规范,只定义行为的声明,不关注行为的具体实现,由实现类去完成具体的逻辑。我们可以把接口理解为一份 “契约”:实现接口的类,必须遵守接口中定义的所有行为规范,实现接口中的所有抽象方法(特殊情况除外)。而接口的设计,核心是为了解决 Java单继承的局限性,同时实现代码解耦和行为标准化。
2026-03-14 10:48:43
337
原创 新Java基础(二十三):抽象类
在面向对象的设计中,我们会遇到这样一种情况:某个父类只定义了子类共同的行为特征,却无法具体实现该行为,因为不同子类的实现方式各不相同。假设你的公司要进行招聘,招聘2名产品经理,10名程序员,现在让你和小A设计这个网站让报名人员填写基本信息。大概有两种设计方式----。小A的设计方法:但是我们发现这两个页面基本上内容是相同的,于是你的设计方法是这样的:我们将一些相同的信息都提取到一起我们把这个过程叫做----抽象抽象类的本质。
2026-03-14 10:41:24
476
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅