JAVA
爱吃西红柿鸡蛋面
来者犹可追。不积硅步无以至千里。
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
wait——虚假唤醒
我们的需求是如果是0就+1, 如果是1就-1.class Share { private int num = 0; //+1操作 public synchronized void incre() throws InterruptedException { if(num != 0) { //如果不等于0,释放锁进行等待。 this.wait(); } num++; Sys原创 2022-03-13 18:44:03 · 666 阅读 · 4 评论 -
JVM有哪些区域会发生内存溢出OOM?
文章目录1.运行一个java系统就是运行一个java进程2.执行哪些代码:JVM得加载你的类3.Java虚拟机栈:让线程执行各种方法4.堆内存:存放创建的对象总结1.运行一个java系统就是运行一个java进程public class HelloWorld { public static void main(String[] args) { String message = "Hello World"; System.out.println(message);原创 2022-02-18 16:01:15 · 807 阅读 · 0 评论 -
MVCC——可重复度(RR)
可重复度(RR):仅在第一次执行快照时生成ReadView,后续快照复用。(例外:当本次事务两次快照读之间有当前读,那么第二次快照读会重新生成ReadView)对应的undo log版本链为:我们来分析一下事务D两次快照读的ReadView:第一次ReadView:根据版本链数据访问规则,第一条数据(trx_id = 3)不满足规则;第二条数据(trx_id = 2)不满足规则;第三条数据(trx_id = 1)满足 trx_id(1) < min_trx_id(2),说明数据.原创 2022-02-10 17:50:17 · 990 阅读 · 1 评论 -
MVCC——读已提交(RC)
读已提交(RC)在每次执行快照读时生成ReadView。对应的undo log版本链为:版本链数据访问规则:1.判断当前事务id 是否等于 creator_trx_id,等于说明这个数据是我自己的事务修改的,可以访问。2.判断trx_id < min_trx_id ? 成立说明数据已经提交了,可以访问。3.判断trx_id > max_trx_id ? 成立说明该事务是在ReadView生成之后开启的,不能访问。4.min_trx_id < trx_id <原创 2022-02-10 17:03:51 · 1286 阅读 · 1 评论 -
基于undo log版本链实现的ReadView机制
ReadView是什么?ReadView是“快照读”SQL执行时MVCC提取数据的依据,快照读就是最普通的Select查询语句,当你执行时,就会生成ReadView。当前读指执行下列语句时进行数据读取的方式:Insert、Update、Delete、Select…for update、Select…lock in share modeReadView有四个关键变量:① m_ids:活跃事务(未提交的事务)集合。 ② min_trx_id:活跃事务中最小的id。 ③max_trx_id:原创 2022-02-10 16:33:28 · 589 阅读 · 0 评论 -
MVCC前序——undo log版本链
undo log 版本链我们每条数据有两个隐藏字段,trx_id 和 roll_pointer,trx_id表示最近一次事务的id,roll_pointer表示指向你更新这个事务之前生成的undo log。举例:如有事务A(id=50),修改了这条数据,那么这条数据的隐藏字段以及指向的undo log如下图:因为是第一次修改,那么更新这个事务之前生成的undo log是空的。接着,事务B(id = 60)修改了这条数据,把值改为了值B,这条数据的trx_id = 60 ,roll_pointer原创 2022-02-10 11:40:52 · 999 阅读 · 0 评论 -
72. 编辑距离
题目描述给你两个单词 word1 和 word2, 请返回将 word1 转换成 word2 所使用的最少操作数 。你可以对一个单词进行如下三种操作:插入一个字符 删除一个字符 替换一个字符示例输入:word1 = “horse”, word2 = “ros”输出:3解释:horse -> rorse (将 ‘h’ 替换为 ‘r’)rorse -> rose (删除 ‘r’)rose -> ros (删除 ‘e’)输入:word1 = “intention”,原创 2022-02-03 14:10:28 · 430 阅读 · 0 评论 -
redo log日志
redo logredo log日志也叫重做日志,记录某个数据页修改操作,如:对表空间xx中的数据页xx中的偏移量xxx的地方更新了数据xxx。当系统宕机后用来恢复至最后一次事务提交的时候。原创 2022-02-01 18:52:53 · 2314 阅读 · 0 评论 -
jvm查看gc频率
jdk版本1.8查看java进程]#jps24019 user.jar25885 Jps26958 Main目标进程24019监控jvm,每5秒打印一次]# jstat -gc 24019 5000 S0C S1C S0U S1U EC EU OC OU MC MU CCSC CCSU YGC YGCT FGC FGCT GCT 5324转载 2022-01-18 21:39:33 · 821 阅读 · 0 评论 -
IDEA键位
1.Ctrl + h : 打开接口的实现类原创 2022-01-17 16:38:33 · 275 阅读 · 0 评论 -
Oauth2.0学习——角色、授权流程
Oauth2.0 角色资源所有者(Resource Owner):本身资源信息的用户,客户端访问用户的权限仅限于用户所授权的范围。客户端(Client): 访问资源的第三方应用。授权服务器(Authorization Server ): 授权服务器用来验证用户提供的信息是否正确,并返回一个令牌(token)给第三方应用。资源服务器(Resource Server): 资源服务器提供用户资源的服务器,例如头像、照片、视频等。Oauth2.0 授权流程步骤1:客户端(第三方应用)向用户请求授权。原创 2022-01-15 12:00:40 · 2678 阅读 · 0 评论 -
session与token简单区别
Session机制Session是存储在服务端的,每次请求客户端Cookie中携带sessionId,服务器进行验证,sessio是有状态的。缺点:如果服务器做了负载均衡有多个,用户的请求到达某个服务器时,这个服务器没有用户的session信息,就会会话失败。所以Session默认机制下是不适合分布式部署的。TokenToken我们一般称为令牌,一般通过MD5、SHA算法将密钥、公钥、时间戳等元素加密产生的加密字符串。浏览器访问服务器后认证成功会返回token给客户端,客户端后续请求会携带这个to原创 2022-01-14 12:07:21 · 1491 阅读 · 0 评论 -
使用 @Autowired 的时候,到底是写接口还是实现类?
场景:使用 @Autowired 的时候,到底是写接口还是实现类?答案:写的接口当实现类唯一时,表面上注入接口,其实注入实现类当实现类多个时,通过@Service(“menuService1”)指定实现类解析:这个其实是创建了实现类的对象但引用了接口类型,即 “InjectionDao injectionDao = new InjectionDaoImpl ()”, 是 Java 多态性(向上转型)的一种应用。在实现类处加 @Repository 注解,意思就是 new InjectionDa转载 2022-01-13 15:56:04 · 4299 阅读 · 0 评论 -
表空间与数据区
表空间:我们创建的表,在磁盘都对应“表名.ibd”磁盘文件。物理层面上,表空间就是对应一些磁盘上的文件。数据区:一个表空间的磁盘文件有很多数据页(16kb),不方便管理,所以在表空间引入了数据区(extent)的概念。一个数据区有64个连续数据页,每个数据页16kb,所以一个数据区是1mb,256个数据区分为一组。表空间有多组数据区,他的第一组数据区的前三个数据页是存放一些特殊信息的。其他组的第一个数据区的前两个数据页存放特殊信息。...原创 2022-01-12 23:56:46 · 373 阅读 · 0 评论 -
G1垃圾回收器学习2
1.什么时候触发新生代与老年代的混合垃圾回收?“-XX:InitiatingHeapOccupancyPercent”参数,默认为45%。当老年代的Region占了45%时,会触发新生代+老年代混合回收阶段。2.回收过程①初始标记——“Stop the World”标记GC Roots(栈的局部变量、方法区的类静态变量)直接引用的对象。②并发标记进行追踪,从GC Roots开始追踪所有存活对象。并发标记阶段与系统程序并发运行,所以对程序影响不大。这个阶段还会记录对象的新建与失去引用。③最终标记原创 2021-12-24 13:53:36 · 861 阅读 · 0 评论 -
G1垃圾回收器学习1
G1垃圾回收器的设计思想:把堆内存拆分为大小相同的多个Region,老年代和新生代各自对应一些Region,回收的时候选择停顿时间少的和能回收较多对象的Region,尽可能减少系统停顿时间。1.每个Region多大?JVM最大可以有2048个Region,每个Region大小为2的倍数。==Region的大小=堆内存 / 2048。==如堆内存4GB(4096MB),除2048,那么每个Region大小为2M。或者通过-XX:G1HeapRegionSize指定Region大小。2.新生代包含多少原创 2021-12-24 10:20:50 · 198 阅读 · 0 评论 -
每日总结day10
题:动态规划:121. 买卖股票的最佳时机122. 买卖股票的最佳时机 II(动态规划)总结Minor GC 与 FUll GC触发时机等问题。原创 2021-12-18 22:57:20 · 157 阅读 · 0 评论 -
Minor GC 与 Full GC触发时机等问题总结
1.什么时候触发Minor GC?答:当新生代的Eden区或其中一个Survivor区空间不足时。2.触发Minor Gc之前会如何检查老年代大小,涉及几个步骤和条件?答:①判断新生代中所有对象大小是否小于老年代可用大小,如果小于就进行Minor Gc,如果大于进行②操作。②如果设置了-XX:HandlePromotionFailure这个参数,就进行③操作,如果没设置则会触发Ful GC。(jdk1.6以后这个参数就没了,直接进行③操作)③判断Minor GC历次进入老年代的平均对象大小是否小于原创 2021-12-18 21:42:46 · 574 阅读 · 0 评论 -
每日总结day9
题:198. 打家劫舍;213. 打家劫舍 II原创 2021-12-17 22:20:34 · 125 阅读 · 0 评论 -
每日总结day8
题:动态规划:139. 单词拆分专栏:写入数据库的一行数据,在磁盘上怎么存储的?原创 2021-12-13 22:27:19 · 397 阅读 · 0 评论 -
每日总结day7
题:动态规划:70. 爬楼梯(完全背包)71. 完全平方数(完全背包)322. 零钱兑换(完全背包)原创 2021-12-12 22:21:49 · 198 阅读 · 0 评论 -
每日总结day6
专栏:1.根据chunk机制动态调整buffer poll大小。题:动态规划518. 零钱兑换 II(求装满背包的递推方程一般是dp[j] += dp[j - 此间商品的重量] (组合)377. 组合总和 Ⅳ(排列)原创 2021-12-11 22:08:51 · 303 阅读 · 0 评论 -
每日总结day5
专栏:1.lru链表带来的问题(预读机制可能把不常用的数据页加载进buffer pool中,而把常用的缓存页给刷到磁盘进行淘汰);2.mysql的预读机制(用来淘汰尾部不常用的缓存页);3.lru算法优化(冷热数据分离)4.基于冷热数据分离的lru链表解决了全表扫描和预读机制加载进来不常用的数据页问题。5.lru链表热数据区优化:后3/4部分数据被访问才移动到链表头,前面1/4部分数据被访问不会移动。这样就节省了结点移动。题:动态规划:1049. 最后一块石头的重量 II;494. 目标和原创 2021-12-08 22:26:43 · 1017 阅读 · 0 评论 -
每日总结day4
题:动态规划96. 不同的二叉搜索树(对于推导方程不是很理解);343 整数拆分;01背包问题(优化);416. 分割等和子集原创 2021-12-05 22:27:06 · 122 阅读 · 0 评论 -
每日总结day3
题:动态规划62 不同路径;63 不同路径 II原创 2021-12-01 22:02:46 · 116 阅读 · 0 评论 -
每日总结day2
复习:1.继承中成员方法的访问特点。在父子继承关系中,创建子类对象,访问成员方法的规则:创建的对象是谁,就优先用谁,如果没有则向上找(父类)。注意:无论是成员方法或成员变量的访问,如果没有都向上找(找父类)。2.继承中构造方法的访问特点。子类构造方法默认有一个隐式的super()。子类构造可以通过super关键字来调用父类重载的构造方法。子类构造方法中,super只能有一个并且要在第一位。子类普通方法不能使用super()调用父类构造方法。3.super关键字的三种用法,访问父类成员变量原创 2021-11-30 22:27:22 · 215 阅读 · 0 评论 -
每日总结day1
题:贪心:968. 监控二叉树;714. 买卖股票的最佳时机含手续费(还没理解透)动态规划:746 使用最小花费爬楼梯;70 爬楼梯;509 斐波那契数复习:继承中成员变量的访问方法。在父子类继承中,如果成员变量同名,创建子类对象时,访问有两种方法:1.直接通过子类对象访问成员变量:new对象的时候,等号左边是谁,就优先使用谁,如果没有则向上找(找父类看有没有).public class Father { int num = 200; int len = 20;}pu原创 2021-11-29 22:17:50 · 208 阅读 · 0 评论 -
JVM整体运行原理图
1.第一步,我们把写好的.java文件进行打包成jar包或war包,打包过程中会把.java编译成.class字节码文件。2.我们JVM需要运行.class文件,通过类加载器把这些文件加载到JVM中,供后续代码运行来使用。类加载器遵从双亲委派模型。应用程序类加载器会问扩展类加载器是不是你的,扩展类加载器会问上层启动类加载器是不是你的类。如果启动类加载器有,则进行类加载到jvm内存方法区。如果没有就向下委派给扩展类加载器,去寻找是不是它的类,如果不是继续向下委派给应用程序类加载器。如果每一层都没.原创 2021-10-25 21:24:59 · 370 阅读 · 0 评论 -
JZ4 重建二叉树
题目描述给定某二叉树的前序遍历和中序遍历,请重建出该二叉树并返回它的头结点。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建出如下图所示。思路前序遍历中,第一个数字是该数的根节点,但在中序遍历中,根节点在序列的中间,根节点的左边序列为左树,右边序列为右树。如前序结点1,在中序中472就是结点1的左子树,5386就是1结点的右子树。由前序的结点1我们确定了中序的左右子树。如:递归时如何确定要递归的范围?我们可用k来记录中序结点的左边原创 2021-09-10 13:46:04 · 359 阅读 · 0 评论 -
排序算法之归并排序
定义归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide andConquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。实现思路递归方法。终止条件:元素只有一个时,本身有序。end - start == 0;像二叉树一样进行递归。递归完成后,需要做两步,1:将当前要归并的左右区间元素放入创建的辅助数组中。2:进行归并(放入arra原创 2021-09-08 17:48:29 · 142 阅读 · 0 评论 -
排序算法之堆排序
原理基本原理也是选择排序,只是不在使用遍历的方式查找无序区间的最大的数,而是通过堆来选择无序区间的最大的数。注意:升序建大根堆,降序建小根堆。思路1.先把数组建成大根堆。2.堆顶元素和最后一个元素交换。交换完后再进行大根堆,后续交换时长度每次-1,相当于每次交换完后,有序长度+1。代码实现/** * @Author: huang * @Date: 2021/9/5 9:58 * @Description: 堆排序 */public class Main7 { public原创 2021-09-05 19:55:00 · 262 阅读 · 0 评论 -
二叉树的最近公共祖先
题目描述给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。百度百科中最近公共祖先的定义为:“对于有根树 T 的两个节点 p、q,最近公共祖先表示为一个节点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”示例 1:输入:root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 1输出:3解释:节点 5 和节点 1 的最近公共祖先是节点 3 。示例 2:输入:root = [3,5,1,6,2,0,8,原创 2021-09-04 17:32:36 · 120 阅读 · 0 评论 -
排序算法之选择排序
定义每一次从无序区间选出最大(或最小)的一个元素,存放在无序区间的最后(或最前),直到全部待排序的数据元素排完 。有两层for循环。第一层for表示执行多少次能完全有序。第二层for表示要从无序区间找出最大的元素。代码实现/** * @Author: huang * @Date: 2021/8/31 15:05 * @Description: 选择排序 */public class Main6 { public static void main(String[] args) {原创 2021-08-31 16:08:22 · 111 阅读 · 0 评论 -
二叉树的层序遍历
题目描述给你一个二叉树,请你返回其按 层序遍历 得到的节点值。 (即逐层地,从左到右访问所有节点)。示例:二叉树:[3,9,20,null,null,15,7],3 / \ 9 20/ \15 7返回其层序遍历结果:[[3],[9,20],[15,7]]来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/binary-tree-level-order-traversal著作权归领扣网络所有。商业转载请联系官方授权,原创 2021-08-29 23:19:32 · 120 阅读 · 1 评论 -
排序算法之希尔排序
定义思路希尔排序法又称缩小增量法。希尔排序法的基本思想是:先选定一个整数,把待排序文件中所有记录分成个组,所有距离为的记录分在同一组内,并对每一组内的记录进行排序。然后,取,重复上述分组和排序的工作。当到达=1时,所有记录在统一组内排好序。希尔排序是对直接插入排序的优化。当gap > 1时都是预排序,目的是让数组更接近于有序。当gap == 1时,数组已经接近有序的了,这样就会很快。这样整体而言,可以达到优化的效果。我们实现后可以进行性能测试的对比。本质上和插入排序无区别,只不过是每次在原创 2021-08-26 19:05:38 · 196 阅读 · 0 评论 -
单例模式(饿汉、懒汉)
懒汉模式:public class LazyMan { private static LazyMan instance; private LazyMan() { System.out.println(Thread.currentThread().getName()+ "ok"); } public static LazyMan getInstance() { if (instance == null) { insta原创 2021-08-25 16:55:21 · 100 阅读 · 0 评论 -
重载和重写的区别
重写重载范围子类与父类之间同一个类参数列表个数、类型、顺序相同个数、类型、顺序不同返回值完全相同不做要求访问权限修饰符子类重写父类方法时,修饰符要大于等于父类修饰符。父类被private修饰的方法不能被重写不做要求抛出异常子类异常不能大于父类异常,子类不能抛出新异常重载的方法可以抛出不同的异常构造方法不能被重写可重载多态性动态多态(绑定)。动态绑定是指在“执行期间”(而非编译期间)判断所引用的实际对象类型,根据其实际的类型调...原创 2021-08-25 15:09:37 · 92 阅读 · 0 评论 -
排序算法之直接插入排序
定义思路分为有序区间和无序区间刚开始时,把第一个元素当成有序区间,后面的为无序区间。每次选择无序区间的第一个元素,在有序区间内选择合适的位置插入(当前元素与有序区间比较)。外层循环代表每次从无序区间找第一个元素和有序区间比较的次数。比如有5个数,刚开始有序区间为1个数,还要执行4次,有序区间达到5个数。内层循环代表从有序区间拿到的最后一个元素与无序区间第一个元素进行比较代码实现public class Main4 { public static void main(String[] a原创 2021-08-24 23:39:10 · 103 阅读 · 0 评论 -
最后一块石头的重量
题目描述有一堆石头,每块石头的重量都是正整数。每一回合,从中选出两块 最重的 石头,然后将它们一起粉碎。假设石头的重量分别为 x 和 y,且 x <= y。那么粉碎的可能结果如下:如果 x == y,那么两块石头都会被完全粉碎;如果 x != y,那么重量为 x 的石头将会完全粉碎,而重量为 y 的石头新重量为 y-x。最后,最多只会剩下一块石头。返回此石头的重量。如果没有石头剩下,就返回 0。示例:输入:[2,7,4,1,8,1]输出:1解释:先选出 7 和 8,得到 1,所以数原创 2021-08-23 21:18:35 · 107 阅读 · 0 评论 -
查找和最小的K对数字(TopK)
题目描述给定两个以升序排列的整数数组 nums1 和 nums2 , 以及一个整数 k 。定义一对值 (u,v),其中第一个元素来自 nums1,第二个元素来自 nums2 。请找到和最小的 k 个数对 (u1,v1), (u2,v2) … (uk,vk) 。示例 1:输入: nums1 = [1,7,11], nums2 = [2,4,6], k = 3输出: [1,2],[1,4],[1,6]解释: 返回序列中的前 3 对数:[1,2],[1,4],[1,6],[7,2],[7,4原创 2021-08-23 19:31:09 · 384 阅读 · 0 评论
分享