- 博客(213)
- 收藏
- 关注
原创 MySQL 中常见的日志有哪些?是如何实现事务的?
WAL(Wite-Ahead Logging)技术是一种数据库事务日志管理技术,它确保在修改真正的数据之前,先将修改记录写入日志,这使得即使系统崩溃,通过日志也能恢复教据,保证了数据的特久性和一致性当一个事务开始时,所有对数据库的修改都会先记录到一个日志文件中,而不是直接应用到数据库文件,这些日志记录了数据的变更信息,可以用于恢复数据.。当日志记录被安全地写入磁盘后,才会将这些修改应用到数据库文件中。
2025-08-14 09:00:00
947
原创 剑指offer-21、栈的压⼊、弹出序列
假设压⼊栈的所有数字均不相等。例如序列1,2,3,4,5 是某栈的压⼊顺序,序列4,5,3,2,1 是该压栈序列对应的⼀个弹出序列,但4,3,5,1,2 就不可能是该压栈序列的弹出序列。说明:可以通过push(1) => push(2) => push(3) => push(4) => pop() => push(5)=> pop() => pop() => pop() => pop();这样的顺序得到 [4,5,3,2,1] 这个序列,返回 true。输⼊:[1,2,3,4,5],[4,5,3,2,1]
2025-08-13 09:00:00
115
原创 剑指offer-20、包含min函数的栈
pop ⼀个元素的时候,如果栈为空则什么都不操作,如果栈不为空,则判断datas 的第⼀个元素是否和mins 的第⼀个元素相等。如果相等的话那么就需要将mins 和datas pop 出去第⼀个元素,否则只需要将datas 的第⼀个元素 pop 出去即可。push ⼀个元素的时候,都需要push 进datas stack ,但是push 进⼊mins stack 需要满⾜条件:当前的mins stack 是空的,直接放⼊。或者当前的mins stack 的栈顶元素⼤于或者等于push 进来的值。
2025-08-12 09:00:00
241
原创 MySQL事务原理:从ACID到隔离级别的全解析
脏读:读到其他事务未提交的数据;不可重复读:读取到其它事务已提交的数据,导致前后读取的数据不一致;幻读:前后读取的记录数量不一致。事务的 ACID四大特性,原子性、一致性、隔离性、持久性;原子性、隔离性、持久性都是为了保证最终的一致性当多个事务并发执行的时候,会引发脏读、不可重复读、幻读这些问题。要解决脏读现象,就要将隔离级别升级到读已提交以上的隔离级别,要解决不可重复读现象,就要将隔离级别升级到可重复读以上的隔离级别。对于读已提交和可重复读读已提交。
2025-08-11 09:00:00
849
原创 为什么要有 Buffer Pool?Mysql缓存能否替代Redis?
change_buffer 使 buffer_pool 里的一块内容Change Buffer是 MySQLInnoDB 存储引擎中的一个机制,用于暂存对二级索引的插入和更新操作的变更,而不立即执行这些操作,随后,当InnoDB 进行合适的条件时(如页被读取或 Flush 操作)会将这些变更写入到二级索引中如果当前表 针对 name 有一个二级索引。
2025-08-07 09:00:00
806
原创 剑指offer-19、顺时针打印矩阵
我们使⽤的是不断缩⼩矩阵上,下,左,右四个边界的⽅法。⾸先定义⼀个up (上边界为0 ), down (下边界为matrix.length - 1 ), left (左边界为0 ), right (右边界为matrix[0].length - 1 )。从第⼀个⾏第⼀个开始打印,向左边界遍历到右边界,之后将上边界加上1 (因为已经遍历完成上边界⼀⾏),判断上边界加上⼀之后是否⼤于下边界,如果是则调出。则依次打印出数字 1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10 .
2025-08-06 09:00:00
252
原创 Mysql的索引数量是否越多越好?为什么?
索引是存储引擎用于提高数据库表的访问速度的一种数据结构。它可以比作一本字典的目录,可以帮你快速找到对应的记录。索引一般存储在磁盘的文件中,它是占用物理空间的。如果 SQL 语句中用到了组合索引中的最左边的索引,那么这条 SQL 语句就可以利用这个组合索引去进行匹配。当遇到范围查询(betweenlike)就会停止匹配,后面的字段不会用到索引。对(a,b,c)建立索引,查询条件使用 a/ab/abc 会走索引,使用 bc 不会走索引。对(a,b,c,d)建立索引,查询条件为。
2025-08-04 09:00:00
965
原创 where 1 = 1的作用?会影响性能吗?count(*) 和 count(1)哪个快?
双路排序有一个叫 max length for_sort cata参数,默认是4096字节,如果 select列的数据长度超过它,则 MySQL采用row id排序,即把 row id(有主键就是主键)+排序字段放置到 sort bufer 中排序比如现在要执行: select a,b,c from t1 where a='seven’order by b;
2025-07-31 09:00:00
949
原创 剑指offer-16、合并两个有序链表
使用两个指针分别遍历两个链表,比较当前节点的值,将较小的节点连接到结果链表上。当一个链表遍历完后,将另一个链表的剩余部分直接连接到最后。利用递归将问题分解:每次比较两个链表的头节点,选择较小的节点作为合并后链表的头节点,然后递归地合并剩余部分。输⼊两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满⾜单调不减规则。
2025-07-29 09:00:00
132
原创 Spring AI 框架中如何集成 MCP?
Spring AI MCP 为模型上下文协议提供 Java 和Spring 框架集成、它使 SpringAI 应用程序能够通过标准化的接口与不同的数据源和工是进行交互,支持同步和异步通信模式。整体架构如下:Spring Al 通过以下 Spring Boot 启动器提供 MCP 集成:客户端启动器spring-ai-starter-mcp-client 核心启动器提供 STDIO 和基于 HTTP 的 SSE 支持。
2025-07-28 09:00:00
1581
原创 Mysql查询语句执行流程?更新语句执行流程?
连接器:建立连接,管理连接、校验用户身份;查询缓存:查询语句如果命中查询缓存则直接返回,否则继续往下执行。MySQL 8.0 已删除该模块;解析 SQL,通过解析器对 SQL 查询语句进行词法分析、语法分析,然后构建语法树,方便后续模块读取表名、字段、语句类型;执行 SQL:执行 SQL 共有三个阶段:预处理阶段:检查表或字段是否存在;将 select * 中的 * 符号扩展为表上的所有列。优化阶段:基于查询成本的考虑, 选择查询成本最小的执行计划(选择使用哪个索引);
2025-07-24 09:00:00
1302
原创 剑指offer-14、链表中倒数第k个结点
方法时间复杂度空间复杂度优点缺点两次遍历法O(n)O(1)实现简单需要两次遍历双指针法O(n)O(1)一次遍历,效率高边界条件需仔细处理栈辅助法O(n)O(n)实现直观空间开销大递归回溯法O(n)O(n)展示递归思想空间效率低。
2025-07-23 09:00:00
410
原创 剑指offer-13、调整数组顺序使奇数位于偶数前面(一)
方法时间复杂度空间复杂度优点缺点辅助数组法O(n)O(n)实现简单,顺序有保证空间开销大双指针原地排序O(n²)O(1)空间效率高时间效率低两次遍历填充法O(n)O(n)时间效率高空间开销中等稳定双指针交换法O(n²)O(1)空间效率高实现复杂,时间效率低优化双指针法O(n²)O(1)空间效率高,顺序保证好时间效率低。
2025-07-22 09:00:00
418
原创 char和varchar的区别?VARCHAR(100)和 VARCHAR(10)的区别?Mysql字段类型20连问
假设采用latinl字符集,一个VARCHAR(10)的列需要11个字节的存储空间。操作内存的方式:对于varchar数据类型来说,硬盘上的存储空间虽然都是根据字符串的实际长度来存储空间的,但在内存中是根据varchar类型定义的长度来分配占用的内存空间的,而不是根据字符串的实际长度来分配的。当我们向一个自增主键的InnoDB表中插入数据的时候,如果显式开启了事务,然后因为某种原因最后回滚了事务,此时表的自增值也会发生滚动,而接下里新插入的数据,也将不能使用滚动过的自增值,而是需要重新申请一个新的自增值。
2025-07-21 09:00:00
839
原创 工作中常见的OOM?你了解JVM调优吗?
比加发现频繁产生FullGC,分析日志之后发现没有内存泄漏,只是 Young GC之后会有大量的对象进入老年代,然后最终触发FullGC,所以就能得知是 Survivor 空间设置太小,导致对象过早进入老年代,因此调大Survivor。GC调优这种问题肯定是具体场景具体分析,但是在面试中就不要讲太细,大方向说清楚就行,不需要涉及具体的垃圾收集器比如 CMS 调什么参数,G1 调什么参数之类的。如果实际工作中,出现这个问题,一般是由于创建的线程太多,或者设置的单个线程占用内存空间太大导致的。
2025-07-17 09:00:00
588
原创 剑指offer-12、数值的整数次方
题⽬中的 double 类型不能拆解,但是 int 类型的整数 exponet 可以做点⽂章,我们平时求次⽅的时候,假设有个 x 的 4 次⽅,我们通常是求出⼀个 x 的平⽅数 x^2 ,然后两个 x^2相乘就可以得出 x^4。给定⼀个 double 类型的浮点数 base 和 int 类型的整数 exponent。例如,计算3¹³(1101₂)可以分解为3⁸ * 3⁴ * 3¹。如果指数是负数,则先取反,最后取结果的倒数即可。如果使⽤暴⼒解答,那么就是不断相乘,对于负数⽽⾔,则是相除,并且符号取反。
2025-07-16 09:00:00
331
原创 剑指offer-11、⼆进制中1的个数
⽐如7的⼆进制是111 ,那么7&6=111&110=110=6 ,就完美把最后⼀位1 变成0 了, 6 的⼆进制是110 , 6&5=110&101=100=4 ,也把最后⼀位1 变成了0。说明:负数使⽤补码表示 ,-1的32位⼆进制表示为1111 1111 1111 1111 1111 1111 1111 1111,其中32个1。说明:⼗进制中10的32位⼆进制表示为0000 0000 0000 0000 0000 0000 0000 1010,其中有两个1。可以消除最右边的1的特性,直到n变为0。
2025-07-15 09:00:00
315
原创 垃圾回收算法有哪些?了解哪些垃圾回收器?
在Java中,指针碰撞是一种垃圾收集算法中用于分配内存的一种方式。它通常用于实现停顿时间较短的垃圾收集器,如复制算法和标记整理算法。指针碰撞的基本思想是将堆内存分为两个区域:一个是已分配的对象区域,另一个是未分配的空闲区域。通过一个指针来分隔这两个区域。当需要分配对象时,垃圾收集器将对象的大小与空闲区域的大小进行比较,如果空闲区域足够容纳对象,则将指针碰撞指针向前移动对象的大小,并返回指针碰撞指针的旧值作为对象的起始地址。如果空闲区域不足以容纳对象,则进行垃圾回收操作,释放一些内存后再进行分配。
2025-07-14 09:00:00
282
原创 G1收集器:JVM垃圾回收的新一代王者
G1垃圾收集器在JDK7被开发出来,JDK8功能基本完全实现。并且成功替换掉了Parallel Scavenge成为了服务端模式下默认的垃圾收集器。JDK 9以后默认使用,替代了CMS 收集器。G1和CMS一样,也是采用三色标记分段式进行回收的算法, 不过它是写屏障 + STAB快照实现,后文详聊。
2025-07-10 09:00:00
855
原创 剑指offer-10、矩阵覆盖
显然,这形成了一个类似斐波那契数列的规律:f(n) = f(n-1) + f(n-2)。我们可以用 2 * 1 的小矩形横着或者竖着去覆盖更大的矩形。我们需要用若干个2×1的小矩形(可以横放或竖放)无重叠地覆盖一个2×n的大矩形,求总共有多少种不同的覆盖方法。观察发现,计算f(n)只需要前两个状态f(n-1)和f(n-2),因此可以用两个变量代替整个数组,将空间复杂度优化到O(1)。因此,总方法数为这两种情况之和:f(n) = f(n-1) + f(n-2),这正是斐波那契数列的递推关系。
2025-07-09 09:00:00
481
原创 剑指offer-9-变态跳台阶
本文探讨了青蛙跳台阶问题的多种解法。该问题要求计算青蛙跳上n级台阶的总跳法数,每次可跳1到n级。通过数学归纳发现规律f(n)=2^(n-1),直接得出O(1)的最优解。递归法将问题分解为子问题,但存在O(n)时间/空间复杂度。动态规划优化了递归,采用迭代方式存储中间结果(O(n)空间)。进一步优化为仅保存前一个状态,实现O(1)空间的最优迭代解法。各种方法展现了从数学观察到算法优化的完整思路,其中优化的动态规划解法最适合实际应用。
2025-07-08 09:00:00
347
原创 了解GC吗?什么是GC?
但前提是老年代本身还有容纳这些对象的剩余空间,一共有多少对象会活下来在实际完成内存回收之前是无法明确知道的,所以只好取之前每一次回收晋升到老年代对象容量的平均大小值作为经验值,与老年代的剩余空间进行比较,决定是否进行Full GC来让老年代腾出更多空间。对JVM中的内存进行标记,并确定哪些内存需要回收,根据一定的回收策略,自动的回收内存,保证JVM中的内存空间,防止出现内存泄露和溢出问题。虚拟机栈(栈帧中的本地变量表)中引用的对象,例如各个线程被调用的方法栈用到的参数、局部变量或者临时变量等。
2025-07-07 09:00:00
942
原创 一个static关键字引发的线上故障:深度剖析静态变量与配置热更新的陷阱
《静态变量引发线上故障:配置热更新失效分析》摘要 本文通过一个真实案例,分析了Java中static关键字不当使用导致的线上故障。故障现象为:将HTTP接口URL配置从实例变量改为静态变量后,灰度测试正常但全量上线后配置热更新失效,服务仍使用旧URL。经排查发现,静态变量仅在类加载时初始化一次,无法响应配置中心的动态更新。文章深入解析了JVM类加载机制、静态变量生命周期与内存分配原理,对比了静态变量与实例变量的特性差异,并总结出静态变量的适用场景与使用禁忌。最后强调分布式系统中应避免将动态配置存储在静态变量
2025-07-03 09:00:00
573
原创 剑指offer-8、跳台阶
⼀只⻘蛙⼀次可以跳上1级台阶,也可以跳上2级。求该⻘蛙跳上⼀个 n 级的台阶总共有多少种跳法(先后次序不同算不同的结果)。解释:⻘蛙要跳上两级台阶有两种跳法,分别是:先跳⼀级,再跳⼀级或者直接跳两级。这题和第7题 斐波那契数列 基本类似,只是换了一个题目表达方式。观察状态转移方程,发现当前状态仅依赖前两个状态(),因此只需保存这两个值,无需存储整个数组。
2025-07-02 09:00:00
135
原创 剑指offer-7、斐波那契数列
⼤家都知道斐波那契数列,现在要求输⼊⼀个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0,第1项是1)。直接递归会造成很多重复的计算,要是我们把计算结果先存起来,使⽤的时候再调⽤,那就可以优化。思路很直接,利⽤函数进⾏递归即可。返回值描述:输出⼀个正整数。输⼊描述:⼀个正整数n。
2025-07-01 09:00:00
220
原创 你了解 Java 的类加载器吗?类加载机制是什么?什么是双亲委派机制?
实现通过类的全限定名获取该类的二进制字节流的代码块叫做类加载器。启动类加载器:用来加载 Java 核心类库,无法被 Java 程序直接引用。扩展类加载器:它用来加载 Java 的扩展库。Java 虚拟机的实现会提供一个扩展库目录。该类加载器在此目录里面查找并加载 Java 类。系统类加载器:它根据应用的类路径来加载 Java 类。可通过ClassLoader.getSystemClassLoader() 获取它。自定义类加载器:通过继承java.lang.ClassLoader 类的方式实现。
2025-06-30 09:00:00
666
原创 剑指offer-6、旋转数组的最小数字
取出中间元素,和最右边元素⽐较,如果中间元素⼤于最右边元素,则证明,最⼩值存在于中间元素到最右边元素之间的⼀段。如果中间元素⼩于最右边元素,则证明,最⼩值在最左边元素到中间元素之间的⼀段中。旋转之后的数组其实就是分成两段,⽐如 {3,4,5,1,2} ,可以看到, 3 , 4 , 5 是递增的,但是 5之后1 就是⽐之前的数⼩的,这样就可以找到最⼩值 1。例如数组 {3,4,5,1,2} 为 {1,2,3,4,5} 的⼀个旋转,该数组的最⼩值为 1。
2025-06-26 09:00:00
488
原创 剑指offer-5、两个栈实现⼀个队列
⽤两个栈来实现⼀个队列,完成队列的 Push 和 Pop 操作。队列中的元素为 int 类型。但是依然还是要用两个队列来模拟栈,只不过没有输入和输出的关系,而是另一个队列完全用来备份的!所以用栈实现队列, 和用队列实现栈的思路还是不一样的,这取决于这两个数据结构的性质。有两个栈 stack1 , stack2;其实这道题目就是用一个队列就够了。
2025-06-25 09:00:00
172
原创 剑指offer-4、重建二叉树
看上⾯的图⽚,⾸先数据保证了正确性,那么前序的第⼀个肯定是root 节点,也就是1 ,那么就需要在中序遍历中找到1 的位置,左边就是这个root 的左⼦树,右边就是root 的右⼦树。我们可以⼀开始创建⼀个栈,分别⽤两个指针执⾏前序遍历和中序遍历的第⼀个元素,先将前序遍历的第⼀个元素压⼊栈中,因为前序遍历的特性,第⼀个元素肯定是根节点。直到,中序遍历的第⼀个元素 4 ,已经等于栈顶元素 4 ,说明4 没有左⼦树了,因为 4 是在中序遍历⾥⾯,中序遍历完根节点,剩下的部分只能是右⼦树。
2025-06-24 09:00:00
501
原创 Java中什么是类加载?类加载的过程?
类加载指的是把类加载到 JVM 中。把二进制流存储到内存中,之后经过一番解析、处理转化成可用的 class 类二进制流可以来源于 class 文件,或通过字节码工具生成的字节码或来自于网络。只要符合格式的二进制流,JVM 来者不拒。虚拟机遇到⼀条 new 指令时,⾸先将去检查这个指令的参数是否能在常量池中定位到这个类的符号引⽤,并且检查这个符号引⽤代表的类是否已被加载过、解析和初始化过。如果没有,那必须先执⾏相应的类加载过程。类加载过程包括了加载、连接、初始化三个阶段,其中连接还可以分为验证、准备、解析将二
2025-06-23 09:00:00
1445
原创 JVM内存结构33连问
逃逸分析(Escape Analysis),是一种可以有效减少Java 程序中同步负载和内存堆分配压力的跨函数全局数据流分析算法。通过逃逸分析,Java Hotspot编译器能够分析出一个新的对象的引用的使用范围,从而决定是否要将这个对象分配到堆上。一个对象在方法中被定义后,对象如果只在方法内部使用,则认为没有发生逃逸;(没有发生逃逸的对象,会在栈上分配)当一个对象在方法中被定义后,它被外部方法所引用,则认为发生了逃逸。
2025-06-19 09:00:00
867
原创 剑指offer-3、从尾到头打印链表
前⾯我们能想到栈,那么我们何必⾃⼰实现呢?先把元素⾥⾯的元素从头到尾遍历取出放在栈⾥⾯,然后再把栈的元素去出来放在ArraList ⾥⾯。主要利⽤了栈的先进后出的规则,这样就可以实现倒序的功能。遍历每⼀个节点,然后把它插⼊到头部,这样⼀直遍历到尾的时候,就相当于将整个链表都反转⼀遍了,然后再从头到尾遍历放到ArryList 即可。输入一个链表的头节点,按链表从尾到头的顺序返回每个节点的值(用数组返回)。0 <= 链表长度 <= 10000。返回一个数组为[3,2,1]
2025-06-17 09:00:00
245
原创 你了解CAS吗?有什么问题吗?如何解决?
CAS全称,比较与交换,是乐观锁的主要实现方式。CAS在不使用锁的情况下实现多线程之间的变量同步。内部的AQS和原子类内部都使用了CAS。需要读写的内存值V。进行比较的值A。要写入的新值B。只有当V的值等于A时,才会使用原子方式用新值B来更新V的值,否则会继续重试直到成功更新值。在Java中,CAS操作主要通过java.util.concurrent.atomic包中的类来实现。例如,AtomicInteger、AtomicBoolean、AtomicReference等。
2025-06-16 09:00:00
835
原创 剑指offer-2、替换空格
请实现一个函数,将一个字符串中的空格替换成“%20”。例如,当字符串为"We Are Happy",则经过替换之后的字符串为"We%20Are%20Happy"。对字符串进行遍历,然后使用StringBuilder进行字符串的拼接,遇到空格添加。java ⾥⾯有可以直接使⽤的函数replace() ,直接写成下⾯这样即可通过。但是这里用到了额外的空间,额外用到StringBuilder进行存储。
2025-06-13 09:00:00
157
原创 线程池中execute和submit的区别?
submit既可以提交Runnable类型的任务,也可以提交Callable类型的任务,会有一个类型为Future的返回值,但当任务类型为Runnable时,返回值为null。Worker实现了Runable接口,在调用start()方法候,实际执行的是run方法Worker实现了Runable接口,在调用start()方法候,实际执行的是run方法。execute在执行任务时,如果遇到异常会直接抛出,而submit不会直接抛出,只有在使用Future的get方法获取返回值时,才会抛出异常。
2025-06-12 09:00:00
887
原创 AI大模型入门知识
这段时间各种AI名词一波接一波的冲击着我的屏幕,Agent,MCP,FunctionCalling,RAG,它们都是什么东西有人说Agent是智能体,那智能体又是什么呢?有人说MCP是AI时代的USB协议,那么它可以接U盘吗?它们到底都是什么意思?
2025-06-10 09:00:00
869
原创 你了解Java线程池原理吗?
corePoolSize:当有新任务时,如果线程池中线程数没有达到核心线程池的大小corePoolSize,则会创建新的线程执行任务,否则将任务放入阻塞队列。当线程池中存活的线程数总是大于 corePoolSize 时,应该考虑调大 corePoolSize。maximumPoolSize:当阻塞队列填满时,如果线程池中线程数没有超过最大线程数maximumPoolSize,则会创建新的线程运行任务。如果线程池中线程数已经达到最大线程数maximumPoolSiz,则会根据拒绝策略处理新任务。
2025-06-09 09:00:00
632
原创 剑指offer-1、⼆维数组中的查找
在⼀个⼆维数组中(每个⼀维数组的⻓度相同),每⼀⾏都按照从左到右递增的顺序排序,每⼀列都按照从上到下递增的顺序排序。请完成⼀个函数,输⼊这样的⼀个⼆维数组和⼀个整数,判断数组中是否含有该整数。题目提示了,每⼀⾏都按照从左到右递增的顺序排序,每⼀列都按照从上到下递增的顺序排序,那我们其实就可以利用矩阵的排序特性可以从右上角或左下角开始查找,从而优化搜索效率。而如果是从左上角开始找,这种两个方向都更大, 如果从右下角开始找,两个方向都更小,显然无法完成搜索。- 如果当前元素大于目标值,向左移动一列。
2025-06-06 09:00:00
129
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人