自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 java实现pdf文件添加水印,下载到浏览器

添加itextpdf依赖

2023-11-01 16:21:07 1010

原创 java中lambda表达式报错原因分析:Variable used in lambda expression should be final or effectively final

第四个问题:对于一个对象,和上面的基本数据类型差不多,多的一点就是我们可以改变对象内部的属性不会报错,如下面的list1。第一个问题:在problem1中定义的num1和num2,num1修改了一次,在lambda中num1报错。第二个问题:在problem2中定义的num1和num2,num1在内部修改,在lambda中num1报错。因为局部变量在lambda表达式中默认被定义为final(静态)的,也就是说,在Test01类里面写了一个方法,参数为我定义的接口,准备使用lambda表达式展示我的问题。

2023-10-13 14:26:19 1790 1

原创 Redis作为缓存,mysql的数据如何与redis进行同步?

允许延时一致的业务,采用异步通知使用MQ中间中间件,更新数据之后,通知缓存删除利用canal中间件,不需要修改业务代码,伪装为mysql的一个从节点,canal通过读取binlog数据更新缓存强一致性的,采用Redisson提供的读写锁共享锁:读锁readLock,加锁之后,其他线程可以共享读操作排他锁存强一致性的,采用Redisson提供的读写锁共享锁:读锁readLock,加锁之后,其他线程可以共享读操作排他锁独占锁writeLock也叫,加锁之后,阻塞其他线程读写操作。

2023-10-04 21:33:43 2113

原创 leetcode233. 数字 1 的个数

可以发现,m < 0 时,m - 100 + 1 200 时,m - 100 + 1 > 100我们要得到100,所以剩下的这部分,百位上为1的个数为: min(max(m - 100 + 1, 0), 100)以上两部分加起来,就是百位上1的总数:(n / 1000)*100 + min(max(m - 100 + 1, 0), 100)k不要化简为 (n/10),因为(1234567%1000)*100=123400 而1234567/10=123456。

2023-08-12 14:55:07 155

原创 mongodb基本常用命令

linux启动。

2023-08-12 09:30:38 591

原创 synchronized中的锁

以32位虚拟机为例普通对象的对象头包括下面两个部分数组对象的对象头包括下面三个部分其中Mark Word 结构为。

2023-08-09 11:20:18 54

原创 基于SpringBoot实现复杂邮件信息发送

3.找到POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务,点击开启服务。8.启动测试,浏览器输入http://localhost:8080/send1。7.编写controller,这里代码比较简单,我没有分层。4.发送验证码验证一下,复制验证码。1.进入qq邮箱,点击设置。5.进入idea,引入依赖。

2023-08-08 10:23:31 89

原创 JVM之逃逸分析

如何将堆上的对象分配到栈,需要使用逃逸分析手段。这是一种可以有效减少Java程序中同步负载和内存堆分配压力的跨函数全局数据流分析算法。通过逃逸分析,Java Hotspot编译器能够分析出一个新的对象的引用的使用范围从而决定是否要将这个对象分配到堆上。逃逸分析的基本行为就是分析对象动态作用域:当一个对象在方法中被定义后,对象只在方法内部使用,则认为没有发生逃逸。当一个对象在方法中被定义后,它被外部方法所引用,则认为发生逃逸。例如作为调用参数传递到其他地方中。

2023-08-05 10:59:06 43

原创 动态代理(jdk/cglib)

那这样做最大的好处呢就是我们可以在代理类调用目标类之前和之后去添加一些预处理和后处理的操作,来扩展一些不属于目标类的功能。那比如如果我们使用JDK动态代理,只需要我们的代理来去实现invocation handler然后实现它的invoke方法就可以去代理任何你想控制访问类,而不是具体的某个类。JDK动态代理和CGLIB动态代理是Java中两种常见的实现动态代理的方式,它们之间有一些区别。所谓静态代理,就是在程序运行之前,我们就给目标类编写了其代理类的代码然后编译其代理类。,通过代理类调用目标类完成。

2023-07-18 21:54:44 81

原创 UDP和TCP对比

因此,对于UDP用户数据报出现的误码和丢失等问题,UDP并不关心,基于UDP这个特点,UDP适用于实时应用,如IP电话、视频会议等。接收万的应用进程必须有能力识别收到的字节流,把它还原成有意义的应用层数据,也就是说,也就是说UDP对应用进程交付下来的报文,既不合并也不拆分,而是保留这些报文的边界。最后,我们再来对比一下UDP用户数据报的首部与TCP报文段的首部。换句话说,UDP是面向应用报文的,如图(应用层下面的层省略)因此,UDP是无连接的,TCP是面向连接的。同时,UDP支持单播,多播和广播。

2023-07-17 20:55:40 50

原创 JVM性能监控与调优常用命令

生成线程快照的作用:可用于定位线程出现长时间停顿的原因,如线程间死锁、死循环、请求外部资源导致的长时间等待等问题。这些都是导致线程长时间停顿的常见原因。jmap (JVM Memory Map): 作用一方面是获取dump文件(堆转储快照文件,二进制文件),它还可以获取目标Java进程的内存相关信息,包括Java堆各区域的使用情况、堆中对象的统计信息、类加载信息等。官方帮助文档:https://docs.oracle.com/en/java/javase/11/tools/jmap.html。

2023-07-08 22:14:50 84

原创 jvm之垃圾回收

垃圾收集机制是Java的招牌能力,极大地提高了开发效率。这当然也是面试的热点。那么,Java常见的垃圾收集器有哪些?串行回收器: Serial(young)、 Serial Old(Old)并行回收器: ParNew(young)、 Parallel Scavenge(young)、 Parallel Old(Old)并发回收器: CMS(Old)、 G1(young and Old)垃圾收集器发展史。

2023-07-01 18:12:14 58

原创 JVM中的String

String:字符串,使用一对""引起来表示。String声明为final的,不可被继承String实现了Serializable接口:表示字符串是支持序列化的。实现了Comparable接口:表示String 可以比较大小String在jdk8及以前内部定义了final char[] value用于存储字符串数据。jdk9时改为byte[]String:代表不可变的字符序列。简称:不可变性。通过字面量的方式(区别于new)给一个字符串赋值,此时的字符串值声 明在字符串常量池中。

2023-06-23 20:41:29 79

原创 jvm基本结构介绍

类加载子系统作业类加载器子系统负责从文件系统或看网络中加载class文件,class文件在文件开头有特定的文件标识。ClassLoader只负责class文件的加载,至于它是否可以运行,则由Execution Engine决定。加载的类信息存放于一块称为方法区的内存空间。

2023-06-21 16:37:10 481

原创 Leetcode:354. 俄罗斯套娃信封问题(java最长递增子序列LIS)

可能有点难理解,举例说明:如对于[1,3,2,4,5,6],d[4] > d[2],4>2是必然,如果说d[2] > d[4],4>2(其实和前面一样,总不能2>4吧),这里d[4]=4(前面也解释过了),d[4]对应的数组为[1,2,4,5]或者[1,3,4,5],可以看到,这个数组的递增的,那么我们把他减去2,和d[2]长度一样。d[2]=2对应的数组又为[1,2],不管怎么样,d[2]是最小值,x就不一定了,就肯定是d[4] > x >= d[2],4>2,证明完成。就可以得到结果了dp了。

2023-06-12 22:34:05 121

原创 Leetcode:347. 前 K 个高频元素(java)

我这里使用的是基于快速排序的思想,假设我们有数组[2,2,2,1,1,1,1,3,3,4],将其转换为,键为数,值为出现的次数,map[{2,3},{1,4},{3,2},{4,1}],在将每个键值对放入list<int[]>,list每个元素为[key,value],为list[{2,3},{1,4},{3,2},{4,1}]。1.如果前面的大于基准的数的个数大于k个,那么前k个频率最高的数,就在前面,我们将范围缩小,从开始位置到基准位置-1,继续下一轮快排。,请你返回其中出现频率前。

2023-06-08 13:56:47 284

原创 leetcode:220. 存在重复元素 III(困难题)(桶排序,java版)

【代码】leetcode:220. 存在重复元素 III(困难题)(桶排序,java版)

2023-05-20 11:55:04 82

原创 Seata四种分布式事务解决方案

首先我们先来了解一下TC、TM、RMXA规范是x/Open组织定义的分布式事务处理( DTP,Distributed Transaction Processing)标准,XA规范描述了全局的TM与局部的RM之间的接口,几乎所有主流的数据库都对XA规范提供了支持。

2023-05-13 17:38:18 1723

原创 wiz文件打开方式(只要notepad++即可)

点击全部替换,就完成啦!但是会出现很多空行,这里我就只能把两行变成一行,查找为。但是这里还有一个问题,就是我们复制这些代码总是会带序号,就像这样。这样就每一行代码就只隔一行了,多的一行我也没办法了。对于这个ziw文件,直接打开肯定不行,会出现乱码。(如果把\r\n替换为空,就全部变成一行了)我们先把它该为zip文件,然后直接解压。我们直接使用浏览器打开就可以看了。选择下面的正则表达式,输入。里面就是一个html文件。

2023-05-08 10:47:53 668

原创 排序算法对比

相同数字相对顺序。

2023-05-05 15:57:24 29

原创 redis基础篇

redis学习,基础篇

2023-05-04 20:42:51 306

原创 Redis高级篇

redis学习,高级部分

2023-05-04 20:38:08 419

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

​ 缓存穿透是指客户端请求的数据在缓存中和数据库中都不存在,这样缓存永远不会生效,这些请求都会打到数据库。如果用户请求返回null,这时就会重新发起请求,如果有不怀好意的人发起大量数据库不存在的请求,那么就有可能将数据库弄垮,那么怎么解决这个问题呢?缓存空对象:请求的数据如果不存在,那么我就把请求返回的null,也存到redis里面。这时请求就有数据了,就是null。布隆过滤:就是客户端和redis之间加了一层布隆过滤器,如果数据不存在,直接拒绝,存在才放行。那布隆过滤器怎么知道数据是否存在呢?

2023-04-26 11:04:50 53

原创 Redis集群

我们需要执行命令来创建集群,在Redis5.0之前创建集群比较麻烦,5.0之后集群管理命令都集成到了redis-cli中。修改redis-6.2.4/redis.conf文件,将其中的持久化模式改为默认的RDB模式,AOF保持关闭状态。要在同一台虚拟机开启3个实例,必须准备三份不同的配置文件和目录,配置文件所在目录也就是工作目录。要在同一台虚拟机开启3个实例,必须准备三份不同的配置文件和目录,配置文件所在目录也就是工作目录。这里我们搭建一个三节点形成的Sentinel集群,来监管之前的Redis主从集群。

2023-04-11 12:11:20 56

原创 CentOS7部署RabbitMQ

我们在Centos7虚拟机中使用Docker来安装。

2023-04-11 12:02:01 242

原创 nacos集群搭建

官方给出的Nacos集群图:其中包含3个nacos节点,然后一个负载均衡器代理3个Nacos。这里负载均衡器可以使用nginx。

2023-04-11 12:00:54 110

原创 Centos7安装Docker/DockerCompose

Docker 分为 CE 和 EE 两大版本。CE 即社区版(免费,支持周期 7 个月),EE 即企业版,强调安全,付费使用,支持周期 24 个月。Docker CE 分为stabletest和nightly三个更新频道。官方网站上有各种环境下的,这里主要介绍 Docker CE 在 CentOS上的安装。

2023-04-11 11:55:48 533

原创 nacos部署(linux)

2.解压文件到指定目录。4.检查是否启动成功。

2023-04-08 21:31:19 103

原创 RocketMQ安装步骤(linux)

5.修改脚本中的JVM相关参数,修改文件如下。7.启动NameServer。9.使用命令查看是否开启成功。1.将压缩包上传服务器,把。2.使用解压命令进行解压到。3.软件文件名重命名。8.启动Broker。

2023-04-08 21:29:35 184

原创 Linux(CentOS 7)基本学习,详细配图

命令解析器(shell)、替我们运行、解析指令功能执行命令特殊符号运行脚本(代码)linux中的每个用户必须属于一个组,不能独立于组外。linux中每个文件有所有者、所在组、其它组的概念。ls -l 中显示的内容如下:drwx------. 16 jerry jerry 4096 8月 28 14:19 jerry0-9位说明第0位确定文件类型(d,-,l,c, b)l是链接,相当于windows的快捷方式d是目录,相当于windows的文件夹。

2023-04-04 21:50:03 7848 1

原创 常见邮箱服务器地址

常见邮箱服务器地址

2023-04-03 20:15:40 3916

原创 Sentinel配置说明

简单理解Sentinel的热点规则

2023-04-03 11:54:34 590

原创 git常用命令(简略)

git命令

2023-03-09 17:42:22 37

原创 测试堆空间常用的jvm参数:

常用的jvm参数

2023-03-07 09:25:44 27

原创 二叉树n0=n2+1的证明

我们知道n0,n1,n2为度为0,1,2的结点,那么结点总个数n=n0+n1+n2换一种角度思考,度为2的结点有两个子结点,度为1的有一个子结点,度为0的有0个子结点,那么我们把这些结点加起来,就是0*n0+1*n1+2*n2=n1+2*n2。但是由于我们计算的时候还少算一个根结点,所以最后结果就是n1+2*n2+1我们用这两个方法算出来的总结点个数,让他们划等号,n0+n1+n2=n1+2*n2+1约分之后就是n0=n2+1

2022-10-19 17:21:11 1914

原创 Linux目录结构(每个目录的作用)

Linux目录的一些基本用途

2022-09-20 11:39:45 123

原创 Linux(CentOS7)找回Root密码

Linux找回root密码,操作简单,实用

2022-08-28 16:00:06 1021

原创 26. 删除有序数组中的重复项

输入:nums = [1,1,2]输出:2, nums = [1,2,_]解释:函数应该返回新的长度 2 ,并且原数组 nums 的前两个元素被修改为 1, 2 。不需要考虑数组中超出新长度后面的元素。

2022-04-27 11:41:44 42

原创 leetcode:25.k个一组翻转链表(java版)

给你链表的头节点 head ,每k个节点一组进行翻转,请你返回修改后的链表。k 是一个正整数,它的值小于或等于链表的长度。如果节点总数不是k的整数倍,那么请将最后剩余的节点保持原有顺序。你不能只是单纯的改变节点内部的值,而是需要实际进行节点交换。来源 力扣(LeetCode)

2022-04-25 18:52:44 1451

原创 leetcode:24.两两交换链表中的节点

leetcode:两两交换链表中的节点,递归算法,简介明了

2022-04-22 21:23:56 200

空空如也

空空如也

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

TA关注的人

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