自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 JAVA中的垃圾回收器(3)----ZGC

就是用来修复并发标记中的漏标记问题,就是将B扫描完成之后,B就会变成黑色,此时B引用着D,D引用着E,此时如果在并发标记过程中D指向E的指针没了(D还没有来得及指向E),此时B指向了E,此时因为B已经变成了黑色,B不会重新扫描,但是此时的E就变成了一个垃圾对象,此时就发生了漏标操作CMS使用的是增量更新G1使用的是原始快照。2)ZGC小页面优先回收,大页面尽量不回收,可以选取垃圾特别多的页面进行回收,一个页面垃圾越多,那么回收的优先级就越高,如果将所有的页面都进行回收,那么回收的效率就特别低;

2023-10-30 12:53:53 429

原创 JAVA中的垃圾回收器(2)------G1

6)G1垃圾收集器对于对象什么时候会转移到老年代和之前说过的原则一模一样,唯一不同的是针对于大对象的处理,G1有一个专门分配大对象的区域叫做Humongous区域,而不是让大对象直接进入到老年代的Regin中,在G1中有专门分配大对象的区域叫做Humongous区,大对象的判断规则就是一个对象超过了Regin区域的一半,按照上面的计算规则,每一个Regin的大小是2M,只要对象的大小超过了1M,就会被存放到Humongous,如果对象特别大,还有可能使用多个连续的Regin存放。

2023-10-29 16:56:58 604

原创 JAVA中的垃圾回收器(1)

3)假设此时要是设置最大停顿时间是10ms,再进行垃圾回收的时候会尽可能的想办法把时间控制在10ms以内,要想实现垃圾回收的时间比较短,每一次垃圾回收比较短,那么就只能控制堆的大小,想让停顿时间短,那么垃圾回收的时间就比较短,垃圾回收器把堆控制的小一些,每一次GC时间就比较短,但是堆空间比较小,堆空间容易满,但是可能经常发生GC,GC频率增高,这样子吞吐量反而降低了,就会导致用户线程执行的总时长比较短,所以第一个参数使用需要谨慎;分成多个区,为什么分区算法是可控的?

2023-10-28 21:29:28 395

原创 JVM进阶(3)

2)在JAVA程序运行的过程中会产生大量的对象,其中有一些对象是和业务信息相关,比如说Http请求的session对象,线程,Socket连接,这类对象和业务直接挂钩,因此生命周期比较端,比如说String对象,由于不可变的特性,系统会产生大量的这些对象,甚至有的对象只使用一次就被回收,将活着的内存空间分为两块,每一次只是用其中一块,再进行垃圾回收的时候将正在使用的内存中的存活对象复制到还没有被使用到的内存快里面,然后最后清楚正在使用到的内存块中的所有对象,交换两个内存的角色,最后完成垃圾回收。

2023-10-28 12:58:10 682

原创 微服务初始和Nacos安装

首先,找到 Nacos 安装目录的中的 conf/application.properties 文件,修改以下几次内容为以下配置:开启权限认证,权限认证类型是nacos,默认密码,开启白名单,可以设置成任意值,设置完成直接重新启动,先设置用户,在设置角色,最后设置权限,默认的数据源,是Derby数据库,是内置本地数据库,可以保证数据不丢失;微服务是将一个大型的,单一的应用程序拆分成多个小型服务,每一个服务负责于特定的业务功能,并且可以通过网络来和其他服务进行通讯,是一个思想,3)还可以进行历史信息的对比。

2023-10-27 16:51:08 633

原创 JVM进阶(2)

JVM

2023-10-26 16:05:09 759

原创 JVM进阶(1)

2)因为本身JAVA的。

2023-10-24 21:50:19 405

原创 MYSQL(事务+锁+MVCC+SQL执行流程)理解(2)

4)假设在RR隔离级别下执行下面的SQL,select * from user where name="张三",此时where条件中的name字段没有索引,那么对于其他的Session对该表任何一条记录做修改操作都会被阻塞住,因为在RR隔离级别下,需要解决不可重复读问题和幻读问题,所以在进行遍历扫描索引记录的时候,为了防止扫描过的索引被其他事务修改也就是不可重复读问题,或者是间隙被其他事务插入记录,从而导致数据不一致,所以MYSQL的解决方案就是把所有扫描过的索引记录和间隙锁都加上;

2023-10-24 16:43:29 396

原创 MYSQL(事务+锁+MVCC+SQL执行流程)理解

7)根据undolog版本链上的每一条记录的事务ID来判断当前这条记录是否已经在生成读视图之前提交了,小于min_id的一定是已提交事务,大于max_id一定是未提交事务,但是在min_id和max_id之间的记录有可能是已提交,也有可能是未提交;3)表锁开销小,加锁块,但是行锁开销大,加锁慢,这样子理解很简单,对于表来说只要找到这一张表,就可以直接给他加锁,速度很快,但是对于行锁来说,先要找到表,再来找行,效率很低,行锁的粒度肯定是比表锁小的,粒度越大,锁冲突的概率还是比较高的。

2023-10-23 21:50:29 972

原创 MYSQL(索引+SQL优化)

索引:索引是帮助MYSQL高效获取数据的排好序的数据结构1)假设现在进行查询数据,select * from user where userID=892)没有索引是一行一行从MYSQL进行查询的,还有就是数据的记录都是存储在MYSQL磁盘上面的,比如说插入数据的时候是向磁盘上面的某一个点位去存放,3)一次读取一条记录,一次IO,如果表中的数据非常多,就需要进行多次IO4)二叉树,key是主键值,value是数据所在的物理磁盘的地址;

2023-10-21 20:26:42 517

原创 AQS理解

AQS是JAVA中的一组抽象类,就是为了解决多线程并发竞争共享资源而引发的线程安全问题,细致点说AQS就是具备一套线程阻塞等待以及被唤醒的时候锁分配的机制,这个机制是由队列来实现的,暂时获取不到所的线程加入到队列里面,AQS本身并没有实现太多的业务功能,只是对外提供了三点核心内容来帮助实现其他的并发内容。

2023-10-20 16:37:27 115

原创 MYSQL中的锁

4)当一个事务对某张表或表中的行加了共享锁,则当前事务内可以对锁住的对象进行查询、修改和删除操作,其他事务对已经加锁的事务只能查询,当要修改或删除对应的记录时,将会阻塞等待。2)当select语句中的where条件查询的时候使用到了索引,那么会对查询结果所在的行进行锁定,也就是行级锁,如果查询没有使用到了索引,就会升级到表级锁;当一个事务对某张表或表中的行加了共享锁,其他事务也是可以对同一对象添加共享锁,即同一张表或行是可以被多个不同的事务同时添加共享锁的。

2023-10-09 12:50:43 238

原创 MYSQL日志和索引模块详解

下面这种情况范围查询后面的字段索引失效:但是如果修改成这样子:create index idx_age_name_classid on student(age,name,classID)

2023-10-05 21:38:56 397

原创 并发编程知识点总结

2)线程池会先启动若干数量的线程,这些线程都会处于睡眠状态,当有一个新的任务到来的时候,线程池就会唤醒某一个睡眠的线程,让他来进行处理客户端的请求,当处理完整个请求之后,线程又处于睡眠的状态,线程池可以很好地提高程序执行的性能,因为频繁的创建和销毁线程是很浪费时间的;1)这个核心线程数如果设置成0,那么表示没有任务的时候销毁线程池,如果核心线程数大于0表示线程池即使没有任务的时候最少的线程池的数量等于这个值,如果设置比较小,那么会频繁的创建和销毁线程,如果创建的值比较大,那么会浪费大量的系统资源。

2023-10-02 21:45:17 938

原创 线程安全问题+锁机制详解

1)_recursions是某一个线程某一次重复获取到锁的次数,可重入锁代表某一个线程可以重复的获取锁,因为synchronized是可重入锁,线程是可以重复的获取到这把锁,那么某一个线程每一次获取到锁的时候,计数器就会记录该线程和获取到锁的次数,每获取到一次锁,进入到这个房间,_recursions++,每当离开这个房间一次,那么这个计数器就--,当_recursions=0的时候,

2023-10-02 13:07:16 326

原创 索引+事务+排查慢SQL

1)降低资源消耗:普通的线程执行完成任务之后就被销毁了,而线程池中的线程执行完成任务之后会把这个线程继续放到池子里面,

2023-10-01 21:42:48 411

原创 JAVASE知识点总结

假设此时这个系统是支持用户进行配置的,是支持用户设置皮肤的颜色,设置系统的快捷键,此时就需要使用原型设计模式,不能自己设置把别人的设置都给改了,还不能修改默认的设置,就是为了防止用户有一天进行reset操作,实现原型设计模式,实现备份和恢复。一)为什么要使用克隆?

2023-09-30 16:04:53 223

原创 JAVA数据结构常见疑难解答

一)解决哈希冲突的方法有哪些?哈希冲突指的是在哈希表中,不同的键值映射到了相同的哈希桶,也就是数组索引,导致键值对的冲突1)设立合适的哈希函数:通过哈希函数计算出来的地址要均匀的分布在整个空间中1)当发生哈希冲突时,如果哈希表中没有装满,说明哈希表中一定还有空余位置,那么可以把key放到冲突位置的下一个空位置去,从发生冲突的位置开始,依次次向后探测,直到找到下一个空位置为止。

2023-09-21 09:16:57 353

原创 JavaSE语法常见疑难解答

注意:这里面的init方法就表示构造方法,每一次循环都创建两个对象,效率非常低每一次字符串的拼接,会被优化成创建StringBuilder对象,最后调用ToString,new对象花费时间,消耗内存。

2023-09-20 10:19:35 170

原创 并查集与LRUCache

2)毕业以后发现,学生们要去公司上班,每一个地方的学生自发的组织小分队开始上路,于是西安学生小分队{0,6,7,8},武汉学生小分队{2,3,5},成都学生小分队{1,4,9},每一个小分队的人的第一位同学当队长,带领大家找工作,4)从上图可以看出:编号6,7,8同学属于0号小分队,该小分队中有4人(包含队长0),编号为4和9的同学属于1号小分队,该小分队有3人(包含队长1),编号为3和5的同学属于2号小分队,该小分队有3个人(包含队长1)这里面是更新新的根节点中的元素个数,更新孩子的数量。

2023-09-18 10:56:49 100

原创 位图+布隆过滤器+海量数据问题(它们都是哈希的应用)

解法3:位图,假设40亿个数据放到了40亿个比特位里面,2^32=40个亿,40亿除8等于X字节,X字节/1024=YKB,YKB/1024=ZMB=512M,1个位占用一个数据,所以仅仅使用512M内存就可以把这些数据全部存储起来,位图。5)位图天然是可以去重的,JAVA当中有一个类叫做BitMap,也叫做位图,也是JAVA.util的类,BitMap底层实现的是long[],但是我们所实现的是byte[]数组,是用于快速查找某一个元素是否存在,况且还可以节省空间;2^30=10亿,10亿个字节。

2023-09-16 21:32:49 841

原创 高阶数据结构(2)-----红黑树(未完成)

在计算路径上的黑色节点数量时,通常会包括空节点(NIL节点)因为空节点被视为黑色节点的一部分,并且它们对于保持红黑树的平衡性和性质是必要的,所以,在判断从任意节点到达后代叶子节点的所有简单路径是否包含相同数量的黑色节点时,应该将空节点(NIL节点)也计算在内。1)红黑树就是一种高度平衡的二叉搜索树,但是在每一个节点上面都增加了一个存储位来表示结点的颜色,可以是红色或者是黑色,通过对任何一条从根节点到叶子节点上面的路径各个节点着色方式的限制,红黑树会自动确保没有一条路经会比其他路径的长度高出两倍,

2023-09-16 12:49:58 926

原创 记忆化搜索

1)确定一个状态标识:对应的就是dfs函数代表什么含义,dfs函数的含义就是给定一个数n,返回第n个斐波那契额数,所以这个n是一个可变参数,你给几,就返回第N个斐波那契数。1)这个递归的时间复杂度是很慢的:如图所示,当我们针对于这颗决策树来做深度优先遍历的时候,两个d(3)返回的数都是相同的,但是我们却。记忆化搜索:当在递归的过程中发现,当有重复的问题出现的时候,就可以把把这个完全相同的结果存放到备忘录里面,在这个题中,dfs被赋予的使命就是给你一个数N,返回第N个斐波那契额数即可,

2023-09-09 21:49:23 246

原创 floodfill算法(洪水灌溉算法)

一)floodfill算法简介:二)图像渲染。

2023-09-09 09:54:47 952

原创 穷举&&深搜&&暴搜&&回溯&&剪枝(4)

1)设计dfs函数:只需要关心每一层在做什么即可,从这个节点开始,去尝试匹配字符串的下一个字符,就是从某一个位置的字符开始,上下左右匹配下一个字符。char[][] board,i,j,s,pos),把原始的矩阵给我,把这个字符的位置给我,把要匹配字符串给我,字符串匹配到哪一个位置给我。给定一个节点的位置,上下左右去匹配一个结点的字符,2.1)使用一个和原始矩阵相同规模大小的布尔数组,

2023-09-08 12:48:49 574

原创 高阶数据结构(1)-----AVL树

TreeMap和TreeSet的底层实现原理就是红黑树一)AVL树:1)必须是一棵搜索树:前提是二叉树,任取一个节点,它的左孩子的Key小于父亲节点的Key小于右孩子节点的Key,中序遍历是有序的,按照Key的大小进行排列,我们在这里面得出一个结论: Key(甲)

2023-09-07 10:41:55 516

原创 栈和队列(优先级队列)

对于加减号的数字可以直接压入到栈里面,对于乘除号的数字,可以直接和栈顶元素进行计算,并替换栈顶元素作为计算之后的结果。一)删除字符串中所有相邻字符的重复项。算法原理:如果遇到空格,二)比较含退格的字符串。三)基本运算器(2)

2023-08-31 21:13:00 196

原创 哈希表+字符串

首先每一次先固定一个数left,然后从这个数(不包含array[left])后面找到right下标的数使得array[left]+array[right]==target,是需要将nums[left]后面的数(不包括nums[left])的数全部加入到哈希表中,如果是这样的话,是需要一开始将所有的数都加入到哈希表中,[2,4,5,8],target=8,此时再来进行模拟就可能找到两个4相加等于8,可能自己找到自己了,4.3)但数据范围小的时候:1-10^2~3~4~4~5,但是当出现负数不建议使用数组。

2023-08-30 16:09:50 432

原创 链表算法题

算法原理:只需要定义一个指针current遍历整个链表,创建一个虚拟的头节点然后进行头插操作,最后返回newHead.next即可。4)快慢双指针:链表中判断环,找链表中环的入口,以及找链表中倒数第N个节点。算法原理:模拟两数相加的过程即可,并使用虚拟头节点来连接我们最终的结果。优点:便于处理边界情况,方便针对链表进行操作。1)画图:非常直观+形象最终便于我们理解。解法1:递归解法:找到重复子问题。

2023-08-29 21:44:42 133

原创 二分查找算法

1)但是进行查找的时候,可以选取1/4位置的点和目标值作比较,可以选取1/2位置的点,可以选取1/8位置的点,如果选取1/4位置的点和target值作比较,那么直接有可能会干掉3/4的数据,如果选取1/8的位置的点那么有可能干掉7/8的数据,如果选取1/2位置的点有可能干掉1/2的数据,但是综合于数学期望来看,我们还是进行选取1/2位置的点,因为选取1/8位置的点,也有可能仅仅干掉1/8的数据,在中间的点的时间复杂度是最好的,

2023-08-24 12:51:57 976

原创 二叉树(4)------收尾

1)首先我们找到了整个数组中最大的元素作为我们的根节点,然后再从左区间中找到最大的元素作为当前根节点的左子树,然后再从右区间里面找到最大的元素作为根节点的右子树。这道算法题是在递归的过程中在不断的进行更新结果值,其实本质上dfs被赋予的任务就是计算出每一个节点的左右子树之和+当前根节点之和。解法1:将所有的#当作是一个叶子节点,所有的非#字符当成一个非叶子节点,那么最终要满足的条件就是度是0的。思路2:除了递归的方法之外,我们还可以使用迭代的方式。求出一个根节点的左子树的深度,在求出右子树的深度。

2023-08-10 22:34:30 260

原创 穷举&&深搜&&暴搜&&回溯&&剪枝(3)

一)字母大小写全排列1)从每一个字符开始进行枚举,如果枚举的是一个数字字符,直接忽视如果是字母的话,进行选择是变还是不变2)当进行遍历到叶子结点的时候,直接将结果存放到ret里面即可3)相对于是对于这个决策树做一个深度优先遍历二)优美的排列只要上面的条件有一种情况不满足,那么就进行剪枝操作;3)函数的递归出口:当遇到叶子节点的时候,直接返回结果先考虑第一个格子能不能进行存放,

2023-08-03 22:51:29 1061

原创 穷举&&深搜&&暴搜&&回溯&&剪枝(2)

2)从头开始的任意一个子串中,左括号的数量都是大于等于右括号的数量,如果发现右括号的数量是大于左括号的,那么必然会出现一个右括号没有做括号匹配,所以就不是一个有效的括号组合。3)回溯:当枚举完成当前位置向上归的过程中,先把path中添加的数进行剔除,然后再返回到上一层即可。2)当进行深度优先遍历的时候,使用这个path变量来进行记录这个路径中曾经出现过的括号。1)left表示左括号的数量,right表示右括号的数量,N表示一共有多少对括号。1)左括号的数量==有括号的数量。一)电话号码的字母组合。

2023-08-02 10:35:08 428

原创 穷举&&深搜&&暴搜&&回溯&&剪枝(1)

b)使用一个一维数组int[] path来保存此时路径上的所有的选择,path的作用就是当我在对这棵树做深度优先遍历的时候,记录一下此时路径上的所有选择,遍历到到叶子节点的时候就可以将这个path加入到二维数组中(path.length==nums.length),但是向上回溯的时候还需要恢复现场的,就拿最上面的那一个图来说,当我遍历到最下面的123的时候,需要将123这个数存放到二维数组里面,但是向上归上一层的过程中,要把3去掉,再次向上一层归的时候,要把2干掉;只需要考虑这个数选择还是不进行选择。

2023-08-01 13:51:02 442

原创 二叉树中的深搜

之前我的做题思路就是说先进行判断一下以当前节点为根节点的左子节点和右子节点是一颗二叉搜索树,再进行判断当前根节点的左子树是否是一颗二叉搜索树,和当前根节点的右子树是否是一颗二叉搜索树没但是这个判断方法是错误的,只能通过72个测试用例,请看上面。1)当判断完左子树之后,我需要继续进行判断右子树也就是0的右节点,此时发现右节点的左子树和右子树也都是空,况且右节点的值也是0,所以右节点也是可以干掉的,但是此时返回到1的时候。第二步:将当前的这个125传递给以5为根节点的左子树,算出左子树的和是1258。

2023-07-30 12:24:28 286

原创 动态规划(似包非包问题)(组合总和+不同的二叉搜索树)

之前想看看有5个结点的时候一共有多少种二叉搜索树,但是当我固定完成一个根节点3的时候左子树有两个节点的时候有多少种二叉搜索树,右子树有两个结点的时候有多少种二叉搜索树,dp[0]表示从选择组合数是0的方案个数,什么都不选,选择一个1个空集,就是一种方案,所以dp0]=1,如果初始化等于0,那么根据状态转移方程,后面的数都是等于0的。1)dp[i]=dp[i-nums[j]],以j位置为结尾,要找的是总和为i的最小排列数,那么只是需要去总和为i-nums[i]的排列数即可。所有的选法中,要的是最大的价值。

2023-07-29 09:46:43 314

原创 完全背包--动态规划

2)如果我们挑选i位置的礼物2个,那么我们只需要去找0-i-1区间去寻找j-2v[i]的礼物的最大价值即可,if(j-2*v[i]>=0) dp[i][j]=dp[i-1][j-2v[i]]+2*w[i];之前做01背包问题的时候我们i位置的值是可以选也是可以不选的,但是在多重背包里面,最有一个位置的值可以不选,可以选择1个,可以选择2个,还可以选择多个,所以说此时可以进行讨论的情况就变得非常多,3)如果挑选i位置的礼物3个,dp[i][j]=dp[i-1][j-3v[i]+2*w[i];

2023-07-27 11:16:59 390

原创 01背包问题------动态规划

1)如果选择i位置的商品,那么就去1-i-1中去选择商品组合,选择商品总容量的总体积要等于j-v[i],如果当前礼物的价值已经超过了j(v[i]>j]那么一定不能选择当前商品,如果j==v[i],那么礼物的最大价值就是dp[i][j]=dp[i-1][j-v[i](j-v[i]>=0)2)在进行挑选dp[i]的时候是很有可能会使用到之前的状态的,我在进行填写dp[i]的时候,会进行考虑这个i号物品是否进行选择,必须得知道背包容量,不知道背包容量,所以不知道是否可以把物品放进背包;

2023-07-26 13:47:13 340

原创 两个数组的dp问题(2)--动态规划

1)如果s1的[0,i]区间和s2的[0,j]区间能够拼接成s3字符串的[0,i+j]区间,那么s3字符串的的i+j位置要么是等于s1的i字符,要么是等于s2的j字符,要么都不等于。状态表示:dp[i][j]就表示s1中的[1,i]区间内的字符串以及s2[1,j]区间内的字符串能否拼接成s3的[1,i+j]区间内的字符串,1)dp[0][0]表示的是第一个字符串是空串况且第二个字符串也是空串,空串拼接空串当然可以。四)填表顺序+返回值:从上向下填写每一行,每一行从左向右进行编写,返回值是dp[m][n]

2023-07-25 22:39:22 215

原创 动态规划:跳跃游戏

填表顺序:从左向右,初始化为dp[array.length-1]=true,返回值是dp[0]我们可以从当前i位置向后走j步,看看从i+j的位置是否能够到达最后一个位置,二)根据状态表示推到状态转移方程:根据最近的一步来进行划分问题。dp[i]表示以i未知元素为起点,是否能够到达最后一个位置。那么就是说明从i位置是可以到达最后一个位置的。三)初始化+填表顺序+返回值。

2023-07-24 19:26:17 343

空空如也

空空如也

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

TA关注的人

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