自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 给女朋友写的简单的公众号推送信息程序

微信推送

2022-08-22 21:46:41 790 2

原创 sql优化相关

​ 会产生临时表。因为先从p表查出来符合条件的行记录,现在还不能排序,要和s表连到一起才能排序。连到一起产生的表就是临时表,在临时表上排完序才可以返回。​ ​ 这样就不会产生临时表。因为可以直接在p表查出来,排好序,在进行联表,而此时联表的数据已经是所需要的数据,可以直接返回。上面所述的p表就是驱动表。(永远用小结果集驱动大结果集)当使用left join等关联查询时,若order by子句和group by子句都来自于从表时会产生临时表,来自于非驱动表的排序都

2022-07-09 14:35:10 436

原创 索引下推的基本原理

索引下推(Index Condition Pushdown,简称ICP),是MySQL5.6版本的新特性,它能减少回表查询次数,提高查询效率。我们先简单了解一下MySQL大概的架构:MySQL服务层负责SQL语法解析、生成执行计划等,并调用存储引擎层去执行数据的存储和检索。索引下推的下推其实就是指将部分上层(服务层)负责的事情,交给了下层(引擎层)去处理。我们来具体看一下,在没有使用ICP的情况下,MySQL的查询:使用ICP的情况下,查询过程:索引下推的具体实践理论比较抽象,我们来上一个实践。使用一张用

2022-07-09 14:30:55 775

原创 在公司解决的问题

打印日志的时候服务器上总出现文件大小为0的日志文件,导致文件数量过多。暂时还没找到原因,先粗暴解决一下

2022-07-05 15:37:55 146

原创 省份的数量

深度优先搜索class Solution { public int findCircleNum(int[][] isConnected) { int n = isConnected.length; boolean[] used = new boolean[n]; int res = 0; for(int i = 0;i < n;i++){ if(!used[i]){ re.

2022-04-14 20:44:48 156

原创 回文子串(动态规划)

动规五部曲:确定dp数组(dp table)以及下标的含义布尔类型的dp[i][j]:表示区间范围[i,j] (注意是左闭右闭)的子串是否是回文子串,如果是dp[i][j]为true,否则为false。确定递推公式在确定递推公式时,就要分析如下几种情况。整体上是两种,就是s[i]与s[j]相等,s[i]与s[j]不相等这两种。当s[i]与s[j]不相等,那没啥好说的了,dp[i][j]一定是false。当s[i]与s[j]相等时,这就复杂一些了,有如下三种情况情况一:下标i 与 .

2022-03-20 10:59:56 581

原创 交替打印A、B(通知等待和信号量)

通知等待如果让打印ABC 那就把flag换成一个num,用来区分。package sync;public class PringAB { static boolean flag = true; private static final Object foo= new Object(); // 锁标志 static class A implements Runnable{ @Override pub

2022-03-17 12:39:45 591 2

原创 mysql binlog和redolog的作用(持久性的实现)

我们需要先了解下redo log、bin log的区别:Binlog是server层的日志,主要做mysql功能层面的事情redolog:redo是innodb独有的,binlog是所有引擎都可以使用的redo是物理日志,记录的是在某个数据页上做了什么修改,binlog是逻辑日志,记录的是这个语句的原始逻辑redo是循环写的,空间会用完,binlog是可以追加写的,不会覆盖之前的日志信息binlog:Binlog中会记录所有的逻辑,并且采用追加写的方式一般在企业中数据库会有备份系统,

2022-03-14 18:52:07 1826

原创 用redis解决消息队列重复消费问题

重复消费问题:为了解决消费端因为种种原因而造成的消息丢失问题,我们都知道根源在于因为RabbitMQ的自动ack机制,所以为了避免以上问题,我们会选中手动ack,以确保消息不会因为某些原因而丢失。但随之而来的也有一个问题:如果忘记ack,或者又因为种种原因消费者端没能给RabbitMQ对应ack,无法确认消息已经被消费完了,那这条未被“约束”的消息也许就会被另一个消费者消费,就会造成重复消费问题如果是进行增加,或者一些非幂等性操作,比如扣费业务,那可就完犊子了而其中用Redis似乎是对解决重复消费问

2022-03-14 13:18:25 7452

原创 路经总和(广搜)

定义两个队列,一个存节点(队列一),一个存到目前为止的和(队列二)。如果是叶子节点并且目前队列二的值等于目标值,就返回true。将4添加到队列1的时候同时将9添加到队列二。 public boolean hasPathSum(TreeNode root, int targetSum) { if(root == null) return false; Queue<TreeNode> queue = new LinkedList<>(); .

2022-03-13 18:17:43 193

原创 二叉树的最小深度

bfs解法:当我们找到一个叶子节点时,直接返回这个叶子节点的深度。广度优先搜索的性质保证了最先搜索到的叶子节点的深度一定最小。 public int minDepth(TreeNode root) { int res = 0; if(root == null) return res; Queue<TreeNode> queue = new LinkedList<>(); queue.add(root); .

2022-03-13 17:48:29 460

原创 MysqlMvcc多版本并发控制实现原理

1、什么是MVCC?MVCC是在并发访问数据库时,通过对数据做多版本管理,避免因为写锁的阻塞而造成读数据的并发阻塞问题。通俗的讲就是MVCC通过保存数据的历史版本,根据比较版本号来处理数据的是否显示,从而达到读取数据的时候不需要加锁就可以保证事务隔离性的效果2、Innodb MVCC实现的核心知识点undo log(回滚日志)之前对undo log的作用只提到了回滚操作实现原子性,现在需要知道的另一个作用就是实现MVCC多版本控制器。undo log细分为俩种,insert时产生的undo

2022-03-11 21:27:03 1239

原创 缓存击穿、缓存雪崩、缓存穿透的区别

1. 缓存穿透描述:缓存穿透是指缓存和数据库中都没有的数据,而用户不断发起请求,如发起为id为“-1”的数据或id为特别大不存在的数据。这时的用户很可能是攻击者,攻击会导致数据库压力过大。解决方案:接口层增加校验,如用户鉴权校验,id做基础校验,id<=0的直接拦截;(布隆过滤器)从缓存取不到的数据,在数据库中也没有取到,这时也可以将key-value对写为key-null,缓存有效时间可以设置短点,如30秒(设置太长会导致正常情况也没法使用)。这样可以防止攻击用户反复用同一个id暴力攻击

2022-02-21 19:41:58 205

原创 Spring循环依赖为什么使用三级缓存?

只使用二级缓存,且二级缓存缓存的是一个不完整的bean如果只使用二级缓存,且二级缓存缓存的是一个不完整的bean,这个时候a在设置属性的过程中去获取b(这个时候a还没有被aop的后置处理器增强),创建b的过程中,b依赖a,b去缓存中拿a拿到的是没有经过代理的a。就有问题。使用二级缓存,且二级缓存是一个工厂方法的缓存如果二级缓存是一个工厂的缓存,在从缓存中获取的时候获取到经过aop增强的对象。可以看到从工厂缓存中获取的逻辑。a依赖b,b依赖a,c。c又依赖a。a,b,c均aop增强。加载开始.

2022-02-19 10:49:44 696 1

原创 跳跃游戏 1,2

性质:能够到达当前位置的,其左边所有位置都能到达。所以我们只需计算最大能不能到达末尾。 public boolean canJump(int[] nums) { int n = nums.length; int max = 0; for(int i = 0;i < n;i++){ if(i > max) return false; //一定要先判断 max = Math.max(max,i + n.

2022-02-17 20:35:05 3114

原创 Zookeeper选举机制

zookeeper节点的4种状态:LEADING:说明此节点已经是leader节点,处于领导者地位的状态,差不多就是一般集群中的master。但在zookeeper中,只有leader才有写权限,其他节点(FOLLOWING)是没有写权限的,可以读LOOKING:选举中,正在寻找leader,即将进入leader选举流程中FOLLOWING:跟随者,表示当前集群中的leader已经选举出来了,主要具备以下几个功能点 :向leader发送请求(PING消息、REQUEST消息、ACK消息、REV

2022-02-17 18:28:18 208 1

原创 Map实现类的区别

java为数据结构中的映射定义了一个接口java.util.Map;它有四个实现类,分别是HashMap Hashtable LinkedHashMap 和TreeMap.Map主要用于存储健值对,根据键得到值,因此不允许键重复(重复了覆盖了),但允许值重复。Hashmap 是一个最常用的Map,它根据键的HashCode值存储数据,根据键可以直接获取它的值,具有很快的访问速度,遍历时,取得数据的顺序是完全随机的。 HashMap最多只允许一条记录的键为Null;允许多条记录的值为 Null;Has

2022-02-13 18:22:04 206

原创 Java实现LRU

LinkedHashMap保存了记录的插入顺序,在用Iterator遍历LinkedHashMap时,先得到的记录肯定是先插入的。class LRUCache { private int capacity; private Map<Integer,Integer> map = new LinkedHashMap<>(); public LRUCache(int capacity) { this.capacity = capacity;

2022-02-13 18:19:22 129

原创 redis常用数据结构

1. string介绍 :string 数据结构是简单的 key-value 类型。虽然 Redis 是用 C 语言写的,但是 Redis 并没有使用 C 的字符串表示,而是自己构建了一种 简单动态字符串(simple dynamic string,SDS)。相比于 C 的原生字符串,Redis 的 SDS 不光可以保存文本数据还可以保存二进制数据,并且获取字符串长度复杂度为 O(1)(C 字符串为 O(N)),除此之外,Redis 的 SDS API 是安全的,不会造成缓冲区溢出。常用命令: set

2022-02-13 16:23:39 551

原创 Mysql事务隔离级别

什么是事务?事务是逻辑上的一组操作,要么都执行,要么都不执行。事务最经典也经常被拿出来说例子就是转账了。假如小明要给小红转账1000元,这个转账会涉及到两个关键操作就是:将小明的余额减少1000元,将小红的余额增加1000元。万一在这两个操作之间突然出现错误比如银行系统崩溃,导致小明余额减少而小红的余额没有增加,这样就不对了。事务就是保证这两个关键操作要么都成功,要么都要失败。事务的特性(ACID)原子性: 事务是最小的执行单位,不允许分割。事务的原子性确保动作要么全部完成,要么完全不起作用;

2022-02-12 16:42:09 77

原创 k个一组翻转链表

/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode() {} * ListNode(int val) { this.val = val; } * ListNode(int val, ListNode next) { this.val = val; this.next = next; } * }.

2022-02-11 15:41:56 255

原创 gdc函数(最大公约数)

public int gdc(int a,int b){ return b != 0 ? gdc(b,a%b):a; }

2022-02-10 14:55:43 555

原创 两两交换链表中的节点

public ListNode swapPairs(ListNode head) { ListNode res = new ListNode(); res.next = head; ListNode temp = res; while(temp.next!=null&&temp.next.next!=null){ ListNode node1 = temp.next; L...

2022-01-28 13:30:09 124

原创 颜色分类(面试题)

把0都放在左边,把2都放在右边。但是需要注意的是,每在右边放一个数,就要把遍历的长度-1,并且还要i–以检查交换过来的数是不是0或者2。而往左边放的时候就不用考虑,因为和左边的交换必然是和1交换。 public void sortColors(int[] nums) { int lf = 0; int rt = nums.length - 1; int n = nums.length; for(int i = 0;i < n;i++).

2022-01-27 18:15:37 283

原创 自己实现Pow(x,n)

我们每次都让x乘自己 也就是x的平方,然后索引循环次数/2。但是如果碰到i是奇数,那么就还让再让他乘一下自己,在平方,需要把这个值乘到res里面做弥补,同时最后一次i/2必然为1即奇数,所以最终得到的x和损失量相乘得到最终结果。 public double myPow(double x, int n) { double res = 1; for(int i = n;i != 0;i = i/2){ if(i%2!=0){ .

2022-01-24 14:48:02 4851

原创 48.旋转图像

一开始想到的是直接交换,但是发现不可行。会覆盖原有的值。如下 2就没有了 被覆盖了。应该是先上下反转,在对角交换。class Solution { public void rotate(int[][] matrix) { int n = matrix.length; for(int i = 0;i < n/2;i++){ for(int j = 0;j < n;j++){ int t = .

2022-01-22 18:30:26 545

原创 删除链表的倒数第N个节点(纪念第一次纯自己思考击败100)

思路很简单,就是将链表反转,定义一个头指针t,让t遍历到要删除的节点的上一个节点,修改下一个为下下个。假设我们要删除的是倒数第三个节点,如图:但是这样有一种情况解决不了,那就是删除最后一个节点,因为链表反转后,相当于第一个节点,他没有上一个节点。所以我们应该单独解决:node = node.next;代码奉上/** * Definition for singly-linked list. * public class ListNode { * int val; * Lis.

2022-01-21 20:18:26 198

原创 电话号码的字母组合(回溯算法)

这道题很明显要用回溯法。和之前我做过的回溯法不一样的点是:每次遍历的字符串是不同的,所以要传进去一个索引,遍历不同的字符串。class Solution { List res = new ArrayList<String>(); Map<Character,String> map = new HashMap<>(); public List<String> letterCombinations(String digits) .

2022-01-21 16:25:14 85

原创 CAS(乐观锁)以及ABA问题

独占锁是一种悲观锁,synchronized就是一种独占锁;它假设最坏的情况,并且只有在确保其它线程不会造成干扰的情况下执行,会导致其它所有需要锁的线程挂起直到持有锁的线程释放锁。所谓乐观锁就是每次不加锁,假设没有冲突而去完成某项操作;如果发生冲突了那就去重试,直到成功为止。CAS(Compare And Swap)是一种有名的无锁算法。CAS算法是乐观锁的一种实现。CAS有3个操作数,要操作的内存值V,旧的预期值A,要修改的新值B。当且仅当预期值A和内存值V相同时,将内存值V修改为B并返回true,否

2022-01-21 15:37:04 414

原创 volatile的定义与实现原理

Java语言规范第3版中对volatile的定义如下:Java编程语言允许线程访问共享变量,为了确保共享变量能被准确和一致地更新,线程应该确保通过排他锁单独获得这个变量。Java语言提供了volatile,在某些情况下比锁要更加方便。如果一个字段被声明成volatile,Java线程内存模型确保所有线程看到这个变量的值是一致的。有volatile变量修饰的共享变量进行写操作的时候会产生Lock前缀的指令,这条指令做了如下两件事:将当前处理器缓存行的数据写回到系统内存。这个写回内存的操作会使在其他CP

2022-01-21 14:38:02 91

原创 Shenandoah收集器和ZGC收集器

Shenandoah收集器与G1相比它的特点如下:支持并发的整理算法。不会有专门的新生代Region或者老年代Region的存在,没有实现分代,并不是说分代对Shenandoah没有价值,这更多是出于性价比的权衡,基于工作量上的考虑而将其放到优先级较低的位置上。在G1中耗费大量内存和计算资源去维护的记忆集,改用名为“连接矩阵”。(连接矩阵可以简单理解为一张二维表格,如果Region N有对象指向Region M,就在表格的N行M列中打上一个标记)。用到了读屏障,读屏障是为了防止内存中对象移动时

2022-01-20 15:08:22 570

原创 CMS垃圾收集器和G1垃圾收集器

CMSCMS(Concurrent Mark Sweep)收集器是一种以获取最短回收停顿时间为目标的老年代收集器。CMS收集器与之前的垃圾收集器最大的特点就是它可以并发清除垃圾。他的工作流程如下:初始标记(CMS initial mark)并发标记(CMS concurrent mark)重新标记(CMS remark)并发清除(CMS concurrent sweep)其中初始标记、重新标记这两个步骤仍然需要“Stop The World”。初始标记仅仅只是标记一下GCRoots能直接

2022-01-20 14:23:16 6238

原创 静态分派和动态分派

简介众所周知,Java是一门面向对象的程序语言,因为Java具备面向对象的3个基本特征:继承、封装和多态。本节讲解的分派调用过程将会揭示多态性特征的一些最基本的体现,如“**重载”和“重写”**在Java虚拟机之中是如何实现的,这里的实现当然不是语法上该如何写,我们关心的依然是虚拟机如何确定正确的目标方法。静态分派首先我们看一段代码:/** * 方法静态分派演示 */ public class StaticDispatch { static abstrac

2022-01-19 21:44:30 497

原创 关于字符串常量池,intern方法的理解

首先确定一点无论是jdk1.6还是1.7String c = "ab";这种字面赋值都是直接在字符串常量池生成一个字符串对象的。 String a = new String("a"); String b = "a"; System.out.println(a == b);输出的是false。这说明在用new生成字符串对象的时候,只会在堆中生成字符串对象。而不会在字符串常量池生成对象,也没有引用。明确:1、在jdk1.6中,intern()方法是先查找字符串常量池是否含..

2022-01-18 13:33:41 124

原创 hashMap源码解读之Java jdk1.8

在阅读文章之前大家可以看看我对于hashMap源码解读之Java jdk1.7与1.7的区别最重要的一点是底层结构不一样,1.7是数组+链表,1.8则是数组+链表/红黑树结构;put方法中,1.7采用的是头插法,而1.8采用的是尾插法。首次put时(即hash表为空):1.7会对hash表进行初始化:将实际容量向上取整为2的幂次。将负载赋值为实际容量 * 负载因子;而1.8会直接对hash表进行扩容,设置好实际容量和负载,而负载因子是在构造时就设置好了。默认的无参构造。1.7会让实际容量为16

2022-01-17 21:07:22 295

原创 transfer方法详解

ransfer方法的作用是把原table的Node放到新的table中,使用的是头插法,也就是说,新table中链表的顺序和旧列表中是相反的,在HashMap线程不安全的情况下,这种头插法可能会导致环状节点。其中的while循环描述了头插法的过程,这个逻辑有点绕,下面举个例子来解析一下这段代码。假设原有table记录的某个链表,比如table[1]=3,链表为3–>5–>7,那么处理流程为: /** * Transfers all entries from current

2022-01-17 16:06:55 2054 1

原创 hashMap源码解读之Java jdk1.7

核心参数hashmap其内部有threhold:实际的负载量,超过了这个值,就会扩容。loadFactor:扩容因子。真实容量(capacity) * loadFactor = threholdEntry<K,V>[] 这是个Entry<K,V>的数组,代表了整个hash表,其中每一个Entry<K,V>代表一个桶,他是一个链表。正因如此,即使发生了哈希冲突,也可以放在同一个桶中。modCount我们知道HashMap不是线程安全的 , 也就是说你在

2022-01-17 12:55:28 639

原创 组合总和 II (回溯算法)

这题和39.组合总和题的最大区别就是他题中给的元素有重复的,我们要去重。都知道组合问题可以抽象为树形结构,那么“使用过”在这个树形结构上是有两个维度的,一个维度是同一树枝上使用过,一个维度是同一树层上使用过。没有理解这两个层面上的“使用过” 是造成大家没有彻底理解去重的根本原因。那么问题来了,我们是要同一树层上使用过,还是同一树枝上使用过呢?回看一下题目,元素在同一个组合内是可以重复的,怎么重复都没事,但两个组合不能相同。所以我们要去重的是同一树层上的“使用过”,同一树枝上的都是一个组合里的元素,.

2022-01-16 19:36:09 177

原创 java用链表写栈

如果栈用尾插法,那么先进后出的问题不好解决。所以采用头插法package link;import java.util.HashMap;import java.util.Map;public class LinkStack { int size = 0; LinkNode front;//队头指针,指向队头节点 public boolean isEmpty() { return size == 0 ? true : false; } pub

2022-01-16 19:34:16 101

原创 java用链表写队列

没什么难点 留个纪念注意这是尾插法package link;public class LinkQueue { int size = 0; LinkNode front;//队头指针,指向队头节点 LinkNode rail;//队尾指针,指向队尾节点 public boolean isEmpty() { return size == 0 ? true : false; } public boolean add(int x){

2022-01-16 19:33:27 81

空空如也

空空如也

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

TA关注的人

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