- 博客(25)
- 收藏
- 关注
原创 JDK实现动态代理
JDK动态代理通过Proxy.newProxyInstance()方法实现,需目标类实现接口。该方法动态生成代理类字节码,加载到JVM并创建实例。核心参数包含类加载器(用于加载代理类)、接口列表(定义代理方法)和InvocationHandler(处理实际调用逻辑)。代理类继承Proxy类并实现目标接口,方法调用会被转发到InvocationHandler的invoke()方法,可在其中添加增强逻辑或完全拦截。Spring的ProxyFactory进一步封装了该机制,提供更便捷的AOP支持。动态代理本质是通
2026-06-30 00:41:44
226
原创 JVM的运行时内存区域
JVM内存结构摘要 JVM内存分为线程私有和共享区域。线程私有包括: 程序计数器:记录当前线程执行的字节码指令地址; 虚拟机栈:存储方法调用的栈帧(局部变量表、操作数栈等); 本地方法栈:服务于Native方法。 线程共享区域包括: 堆:存放对象实例和数组,是GC主要区域; 方法区(元空间):存储类信息、静态变量等,JDK8后移至本地内存; 运行时常量池:保存编译期生成的符号引用和字面量,JDK7后字符串常量池移至堆中。 方法执行时,栈帧入栈,对象实例分配在堆,类型信息存于方法区,PC寄存器跟踪指令位置。
2026-06-23 08:22:33
250
原创 PageHelper分页的原理
PageHelper是MyBatis的分页插件,核心原理是通过拦截器动态修改SQL语句,添加LIMIT等分页语法。它利用ThreadLocal存储线程隔离的分页参数,在查询执行后自动清理。分页查询返回的是Page对象(包含数据和分页信息),实际开发中通常封装为PageInfo返回给前端,避免污染接口并精简属性。需要注意PageHelper.startPage()必须紧接查询语句,否则可能导致ThreadLocal泄露。
2026-06-17 17:08:38
211
原创 Maven依赖冲突
在项目中,如果我们同时A依赖和B,A和B依赖中又同时依赖C,但是依赖的C依赖的版本不同,这会导致依赖冲突,最后编译打包后会有一个Cjar包问题:这时候,如果 B依赖用的是 C 依赖中旧版本的方法,但是 Maven 最终选择了 A 依赖的新版本的 C 依赖,就会导致B依赖找不到方法。抛出ClassNotFoundException。
2026-06-16 21:10:10
209
原创 完全背包与多重背包
所谓完全背包,就是每一件物品有无数件,可以多次选择同一件物品,我们之前将了一维化01背包,其中探讨了一维化dp数组遍历顺序的重要性,在这里我们在复述一下,在一维化dp数组里,在遍历背包顺序中,不能按照背包容量从小到大遍历,否则会出现多次选择同一件物品的情况,所以一维化01背包我们选择的是按照背包容量从大到小遍历。看到这里,想必已经有头绪了,完全背包可以多次选择同一件物品,那我们按照背包容量从小到大遍历即可。
2024-03-05 14:11:38
436
原创 一维化01背包(详细)
之前我们介绍了01背包,但是dp数组是二维化的,现在我们需要将其变成一维数组,如果已经对二维化的01背包十分了解了,那么理解一维化的dp数组也不是问题。
2024-03-05 13:18:15
677
1
原创 01背包(详细)
背包最大重量为4。有物品3件,分别有其质量和价值。问背包能背的物品最大价值是多少?这是标准的动态规划问题,每一个问题鱼鳍前面的子问题相联。
2024-03-02 15:53:18
929
1
原创 不同的二叉搜索树
给定一个整数 n,求以 1 ... n 为节点组成的二叉搜索树有多少种?所谓动态规划,所涉及的问题是要求的问题会与前面的子问题相关联,并由前面的子问题推导而来,这一点如果学过数学归纳法就会觉得十分眼熟。作为这道题而言,所谓二叉搜索树,其必须满足的条件就是,左子树的所有成员一定都小于根节点,右子树的所有成员一定都大于根节点。
2024-02-29 15:09:22
487
原创 解数独问题
乍一看解数独和N皇后问题很像,甚至会更难些,但其实我觉得二者是差不多的,在解数独的代码里,会加入一个二维的结构,但是其实我们不必那样想,数独是一个9*9的表格,我们可以将其拆成一条竖下来的线,即第二行接到第一行末尾,第三行接到第二行末尾......解数独只有一种正确解法,我们只需要找到即可,不需要结果集来搜集,回溯函数的返回值设置为bool,一旦满足条件(最后一个格子也遍历)即返回,结束函数。这样一来,整个表格就成了一个竖向的表格,其中每一个格子都有1~9可能性,这与n皇后的每一层就非常相似了。
2024-02-26 18:02:44
411
1
原创 滑动窗口(双指针)
在一个数组或字符串中找到满足条件的子数组或子串,通过移动起始位置和终止位置,从而构造成一个滑动的窗口,使得单次遍历便可解决问题,时间复杂度较低。
2023-12-24 16:21:46
485
1
原创 KMP判断是否由重复字符串组成
给出一字符串,判断其是否由重复子字符串组成。即:输入:asdasdasd输出:true输入asdfg输出:false。
2023-12-24 13:47:46
624
1
原创 KMP算法
aabaabaafaabaaf逐个匹配,匹配到f时,b与f不相等,此时看f前一位的next数组元素(next会在后面说明),并在子串中跳到对应数字位置,继续匹配。在f前一位的next数组元素是f前面子串(aabaa)的最长前后缀,即2,这时候说明这个子串的开始两位与末尾两位一模一样,这说明了什么?
2023-12-22 17:44:30
1703
1
原创 反转字符串里的单词
给定一句英文,要求倒叙输出每一个单词,并删除多余的空格(句子前面和句子后面,句子中重复了两遍的空格)示例:输入:"I am a programmer"输出:"programmer a am I"注意,如果句子中有多余的空格要记得删除其中一个示例:输入:"hello world!输出:"world!hello"
2023-12-21 19:44:11
863
1
原创 二叉搜索树的众数
至此,我们得到了一个由大到小按照频率排序的数组,此时我们还需要思考一种情况:众数可能不止一个,所以接下来需要将数组的第二号,第三号......与第一号进行频率的比对,直至小于第一号的频率。
2023-12-19 21:11:06
447
原创 二叉树路径总和
5/ \4 6给定一个目标值,找到一条从根节点到叶子节点的路径,使这个路径的节点总和等于目标值如给定目标值11路径即为输出:5->4->2与之前的二叉树的所有路径比较相似,这次多了一个数字。
2023-12-19 16:07:05
450
原创 二叉树的所有路径
A/ \B C我们需要输出:A->B->DA->B->EA->C->FA->C->G我们可以发现,其路径顺序和前序遍历顺序吻合,在这里我们使用前序遍历。
2023-12-19 15:08:08
457
原创 对称二叉树判断
一棵对称二叉树,对于根节点而言,他的左子树和他的右子树完全镜像对称,也就是说结构对称,即不用看对称节点的数据是否相等,只需要看对称的节点是否存在即可数据对称,即不仅要结构对称,其数据也要相同。
2023-12-19 13:56:21
670
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅