- 博客(21)
- 收藏
- 关注
原创 JVM--类加载器
类加载器:只参与加载过程中的字节码获取并加载到内存中的部分;java虚拟机提供给应用程序去实现获取类和接口字节码数据的一种技术,也就是说java虚拟机是允许程序员写代码去获取字节码信息类加载是加载的第一步,主要有以下三个步骤:(1)通过全类名获取定义此类的二进制字节流;(2)将字节码文件的静态存储结构转换成方法区运行时的数据结构;(3)在内存中生成一个该类的class对象,作为方法区的访问入口;类加载器:(1)类加载器是负责加载类的一个对象,用于类加载中加载这一步;
2025-01-29 22:32:30
1509
原创 jvm--类的生命周期
学习类的生命周期之前,需要了解一下jvm的几个重要的内存区域:(1)方法区:存放已经加载的类信息、常量、静态变量以及方法代码的内存区域(2)常量池:常量池是方法区的一部分,用来存放常量和类中的符号引用等信息(3)堆区:用来存放类的对象实例(4)栈区:栈区是由一个个栈桢组成的后进先出的栈式结构,栈桢里面存放的是运行时产生的局部变量、方法出口等信息。当调用一个方法时,jvm就会创建一个栈桢存放这些数据,当这些方法调用完成后,栈桢就会消失。如果方法中调用了其他的方法时,就会在栈顶创建新的栈顶。
2025-01-27 20:22:43
1227
原创 redis缓存总结
更新缓存会产生无效更新,而且会存在较大的线程安全问题;删除缓存的本质是延迟更新,没有无效更新,线程安全问题相对较低,等需要的查询的时候,在更新到缓存。先更新数据库,再删除缓存可以满足原子性的情况下,线程安全问题概率较低;先删除缓存,再更新数据库,线程安全问题高,因为操作缓存和操作数据库的速度差异大。单体系统:利用事务机制;分布式系统:利用分布式事务机制。优点:确保两者的原子性,能最大程度保证线程安全。3、如果未命中,则查询数据库。2、如果缓存命中,直接返回。4、将数据库数据写入缓存。
2024-07-08 10:00:29
372
原创 redis缓存问题
逻辑分析:假设线程1在查询缓存之后,本来应该去查询数据库,然后把这个数据重新加载到缓存的,此时只要线程1走完这个逻辑,其他线程就都能从缓存中加载这些数据了,但是假设在线程1没有走完的时候,后续的线程2,线程3,线程4同时过来访问当前这个方法, 那么这些线程都不能从缓存中查询到数据,那么他们就会同一时刻来访问查询缓存,都没查到,接着同一时间去访问数据库,同时的去执行数据库代码,对数据库访问压力过大。2、布隆过滤:如果通过布隆过滤判断数据不存在,那就是不存在,如果判断数据存在就不能判断真假。
2024-07-07 21:28:53
470
原创 动态规划--买卖股票含冷冻期309
4、冷冻期(上次状态3)不持有股票的利润 j==3。这道题很明显下一天的利润需要由上一天的状态推导出来,所以这是很明显的动态规划问题。冷冻期的不持有来源:上次卖出股票的不持有。1、定义dp数组含义:dp[i][j]第i天第j个状态所得到的利润。持有股票利润来源:上一次持有、没有卖出股票,这次不持有(下次有冷静期)这次买入、冷冻期的不持有买入。)来源:上次所有不持有的状态。
2024-03-31 21:43:30
1329
1
原创 算法(10)--动态规划
递归公式: dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - weight[i]] + value[i]);第i个物品时的价值,dp[i - 1][j - weight[i]]代表在第0~(i-1)物品中的(j - weight[i])的最大价值。第i件物品的重量是weight[i],得到的价值是value[i]。举例:确定物品1时,dp[4]的值要么是直接继承原来15的值,要么是由物品1的价值+dp[4-物品1重量],所以可知。当i==0时,代表物品0是否取的状态,
2024-02-28 15:46:11
1545
1
原创 算法(9)--哈希表(1)哈希表基础知识
在数组的某个位置(y)建立链表结构或者树的结构来增加这个索引可以承载的元素值。个人理解:现在我们有一个数组(arr)和一个值(x),然后通过哈希函数(y = ax),找到数组下得索引(y),然后就能通过索引访问数组里面的元素( arr[y] )。这个方法里的数组只能放一个元素,但出现哈希碰撞时,索引值自动加一,这就得保证哈希表的长度得大于要存储数据的量。哈希碰撞:当某两个值(x)通过哈希函数计算出来的索引值(y)相同时,就会产生哈希碰撞。优点:通过哈希函数找到索引,能快速访问数组的值。
2024-02-07 21:02:00
370
1
原创 算法(8)--链表(5)环形链表 力扣142
走完 x = (n-1)(y-z) + z ,二者依然还在环形入口相遇,因为从相遇点出发的节点只是转了 (n-1)(y-z)圈回到第一次相遇点,然后再走z步,x的意思是,从头结点到环形入口的距离,所以第二次相遇时,他们依然在环形入口。我们定义两个指针,一个快指针(fast)一次走两步,一个慢指针(slow)一次走一步,如果最后他们相遇了,说明该链表有环。即 2(x+y)= x+y+ n(y+z)化简得:x = (n-1)(y-z) + z , 这个式子意味着,如果。时,依然设置两个指针,
2024-01-31 09:25:03
404
原创 算法(7)--链表(4)相交链表 力扣160
这道题看似是求两个链表的相交节点,其实是想让我们试图消除两个链表在相交前的链表长度差,如果知道链表长度差后,我们就可以把长的链表先循环到和短的链表同一个起始位置,然后一起往下遍历节点,当他俩的节点相同时,这个节点就是相交链表的相交点,这也是法一的思路。当链表a走到最后时,在赋值到链表b的起点重走一遍b的链表,b链表也是如此操作,到最后,两个链表的指针走得长度是。2、走到尽头看不到你,我把你的路重走一遍直到遇见了你,二者相加等于他们两条链表的总长度,把差值补上了。1、求出两个链表的长度,消除链表长度差;
2024-01-30 09:52:50
485
1
原创 算法(6)--链表(3)删除第N个节点 力扣19
思路:一开始先让fast指针走N+1步(走N+1步的原因是获得待删除节点的上一个节点,用于删除),然后fast指针和slow指针一起走,直到fast为null。很明显如果fast指针和slow指针如果相差N个距离时,最后slow指针指向的节点就是答案。1、遍历一遍链表,算出链表的长度,然后求出链表倒数的第N个节点,再遍历一遍。法一的思路非常直接明了,就是直接使用两个循环就行,下面代码是力扣里的题解。,试想一下,fast指针最后遍历完了链表,slow指针指向哪才是倒数第N个元素呢?快慢指针的距离就是N。
2024-01-29 09:49:01
437
原创 数学建模--灵敏度分析
上面的模型是基于市场价格下降1元和牛每天都基于5斤增重这两个条件不变,可在现实中这两个条件不是稳定的,为了检验是不是对于所有的市场价格下降率,这个模型都适用?例如:若市场下降率改变了1%,t下降了35%,这说明t对市场价格下降率比较敏感,模型不稳定,意味着我们建立的模型需要把。当我们改变了模型里面的原有的一些常量,会引起模型变化非常大(小),我们就说这个模型稳定性不强(强),灵敏性高(低)。在优化中,我们常常会将决策变量前面的参数直接取值,如运费的价格、物料的成本等,但事实上价格成本等因素受市场。
2024-01-24 21:35:16
4393
原创 算法(4)--链表(1)力扣203
本文实现删除链表两种操作:一种是带有头结点:需要准备两个节点,记录一个记录待删除节点的前一个节点,记录一个记录待删除节点;一种是不带有头结点:执行逻辑分为两个,一个是首结点的删除,一个是其他节点的删除。
2024-01-22 20:33:36
369
原创 算法(2)--双指针
快慢指针:一个快指针和一个慢指针可以用一个for循环完成两个for循环的工作(条件是具有单调性)滑动窗口:不断调节子序列的起始位置和终止位置,起始位置和终止位置的区间不可间断。
2024-01-20 09:39:46
348
原创 力扣647回文子串--动态规划
首先我们来想一下动态规划的五部曲:1、确定dp数组以及下标的含义;2、确定递推公式;3、dp数组的初始化;4、确定遍历顺序;5、举例推导dp数组;我们定义一个boolean的二维数组来作为dp数组,下标i和j分别表示数组的行和列上图中有三种情况可以得到回文子串:1、当i==j时,也就是数组的对角线都是单个字母,即可认为是回文子串2、当i==j+1时,也就是两个相邻的字符相同是回文子串;
2023-12-06 09:49:40
62
1
原创 StringBuilder详细源码分析(1)
父类中的append方法传入我们输入的字符串str,我们的str非null,所以跳过if来到给len赋值,给len赋值为我们传入字符串str的长度,然后调用ensureCapacityInternal方法,传入count(目前没有初始化,所以默认为0)+len,这个方法是为了判断是否需要扩容。这篇文章主要讲的是new StringBuilder(String str)这种构造方法的源码分析。第二种:16
2023-07-11 10:16:20
143
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人