MySQL相关知识点
MySQL知识点
MySQL
存储引擎
InnoDB( 默认引擎,支持外键;支持事务;支持在线热备份)
MyISAM(不支持外键、事务和在线热备份;不支持行锁,只支持表锁;支持压缩表和空间数据索引)
Memory(存在内存中 一但机器重启 数据会丢失)
MERGE(用于一系列MyISAM表以逻辑方式组合在一起,作为一个对象去引用。(相当于union all))
事务的四大特性
原子性:所有操作要么全部成功,要么全部回滚
一致性:事务执行前和执行后必须处于一致性状态
隔离性:并发访问数据时,多个事务互相不干扰
持久性:事务一旦提交,对数据库的更改就是永久的
事务会出现的问题
脏读:指的是当前事务可以读取到另外事务未提交的数据。
不可重复读:同一事务内多次读取同一数据集合,读取到的数据是不一样的情况。
幻影读:同一事务连续执行两次同样的 sql 语句,第二次的 sql 语句可能会返回之前不存在的行(特殊的不可重复读问题)
四种事务隔离级别
未提交读(READ UNCOMMITTED)
事务中的修改,即使没有提交,对其他事务也是可见的。
会出现如下问题:脏读 不可重复 ...
Spring相关知识点
Spring知识点
Spring框架
依赖注入,控制反转的介绍
控制反转指的是一个过程,将原本对象自己控制的依赖关系变成外部容器来进行控制。
依赖注入是它的实现方式,Spring容器通过构造函数或者setter方法将依赖关系注入到对象中
Bean的注入方式
引导加载方式:通过Xml文件或者Java注解(@Bean注解)来实现
自动配置:即
①自动装配(声明setter方法,@Autowired 根据类进行匹配,多个则根据名字匹配(设置**@Qualifier注解可以指定Bean的名称)(设置required参数可以让其在找不到时不报错**),@Resouce JDK提供的 查找方式反一下)(在Bean上使用**@Primary注解可以设置多个匹配时的主类**。)
②组件扫描(@ComponentScan注解 默认会在当前包路径下扫描)
自动装配的过程:再创建上下文时进行注册Bean定义,在Bean的实例化时进行解析(根据注解类型来选择执行Bean的后置处理器进行解析)
Spring IoC容器加载的流程
注册容器时,会先注册启动配置类,然后调用refresh() ...
JVM相关知识点
JVM相关知识点
JVM
自动内存管理子系统
运行时数据区:
方法区(线程共享的)
主要存储对象的元数据信息(类名,字段信息,方法信息,父类信息等)和运行时常量池(字符串(JDK1.7以前是存放的对象,后面改成了存放引用,对象放到堆内存中了)/数值/布尔字面量,符号引用(类全限定名,字段的描述信息,方法的描述信息))
实现方式
JDK1.8以前实现方式是永久代(主要为了适配堆的分代结构方便垃圾回收器一起管理)
JDK1.8后采用元空间实现(使用本地内存来存储,与堆内存分离,内存大小可以动态扩展,大大减少了内存溢出的风险)
堆(线程共享的)
对象的创建过程
当JVM遇到一条new语句时,会先去找常量池找到此类的符号引用,并检查它是否已加载,否则执行类加载过程,通过后,JVM会为新对象在堆中分配固定内存(其大小在类加载完成后便以确定),同时初始化零值(对象头除外),接着设置对象头(锁状态信息,GC分代年龄,类型指针(指向它的类型元数据的指针)等,如果是数组则还要记录它的长度),在JVM看来此时对象已经真正创建完成;接着将会执行方法才按照我们的意愿操作
对象的 ...
力扣45跳跃游戏 II
题目描述:
给定一个长度为 n 的 0 索引整数数组 nums。初始位置为 nums[0]。
每个元素 nums[i] 表示从索引 i 向后跳转的最大长度。换句话说,如果你在 nums[i] 处,你可以跳转到任意 nums[i + j] 处:
0 <= j <= nums[i]
i + j < n
返回到达 nums[n - 1] 的最小跳跃次数。生成的测试用例可以到达 nums[n - 1]。
与另一个(力扣55)十分相似,最短的跳跃距离,依旧是贪心,只要让位置跳的尽量远即可
真就贪心,想不到那就做不出来,无语,这种题目是真没意思,不过得注意不像上一题只要维护最大值,现在还要维护最大步长
12345678910111213141516171819//代码如下 public int jump(int[] nums) { if (nums.length == 1) return 0; int max = 0;//当前步长能走的最大值,也即下次的步长 int step = 1;//当前步数 int s ...
力扣55跳跃游戏
题目描述:
给你一个非负整数数组 nums ,你最初位于数组的 第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度。
判断你是否能够到达最后一个下标,如果可以,返回 true ;否则,返回 false 。
经典跳跃小游戏,简单的dp缓存表最好想了
1234567891011121314151617181920212223//代码如下 //缓存表 //dp2是和下面优化的代码有所区分无意义,int类型是因为存三个状态:能到,不能到,未缓存 int[] dp2; public boolean canJump(int[] nums) { dp2 = new int[nums.length]; return f(nums, 0); } public boolean f(int[] nums, int index) { //basecase if (index > nums.length - 1) return false; if (dp2[index] != ...
力扣189 轮转数组
题目描述:
给定一个整数数组 nums,将数组中的元素向右轮转 k 个位置,其中 k 是非负数。
题目非常简单,分成两段数组分别赋值即可,不过注意是检查的依旧是原数组
123456789101112//代码如下 public void rotate(int[] nums, int k) { int[] temp = Arrays.copyOf(nums, nums.length); k = k % nums.length;//超过一圈后都是循环 for (int i = 0; i < nums.length - k; i++) { nums[i + k] = temp[i]; } for (int i = nums.length - k; i < nums.length; i++) { nums[i - nums.length + k] = temp[i]; } }
空间复杂度优 ...
力扣169 合并两个有序数组
题目描述:
给定一个大小为 n 的数组 nums ,返回其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。
你可以假设数组是非空的,并且给定的数组总是存在多数元素。
题目非常简单,让我们找出现次数最多的数,使用Hash表应该是最好想到的,不多赘述。
12345678910111213//代码如下 public int majorityElement(int[] nums) { if (nums.length <= 2) return nums[0];//特殊情况,直接返回 HashMap<Integer, Integer> map = new HashMap<>(16); for (int i = 0; i < nums.length; i++) { if (!map.containsKey(nums[i])) map.put(nums[i], 1);//不存在创建添加 else { ...
力扣80 删除有序数组中的重复项 II
题目描述:
给你一个有序数组 nums ,请你** 原地** 删除重复出现的元素,使得出现次数超过两次的元素只出现两次 ,返回删除后数组的新长度。
不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。
与leetcode26优化后的结果差不多:
我们看看能不能优化一下,依旧是大小不重要,所以依旧在原数组上进行修改遍历,我们可以通过记录当前应该去重的数据数量来确定当前数据如果不重复应该移动的位置,不过题目要求是重复两次以上,所以额外再加一个变量记录重复次数。
这样分析会有三种情况
当前数据位置与索引位置相等:重复次数+1
且数据重复次数大于两次:则应该去重的数量+1
否则少于两次应该保留:即需要移动数据
当前数据位置与索引位置不相等:重复次数重置为1,保留(移动)数据
注意的是:移动数据的目的就是为了保留此数据,因为后面的数据不参与答案校验
1234567891011121314151617181920//代码如下 public int removeDuplicates(int[] nums) { ...
力扣26 合并两个有序数组
题目描述:
给你一个 非严格递增排列 的数组 nums ,请你** 原地** 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然后返回 nums 中唯一元素的个数。
考虑 nums 的唯一元素的数量为 k ,你需要做以下事情确保你的题解可以被通过:
更改数组 nums ,使 nums 的前 k 个元素包含唯一元素,并按照它们最初在 nums 中出现的顺序排列。nums 的其余元素与 nums 的大小不重要。
返回 k 。
创建一个新数组遍历去重就不多说啦
我们看看能不能优化一下,依旧是大小不重要,所以依旧在原数组上进行修改遍历,我们可以通过记录当前重复的数据数量来确定当前数据如果不重复应该移动的位置,比如重复了两个数,那么这个位置未重复的数应该前移两个
注意的是:
记录的是当前重复的数据数所以返回时应该用总数减去
123456789//代码如下 public int removeDuplicates(int[] nums) { int count = 0;//重复的数据数 for (i ...
力扣27 移除元素
题目描述:
给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素。元素的顺序可能发生改变。然后返回 nums 中与 val 不同的元素的数量。
假设 nums 中不等于 val 的元素数量为 k,要通过此题,您需要执行以下操作:
更改 nums 数组,使 nums 的前 k 个元素包含不等于 val 的元素。nums 的其余元素和 nums 的大小并不重要。
返回 k。
简单题,不多赘述;(去创建一个数组遍历我想大家都会)
不过由于nums的大小不重要,我们会想到能不能在原数组进行操作?这里可以通过记录非val的数据的数量来进行优化
注意的是:
count为当前非val的数据数量
赋值操作不会覆盖未比较的值(因为count永远比当前索引小)
12345678//代码如下 public int removeElement(int[] nums, int val) { int count = 0; for (int num : nums) if (num != val) ...