自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

第四空间

认真写好每一篇博客

  • 博客(89)
  • 收藏
  • 关注

原创 Java如何判断两个数组相等

相等是指两个数组的长度相同,且每个对应下标的元素都相等。自己写一个这种方法也不难,但JDK已经帮我们实现了:Arrays.equals()

2023-03-03 11:01:12 505 1

原创 如何阅读Spring的官方文档查找自己想看的主题

AOP属于Spring Core,我们点击查看,其他主题也类似。进入后查看目录,我们发现第4、5两章是关于AOP的,阅读即可。AOP属于Spring Framework,选择该工程。进入后查看所有工程,或者直接选择你需要的工程。然后选择Spring版本,点击对应的文档链接。以查看AOP相关文档为例子。

2022-08-22 16:47:32 444

原创 等待synchronized锁时响应interrupted中断吗?

处于阻塞状态时线程不会响应中断,当等待到锁从阻塞状态恢复到runnable状态时线程的中断标志位还处于中断状态,这时如果有对标志位的判断是可以判断出处于中断状态的。

2022-08-14 16:47:41 353

原创 Java线程池的知识

在Java中表示线程池的类为ThreadPoolExecutor。定义时最多需要设置7个参数。1.核心线程数,当线程池最少维护的线程个数2.最大线程数,当提交任务时所有核心线程都在工作,切阻塞队列已经满了,则继续创建线程,这个参数定义了创建线程数的上限3和4 线程活跃时间,当线程超过该时间空闲时销毁线程,当然要保留核心线程数个线程5 阻塞队列,任务提交时,当无空闲线程且线程个数到达最大线程数,则先将任务保存到该队列中。...............

2022-08-07 12:13:12 654

原创 【算法题解】17.电话号码的字母组合

回溯算法使用StringBuilder进行字符串的拼接,可以生成更少的String对象,执行速度更快。回溯执行的主体是取当前遍历到的数字对应的字符集合,依次加到当前已经拼接的字符串尾部,然后进行回溯。然后删除添加的当前字符,进行下一次回溯。当回溯到最后时,没有新的数字,这时将拼接好的字符串加到结果集中即可。在中间dfs的过程中巧妙利用了StringBuilder,只需要一个对象即可。使用其deleteCharAt()方法删除尾部字符,这个方法很关键,如果不知道这个方法,不太容易利用。...

2022-07-17 11:21:54 88

原创 MySQL之多版本并发控制MVCC

mvcc中文名称为多版本并发控制,用于实现读提交和可重复读隔离级别。多版本是指在对数据进行修改时,会通过undo日志记录数据行的多个版本。通过建立一致性视图,实现事务间的修改不相互影响。一致性视图,记录了当前正在执行的所有事务id。对于可重复读隔离级别,在事务执行过程中读取到的数据是一致的。读取一行数据时,实际会去判断当前数据的事务编号。如果事务id大于当前视图的高水位,说明这是一个未来的事务修改的数据,不能读取。这时就会往前追溯,找到一个undo日志版本号小于当前视图的低水位,或则位于高低水位之间但不在视

2022-06-06 23:35:49 99

原创 MySQL之事务的特性、隔离级别和隔离级别解决的问题

事务有A、C、I、D四大特性,分别是A原子性、C一致性、I隔离性、D持久性。A原子性:事务的执行过程做为一个整体,要么所有语句执行成功,要么都没有执行。C一致性:事务执行前后,数据保持一致性的状态。比如银行转账时,从A账户减少100元,给B账户增加100元。事务执行后,两个账户的资金总额是不变的。一致性靠原子性、隔离性、持久性三个特性来保证,是一个结果。I隔离性:事务的执行是相互隔离的,互不影响。共有4种隔离级别:读未提交,读已提交,可重复读和串行化。D持久性:事务对数据的修改是持久的。在读未提交隔离级别下

2022-06-05 16:34:40 312

原创 MySQL之索引为什么使用B+树而不是跳表实现?

B+数是平衡的多路查找树。他的特点是一个结点上可以存储多个元素,带来了扇出较高的优点。只需要很少的层数就可以存储大量的数据。和B树相比,它在叶子结点上存储所有的数据。跳表也是分层的。每一层都是一个链表。除了最下面的一层,每个元素除了有指向下一个元素的指针,还有一个指针指向下一层中和自己相同的元素。上一层的链表做为索引加快对下层链表元素的查找。每一层元素都是顺序排列的。当插入一个元素时,使用随机函数决定其是否在每一层插入。在最底层插入的概率是100%,在倒数第二层是50%,依次类推。这样在从最上层往下查询时就

2022-06-05 16:06:27 650 2

原创 【算法题解】搜索二维矩阵

给定一个m*n的矩阵,矩阵中每一行的元素从左往右依次递增,每一行的第一个元素都比上一行的最后一个元素大。给出一个目标值,编写一个高效的算法判断该目标值是否在矩阵中存在。根据题意可以分析出,没一行递增,每一列也递增。《剑指Offer》上有一道题给出的就是这样的矩阵,用那里的方法可以解决。就是从右上角或者左下角开始判断。每次可以排除一行或者一列。时间复杂度为O(m+n)。这道题里的矩阵其实比《剑指Offer》上的那道,还多了一些条件。就是这里除了行列递增外,每一行整体都比上一行大。也就是按行从左到右,一行行也

2022-06-04 19:29:32 235

原创 【算法题解】矩阵置零

给定一个 m x n 的矩阵,如果一个元素为 0 ,则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。这个题目并不复杂,只需要遍历一遍数组找出为0的元素,并记录其所在的行、列。最后把这些行、列全部置为零即可。所以可以使用两个数组来分别记录行列是否存在为0的情况。时间复杂度O(m*n),空间复杂度O(m+n)。具体代码如下:但是题目要求使用原地算法,原地算法的意思是不使用额外空间。那么我们可以使用第一行、第一列进行记录,为0表示对应行或列存在为0的元素,当第一行、列本身元素就是0时也可以兼容。同时

2022-06-04 12:51:59 352

原创 分布式之雪花算法

雪花算法用来在分布式集群中生成唯一ID。即在需要在多台机器需要分别生成ID,又要保证生成的ID是唯一的、趋势递增的情况下使用的一种算法。雪花算法生成一个64位的ID,最高位固定为0,之后41位为时间戳,在之后的10位为机器编号,最后的12位为序号。41位的时间戳即2^41毫秒,换算一下是69年。时间戳原本也是一个64位的数字,这里取了其低41位。从当前时间开始,到低41位开始出现重复需要69年。这就是为什么说雪花算法最多可以使用69年的原因。机器编号为10位,2^10=1024,所以雪花算法最多支持1024

2022-06-03 00:40:34 2224 2

原创 Redis之缓存击穿、缓存穿透和缓存雪崩

缓存击穿是指热点key失效之后,所有请求都访问到数据库,对数据库造成较大压力。解决方案:1.加锁,获取到锁的线程去更新缓存;如果是集群部署,则需要使用分布式锁。问题:没获取到锁的其他线程走什么逻辑呢?如果是等待获取锁,那么同一时刻所有线程串行获取锁,后获取到锁的线程等待时间较长。如果直接返回获取不到,要根据具体情况考虑是否能够接受。2.热点key缓存设置永不失效,更新采用异步更新的方式。具体实现可以是启动一个单独线程去定时判断缓存是否失效,失效时进行缓存更新。 存在更新不及时的情况,不能保证缓存和数据库

2022-06-01 15:51:19 255

原创 Spring之AOP

AOP意思是面向切面的编程。提供一种方式可以在现有代码前后增加一些统一的逻辑。比如监控、打印日志等。使用动态代理技术实现。有两种实现方式,一个是JDK Proxy,另一个是CgLib。JDK Proxy要求被代理的对象实现一个接口,通过动态代理动态生成该接口的一个实现类。在实际使用时,需要定义一个中间类实现InvocationHandler接口定义代理类要执行的操作。CgLib不要求被代理类实现接口,它是一个第三方类库,通过生成一个被代理对象的子类来进行动态代理。两者在使用上都需要定义一个中间类来指定

2022-06-01 15:01:44 67

原创 【算法题解】颠倒二进制位

题目颠倒给定的 32 位无符号整数的二进制位。分析依次判断每一位数字是0还是1,再设置到结果的对应位置上。一个技巧是为0时不用专门设置,因为本来就是0。所以只需要设置为1的情况。另外和1<<i相与判断第i位是否为1时,需要判断是否不等于0。而不是大于0,因为也有可能是负数。public class Solution { // you need treat n as an unsigned value public int reverseBits(int n) {

2022-03-11 15:05:33 148

原创 【算法题解】Excel表列序号、Excel表列名称

题目Excel中的列名,和其序号有如下关系:A-1B-2……Z-26AA-27AB-28题目1:现给定一个列名求其序号题目2:给定一个序号,求其对应的列名分析题目2直接处理不容易考虑清楚,先完成题目1,再进行倒推比较容易。题目1解法。A- Z对应1-26。如果在高位则乘以26。代码如下:class Solution { public int titleToNumber(String columnTitle) { int num = 0; f

2022-03-10 11:25:23 625

原创 【算法题解】二叉树的最小深度

题目求二叉树的最小深度:从根节点到叶子节点的路径上分析DFS,当判断到达叶子节点时记录depth,并进行最小比较。这么做了之后发现效率较低,只击败10%的提交。思考之后发现可以进行剪枝。当当前depth大于等于min时就不需要再遍历了,因为肯定找不出更短的了。代码class Solution { public int minDepth(TreeNode root) { int[] min = {0}; dfs(root, min, 0);

2022-03-10 11:11:09 173

原创 Java并发之synchronized锁优化

1.锁升级JDK1.6之前 synchronized性能较差,被称作重量级锁,利于操作系统中的管程实现。加解锁需要进行内核空间和用户空间的切换,性能消耗较多。在JDK1.6中对synchronized进行了优化,加入了偏向锁、轻量级锁、自旋锁、重量级锁,从而使用不同程度的锁竞争。在竞争程度最低的情况下,只有一个线程返回获取锁。这样就会进入偏向锁状态。这时对象头中一个专门的偏向锁标志位就会设置为1,线程ID也会记录下来。当下次再需要获取锁时,判断线程ID和自己相同,就可以直接进入临界区了。在偏向锁状态下

2022-03-02 11:32:48 426

原创 Java并发之CountDownLatch、CyclicBarrier和Semaphore

2022-02-28 20:49:17 156

原创 一些刷题时常用但平时写的不多的Java语法总结(持续更新)

1.StringBuilder删除最后一个字符StringBuilder sb = new StringBuilder();sb.append("abc");sb.deleteCharAt(sb.length() - 1);在一些涉及字符串构造的回溯算法中,需要把上一步添加的字符给删除掉。使用deleteCharAt方法可以做到。这个方法平时用的很少,特此记录。另外获取StringBuilder可以使用length()方法。2.栈、队列的使用不管是栈还是队列,都是用LinkedList实现。与

2022-02-27 11:37:55 401

原创 一次OOM排查的详细经过

1.问题定位预发环境机器出现访问502的问题。登录机器查看日志,没有发现特别的日志。考虑到QA刚刚在做压测,想到是不是出现了OOM问题。搜索错误日志:cat error.log | grep "OutOf" 果然有OOM错误日志:java.lang.OutOfMemoryError: GC overhead limit exceededjava.lang.OutOfMemoryError: GC overhead limit exceeded锁定是出现OOM问题。2.查看PID使用命

2022-01-16 22:26:04 597

原创 修改配色 Mac电脑默认命令行工具(终端\terminal) MacBook Pro MacBook

解决问题:1.修改整体配色为黑底白字2.不同类型文件显示不同颜色。效果如下:1.修改为“黑底白字”打开终端屏幕左上角:终端-偏好设置-描述文件选择Pro2.配置文件颜色编辑~/.zshrc 文件vim ~/.zshrc 在~/.zshrc 文件末尾加上下面的内容:#enables colorin the terminal bash shell exportexport CLICOLOR=1#sets up thecolor scheme for list export

2021-12-18 13:05:07 1275

原创 QPS和并发数和平均耗时的关系以及压测思路

QPS是每秒钟到达的请求数并发数是一个时刻能系统中有多少在处理中的请求。并发数=QPS * 请求平均处理时间。比如,每秒钟请求100次。每个请求处理2秒。那么每个时刻都有200个请求在处理,并发数为200。系统实时并发数低,并不代表系统的处理能力差。相反,在系统处理较快时,没有请求积压,并发数接近于0。QPS和并发数的关系...

2021-11-11 11:21:19 6900

原创 JVM相关参数、命令等

-Xmx 堆最大值,例子:-Xmx1g. -Xmx512m-Xms 堆最小值,例子:-Xmx1g. -Xs512m

2021-11-08 20:21:28 94

原创 Redis scan命令

scan 0 match name:*0是开始扫描的游标match是固定语法name:* 是key名通配符,表示以name:开头的key。返回值中包含下一次继续扫描的游标。

2021-09-08 11:32:40 335

原创 Linux下终止进程

kill -15 PID. //给进程发送一个结束运行的信号,友好分手kill -9 PID。 //强行结束进程,直接拉黑。先使用kill -15,尽量友好分手。实在不行再拉黑。

2021-09-08 10:54:35 72

原创 Maven原始setting.xml文件备份

<?xml version="1.0" encoding="UTF-8"?><!--Licensed to the Apache Software Foundation (ASF) under oneor more contributor license agreements. See the NOTICE filedistributed with this work for additional informationregarding copyright ownershi

2021-04-09 20:24:07 227

原创 Java简洁代码实现快排

Java实现快排排序。一种较好理解的方式。代码也比较简洁。

2021-03-26 20:41:56 340

原创 取余数余数分配率等

取余数余数分配率等

2021-03-21 12:22:10 567

原创 优先级队列的使用

优先级队列的使用

2021-03-21 12:15:40 80

原创 Java:给二维数组中的一维数组排序

需要是这样的:假设有个二维数组:int[][] arr = {{1,2},{3,4},{5,6}};需要给按一定规则调整,其中一维数组的顺序,比如规则为按一维数组的首元素从小到大排。数组排序可以使用Arrays.sort(),自定义规则的话需要自己定义Comparator即可。但是对于二维数组也可以使用Arrays.sort()吗?答案是肯定的,二维数组作为一个Object传入。Comparator中的为int[]。写法如下:Arrays.sort(arr,new Comparator<

2021-03-19 22:47:27 889

原创 String和char数组相互转换

介绍如何将String转换为char数组,或将char数组转换为String

2021-03-19 16:48:28 12059

原创 算法题分类整理

分类整理算法题目,方便成体系地复习。

2021-03-19 16:07:43 128

原创 MacOS操作总结

公司新给配发了MacBook Pro,一些操作记录下。

2021-03-19 14:26:16 93

原创 Linux安装Redis步骤

Linux下安装redis的详细教程,详细列出每个命令。

2021-03-18 20:22:43 91

原创 Linux常见命令总结

1.安装Javasudo apt update #更新包索引apt install default-jdk #安装默认的JDK2.安装MySQLsudo apt-get install mysql-server

2021-03-18 20:01:21 110

原创 Redis分片集群下数据结构使用不当造成的分流不均问题分析

一.问题描述项目中使用了一个Redis分片集群,一共设置了5个分片。在观察其监控信息时发现5个分片的访问量极其不均匀。85%的调用量都集中在分片1上,13%的调用量集中在分片2上,1%的调用量集中在分片3上。另外两个分片的调用量都不到整体的1%。二.问题分析:看到这个现象感觉非常奇怪,设置分片的目的是为了将流量均匀地分布到多台机器上以减轻单台机器的压力,提高性能。目前的情况是大部分流量都集中在一台机器上了,不符合分片集群设置的初衷。通过排查项目对此Redis集群的使用,发现主要有3处读写Red

2021-03-14 15:39:06 1400

原创 前端开发知识总结

Node.js & npm安装官网下载安装包。安装过程注意选中add to path,以便在CMD下执行命令。安装node.js时会附带安装npm。安装后使用以下命令进行验证node -vnpm -v

2021-03-10 16:04:31 61

原创 MySQL知识总结

学习和使用MySQL的过程中遇到的问题,执行过的命令,安装过程等等所有涉及的问题都在这里记录一下。

2021-03-10 15:14:04 145

原创 Redis入门知识总结

Redis常用命令;Redis实现分布式锁;Redis中的布隆过滤器;Redis持久化RDB、AOF;

2021-02-27 18:44:25 234

原创 Docker是什么?

1.虚拟化和容器虚拟化:将计算机资源进行抽象、转换为虚拟的计算机资源供给程序使用。容器技术:将应用程序隔离在一个单独的环境中进行运行,不受其它程序的影响。好处是程序之间相互隔离、提高计算机资源的使用率。如果程序都直接运行在物理机上,会出现端口冲突、依赖库版本冲突、进程数限制冲突等问题。容器技术比一般的虚拟机运行效率高,因为容器中的程序是直接运行在物理机上的,没有经过程序的指令转换。其它虚拟机如JVM,执行的中间字节码。而容器没有这个限制,所以在容器中执行的程序其效率和直接在物理机上执行相差无几。但

2021-02-27 12:17:54 2069 3

空空如也

空空如也

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

TA关注的人

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