Spring 部分八股
Spring Bean的生命周期
实例化 Instantiation
属性赋值 Populate
初始化 Initialization
销毁 Destruction
实例化 -> 属性赋值 -> 初始化 -> 销毁
实例化: 调用doCreateBean()方法进行实例化, 通过反射的方式创建出一个bean对象
属性赋值: 给这个Bean对象进行属性填充, 注入这个Bean依赖的其它bean对象
初始化:
执行Aware接口的方法, (Spring会检测该对象是否实现了xxxAware接口,通过Aware类型的接口,可以让我们拿到Spring容器的些资源。如实现BeanNameAware接口可以获取到BeanName,实现BeanFactoryAware接口可以获取到工厂对象BeanFactory等)
执行BeanPostProcessor的前置处理方法postProcessBeforelnitialization()
判断Bean是否实现了InitializingBean接口,如果实现了,将会执行lnitializingBean的afeterProperti ...
背代码
正则表达式匹配123456789101112131415161718192021222324252627public class Solution { public boolean match (String str, String pattern) { int m = str.length(), n = pattern.length(); boolean[][] dp = new boolean[m + 1][n + 1]; dp[0][0] = true; for(int i = 0; i <= m; i++){ for(int j = 1; j <= n; j++){ if(pattern.charAt(j - 1) != '*'){ if(i > 0 && (str.charAt(i - 1) == pattern.charA ...
xdb手写数据库
介绍模型概述xdb一共包括五个模块, 分别是
Data Manager(DM)
Transaction Manager(TM)
Version Manager(VM)
Index Manager(IM)
Table Manager(TBM)
五个模块的依赖关系如下
其中TM模块为事务管理模块, 主要作用就是标记事务的状态, 并且提供接口以供其他模块进行查询
Transaction ManagerTM模块是比较简单的模块, 主要就是标记每个事务的状态以供其他模块查询
每一个事务都有三种状态
active 正在进行, 尚未结束
committed 已提交
aborted 已撤销(回滚)
XID文件每一个事务都有一个xid, 这个xid唯一标识了这个事务, xid的标号从1开始, 依次递增, 不重复
规定xid为0的事务为超级事务(Super Transaction), 当一些操作想在没有申请事务的情况下进行, 那么可以将操作的 XID 设置为 0, XID 为 0 的事务的状态永远是 committed
XID文件就是TM模块中 ...
表达式计算-简单计算器
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124import java.util.ArrayDeque;import java.util.Deque;import java.util.HashMap;import java.util.Map;/** * @Author Gnawix * @Date 2022/5/9 17:25 * @Version 1.0 */public class Calculator { public static void main(String[] args) { ...
Leetcode HOT 100
1. 两数之和
使用hashmap,记录值和下标,值重复时返回结果
==map中添加nums[i],则比较时比target-nums[i]==
2. 两数相加
新建一个节点链表来保存结果,两个链表长度不一样,每次循环开始都判空则用0替代
==最后循环结束后还要判断进位值是否是1而再添加一个值为1的节点==
3. 无重复字符的最长子串
使用HashSet,for循环left指针,循环体内while循环right指针add到set中,遇到重复则结束while,在计算max值并remove出left下标的值
==外层for循环循环left指针,内层while循环right指针,内层循环时要先判断right是否越界==
4. 寻找两个正序数组的中位数
1.合并,找位置 O(m+n) O(m+n)
2.不合并,找位置 O(m+n) O(1)
2.二分法 O(log(m+n)) O(1)
二分法把问题转化为找第k小的数
在nums1和nums2中各取k/2,较 ...
二叉树的遍历
二叉树的遍历递归法
递归的写法比较简单,三种遍历方式在写法上的不同仅仅是将便利的顺序根据要求调整即可,代码结构相同
前序遍历123456789101112131415public List<Integer> preorderTraversal(TreeNode root) { List<Integer> result = new ArrayList<Integer>(); preorder(root, result); return result;}public void preorder(TreeNode root, List<Integer> res) { if (root == null) { return; } res.add(root.val); preorder(root.left, res); preorder(root.right, res);}
中序遍历1234567891011121314p ...
排序算法
快速排序123456789101112131415161718192021222324252627282930313233void quickSort(int[] nums, int l, int r) { if (l >= r) { return; } int i = partition(nums, l, r); //i为分界值 i左边的都是小于nums[i] 右边的都是大于的 quickSort(nums, l, i - 1); quickSort(nums, i + 1, r);}int partition(int[] nums, int l, int r) { int i = l, j = r; while (i < j) { while (i < j && nums[j] >= nums[l]) { j--; //找到小于当前选定值的数的位置 } ...
数组有关
二分查找==总结:二分查找的结果:如果能查到则返回值一定是mid,如果查找不到,最后的状态是(eg: 1,2,3,right,left,4,5,6),最后一定是right指针在left指针左边且相邻,此时left指针的位置就是找不到target是需要插入的位置,mid指针应该等于left指针==
注意点
mid=left+(right-left)/2 放置left+right溢出
while(left<right) OR while(left<=right)
边界重新赋值时应为mid或者mid+1
按照自己所定义的区间来判断 [left, right] [left, rigth)
两种写法
[left, right]此时当left=right时也是有意义的,因此while条件为left<=right
当nums[mid] != target时,需要重新确定区间
显然mid下标的数已经参与过比较,因此确定新的区间时不需要包含mid下标,left= ...
使用Github Actions自动部署Hexo
创建源码仓库在github上新创建一个仓库blog来存放源码以及主题文件
注意一共需要两个仓库, 一个是源文件仓库, 一个是你的github.io仓库
将该仓库克隆到本地
把原来的文件夹内所有内容复制过来(除了.git文件夹)
(注意把themes文件夹以及其子文件夹中的.git删掉, 否则git add时会报错)
==注意: 如果使用自己的域名则需要在source目录下添加一个名CNAME的文件, 内容填写你的域名即可, (否则每次部署后github pages的域名设置都会失效)如果没有域名, 则忽略此步骤==
配置 Github Actions接下来在根目录创建.github/workflows/deploy.yml 文件
123456789101112131415161718192021222324252627282930313233343536373839name: HEXO CIon: push: branches: - masterjobs: build: runs-on: ubu ...






