自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(31)
  • 收藏
  • 关注

原创 链表数据结构解析

链表(Linked List)是一种线性数据结构,其物理存储单元在内存中非连续分布,通过指针(引用)将各个节点串联形成逻辑上的线性序列。与数组结构相比,链表在插入与删除操作上具备时间复杂度优势,但在随机访问方面存在性能劣势。数据域(Data Field):存储实际数据元素。指针域(Pointer Field):存储指向下一个(或前一个)节点的引用。根据指针结构与连接方式,链表可分为单向链表、双向链表、循环链表等类型,每种类型适用于不同的应用场景。

2025-09-22 14:38:09 712

原创 Java 反射机制原理、框架应用与动态代理实现

Java 反射是 Java 语言在运行时动态获取类结构信息并操作类成员的能力。该机制由包提供支持,允许程序在运行期解析类元数据、构造对象实例、访问字段、调用方法,突破编译期静态绑定限制,实现高度动态化的程序行为。Class<T>:类元数据的入口,承载类结构信息。:封装类构造器,支持动态实例化。Field:封装类字段,支持读写操作,包括私有成员。Method:封装类方法,支持动态调用,包括私有方法。

2025-09-17 18:58:40 1017

原创 Java 集合解析

ArrayList 的核心是一个,名为。它不是固定大小的,而是随着元素增加动态扩容。size:数组连续内存 ,随机访问快(O(1)),但插入/删除慢(需移动元素)。

2025-09-16 10:09:44 778

原创 深入解析 Apache RocketMQ架构组成与核心组件作用

每个 Queue 一个文件,存储消息在 CommitLog 的 offset、size、tag hash(供 Consumer 快速定位)。NameServer 不存储消息,宕机不影响已建立连接的读写(路由缓存有效期内)。消费位点,记录 Consumer 已消费到的位置(存储在 Broker 或本地)。消费者组,同一组内负载均衡消费(每条消息只被组内一个 Consumer 消费)。:Master 写成功即返回,异步同步给 Slave(高性能,可能丢少量数据)。

2025-09-15 16:50:13 937

原创 深入理解线程模型

多个任务在同一时间段内交替执行(宏观上“同时”,微观上分时复用 CPU)。适用于 I/O 密集型任务。

2025-09-14 18:13:00 557

原创 动态规划算法学习总结

问题的最优解包含子问题的最优解。全局最优 = 局部最优组合子问题会被重复计算多次。暴力递归会超时,必须用 memo 或 dp table 优化三步解题法Step 1:定义状态 —— dp[i] 或 dp[i][j] 表示什么Step 2:写出状态转移方程 —— 如何从子问题推导当前状态Step 3:确定初始值 & 边界条件 —— dp[0], dp[1] 或 dp[0][0] 等。

2025-09-12 11:37:13 390

原创 Java 异常体系全解析

在 Java 世界里,异常(Exception)是程序运行时处理“非预期状态”的核心机制。如何定义错误边界?如何传递失败信息?如何保证系统在异常路径下依然健壮?

2025-09-11 19:26:46 754

原创 深入理解 Java 内存模型(JMM)

程序顺序规则:同一个线程内,前面的操作 happens-before 后面的操作监视器锁规则:解锁操作 happens-before 后续的加锁操作(同一个锁)volatile 变量规则:对 volatile 变量的写操作 happens-before 后续的读操作线程启动规则happens-before 该线程的任何操作线程终止规则:线程中的所有操作 happens-before 其他线程检测到它终止(如join()返回)线程中断规则happens-before 被中断线程检测到中断(如抛出。

2025-09-10 23:05:49 734

原创 Docker生产部署

Spring Boot 支持多 profile,Docker 可通过环境变量或挂载配置文件实现灵活切换。,可以把你的应用 + 依赖 + 运行环境打包成一个镜像,在任何支持 Docker 的机器上运行。真实项目往往不止一个服务 —— 还有 MySQL、Redis、Nginx 等。在 Spring Boot 项目的根目录下,创建。目录下的配置文件,优先级高于 jar 包内配置。Docker 是一个。Spring Boot 默认会加载。一键启动完整开发/测试环境。

2025-09-09 19:09:08 426

原创 JVM 内存结构与 GC 机制

Java 之所以“一次编写,到处运行”,靠的就是。它不仅负责执行字节码,还管理着程序运行时的内存分配、线程调度、垃圾回收等核心任务。

2025-09-08 11:02:18 1049 2

原创 RocketMQ分布式消息中间件的核心原理与应用

RocketMQ是阿里巴巴开源的分布式消息中间件,具有高吞吐、低延迟、高可用等特性,支持多种消息模式(普通/顺序/事务/延时消息)。其核心架构包含Producer、Consumer、Broker、NameServer等组件,通过异步通信实现系统解耦和削峰填谷。RocketMQ适用于高并发场景,提供消息持久化、主从同步等机制保障可靠性,并支持多语言客户端和主流框架集成,是构建分布式系统的理想消息中间件解决方案。

2025-09-07 23:41:48 1104

原创 Redis缓存三大经典问题:雪崩、穿透、击穿详解

缓存雪崩是指大量缓存数据在同一时间集中失效,导致所有请求直接打到后端数据库,数据库瞬间承受巨大压力,甚至可能被压垮。缓存穿透是指查询一个数据库中根本不存在的数据,由于缓存中没有,每次请求都会穿过缓存直达数据库,导致数据库压力剧增。缓存击穿是指某个热点数据在缓存中过期的瞬间,大量并发请求同时涌入,直接访问数据库,造成数据库瞬时压力激增。与雪崩的区别:雪崩是大量key同时失效;击穿是单个热点key失效。问题触发条件影响范围解决方案缓存雪崩大量key同时失效全局性,系统级风险。

2025-09-05 12:05:32 573

原创 MySQL并发问题解析

一个事务读取了另一个未提交事务的数据。

2025-09-04 19:23:51 820

原创 Redis的删除淘汰策略

Redis 提供了多种删除策略,以平衡内存使用效率和系统性能。和。

2025-09-03 14:49:02 260

原创 MySQL 索引核心知识全解析

回表是指:当你通过二级索引(非主键索引)查询数据时,数据库先在二级索引的 B+ 树中找到对应的主键值,然后再拿着这个主键值回到聚簇索引(主键索引)的 B+ 树中查找完整的数据行的过程。2. 为什么会产生回表?二级索引的叶子节点不存储完整的数据行,只存储索引列的值 + 主键值。当你的查询需要获取不在索引中的其他列时(比如SELECT *或但索引只有name),数据库就无法仅从二级索引中获取所有需要的数据。

2025-09-03 10:00:00 642

原创 Redis 持久化机制:RDB 和 AOF 原理与配置

RDB 是 Redis 的。

2025-09-02 10:12:44 770

原创 Redis常用数据类型底层实现

Redis 凭借其高性能、丰富的数据结构和灵活的使用场景,早已成为后端开发者的“标配”技能。尤其在高并发系统中,Redis 常被用作缓存、消息队列、分布式锁等核心组件。本文将剖析 Redis 五种核心数据类型的底层数据结构。

2025-09-02 10:00:00 1075

原创 Spring Boot 启动流程深度解析

扫描主配置类上的。

2025-09-01 01:37:46 620

原创 springboot的自动装配实现

Spring Boot 的自动装配(Auto-configuration)是其核心特性之一,它极大地简化了 Spring 应用的配置过程。

2025-08-25 14:17:10 305

原创 Spring中Bean的生命周期

Bean 是一个由 Spring IoC 容器创建、配置和管理的 Java 对象。它可以是任何类的实例,比如一个 Service、一个 Repository、一个 Controller,甚至是一个简单的配置类。Spring 容器负责这个对象的整个“生命”。如果Bean在Spring配置文件中配置了 init-method 属性,则会自动调用其配置的初始化方法。在 afterPropertiesSet()之后执行。初始化阶段执行顺序总结-->-->-->四、销毁阶段详解在destroy()

2025-08-18 15:33:31 788

原创 synchronized整体知识梳理

synchronized是 Java 中的内置锁机制,用于实现多线程环境下的线程安全。它是 基于 JVM 内部的监视器锁(Monitor Lock) 实现。

2025-08-11 19:16:11 976

原创 Mapper接口的工作原理

一、动态代理Mapper接口是在MyBatis框架中用于定义数据库操作方法的接口。它的工作原理主要依赖于MyBatis提供的动态代理机制和注解或XML配置文件来实现SQL语句的映射与执行。一、动态代理1.

2025-08-10 21:21:04 259

原创 JVM基础

Java是一种可以跨平台的编程语言,我们通常把CPU处理器与操作系统构成的计算机系统整体成为叫平台。Java可以跨平台的最主要原因是因为JVM,因为不同的平台,使用的JVM不一样。Java虚拟机负责将字节码文件翻译成特定平台下的机器代码,然后运行。简单来讲,Java的跨平台就是因为不同版本的 JVM。只要在不同的平台上安装相应的JVM,就可以运行字节码文件并运行我们编写的Java程序。

2025-07-30 12:00:00 904

原创 线程池的状态

关闭状态,调用线程池的shutdown()方法,可以切换到SHUTDOWN关闭状态。该状态的线程池不会接收新任务,但会处理工作队列中的任务,当工作队列为空时,并且线程池中执行的任务也为空时,线程池进入TIDYING状态。该状态的线程不会接收新任务,也不会处理阻塞队列中的任务,而且会中断正在运行 的任务,线程池中执行的任务为空,进入TIDYING状态。运行状态,线程池一旦被创建,就处于RUNNING状态,并且线程池中的任务数为0。整理状态,该状态表明所有的任务已经运行终止,记录的任务数量为0。

2025-07-24 17:25:33 135

原创 线程池的核心配置参数和流程

通过ThreadPoolExecutor类创建线程池与规定参数// 创建自定义线程池10, // 核心线程数100, // 最大线程数60, // 空闲线程存活时间new LinkedBlockingQueue<>(100), // 任务队列new ThreadPoolExecutor.CallerRunsPolicy() // 拒绝策略// 提交Runnable类型的任务// 关闭线程池try {if (!

2025-07-23 09:17:37 719

原创 学习CAS的后的理解分享

CAS的全称是“Compare And Swap”,中文意思是“比较并交换”。CAS是一种无锁算法的同步机制,用于对内存中的共享数据,进行原子性的读写操作,是CPU支持的一种对内存中的共享数据进行操作的特殊指令。

2025-07-22 09:23:50 443

原创 ArrayList核心代码阅读

【代码】ArrayList核心代码阅读。

2025-03-07 14:00:00 106

原创 Integer缓存池

Integer是int的封装类,封装了许多便于操作的方法,在Integer中存在一个缓存池机制,那么什么是缓存池呢?缓存池中存储了诸多对象,当调用这些对象时可以直接得到,不需要重新创建新的对象。Integer中缓存池范围是-128~127。我们通过下面这个例子可以看出在赋值127时"=="返回true,当超过127时,返回false,这就是缓存池的作用。

2025-03-05 14:00:00 487

原创 StringBuilder类的数据结构和扩容方式解读

String是一种不可变的字符串数据类型,可是平常使用时常常会需要可变的字符串数据类型,这里介绍一种类——StringBuilder。根据源码可以看出StringBuilder里是一个可变的字符数组,可以根据需要进行动态扩容。StringBuilder有多个初始化方式。分别为1.默认构造方法,初始容量为16。2.指定初始容量。3.基于字符串创建的构造方法。初始容量为字符串长度+16.使用append()方法添加时,如果时就会触发扩容机制。

2025-03-04 14:00:00 570

原创 String类的equals()的作用和源代码解读

首先要知道String类中的equals()方法是重写Object类中的equals()方法。我们在源码中可以看出Object类的equals()方法是用"=="比较,对于引用数据类型比较二者的地址,对于基本数据类型是比较二者的值。String中的equals()首先是使用"=="进行比较,作用和Object中是相同的。Object类是所有类的最高父类,此类中定义了许多的方法,如现在介绍的equals()方法。然后先对比两个字符串的长度是否相等,若相等再依次比较两个字符串的每一位是否相等。

2025-03-03 13:53:40 195

原创 String为什么是不可变的?

在调用方法后s1中存储的依然是"hello"字符串,而更改为大写后的字符串是重新创建出来的,并非在原来的"hello"基础上进行更改。final在Java中,当修饰基本数据类型时,其值不可被更改,即为常量。在String中,Java给我们提供了许多的方法,可以对字符串进行操作。我们在toUpperCase方法中可以看到最后是返回一个新创建的String,并不是将原有字符串更改后返回的。在Java中,String是一种引用数据类型,用来保存字符串,并且提供了一系列的方法来操作字符串。

2025-01-29 16:11:44 624 1

空空如也

空空如也

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

TA关注的人

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