自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 java代码通过ssh上传文件到远程服务器并解压

【代码】java代码通过ssh上传文件到远程服务器并解压。

2024-04-18 12:26:46 197

原创 jvm常用监控指标(记笔记)

最近项目里面要做组件监控,于是整理了一下jvm常用的监控指标记录下来,废话不多讲,直接上代码。

2024-04-12 08:40:27 116

原创 玩转Random的正确姿势

我们知道,在数学领域里面0到1之间的小数是无穷无尽的,所以如果从数学角度上来讲,要计算0到1之间某个小数出现的概率是不现实的,但是作为计算机领域的人员应该会注意到,大多数编程语言中随机数的出现是等概率的,为什么会这样呢,因为在计算机里面,是有精度限制的,所以能表示的小数范围是有限的,而不是无穷无尽的,那么各个语言在设计的时候,通过一定的设计就可以实现等概率返回某个小数,下面以java语言为例在 Java 中,

2024-03-08 17:37:00 771

原创 BIO、NIO、Netty演化总结之三(为什么netty可以支撑单机百万连接)

1、随着连接数量的增加selector.selectedKeys()返回的就绪事件可能会有很多,就会导致要循环遍历所有的事件很耗时,在遍历期间,如果有其他的连接进来的话,selector.select()无法得到及时执行,导致客户端无法连接,以及其他的socketChannel无法及时读取。2、随着连接数量的增加,开启的线程数量会越来越多,对于操作系统来说,线程是一种很宝贵的资源,再好的机器配置,能支撑的线程数量肯定也是有上限的。首先,我们先看一个问题,为什么BIO无法支撑器单机百万连接?

2024-02-20 11:06:39 682

原创 BIO、NIO、Netty演化总结之二(手撸一个极简版netty)

,里面给了一个示例AsyncNonBlockingServerWithThreadPool,最近想了想,发现这个代码跟netty的模型还是有一些出入,说是netty的雏形好像有点牵强,于是想了一下,还是决定写一个更接近netty的极简版代码,仅供交流,有不对的地方欢迎指正,不喜勿喷,直接上代码。2、每一个连接的客户端在绑定workergroup的时候实际上就是绑定了一个selector,这样每一个workergroup所负责管理的客户端连接的socket之间也相互不影响。

2024-02-18 13:49:22 621

原创 BIO、NIO、Netty演化总结

1、采用reactor模型,所有的操作均采用事件通知机制来实现(包括连接和读写数据,基于jdk的future之上做了封装,运用观察者模式和装饰器模式,避免future.get带来的程序阻塞)其中bossGroup就是mainreactor,也就是负责接收客户端的连接的,workerGroup就是subreactor,也就是专门负责读写数据的。4、一个EventLoop(可以理解为其实就是一个线程),可以绑定多个socketchannel,也就是一个线程可以同时处理多个连接的数据的读写。

2024-02-12 11:46:24 1398

原创 导致Runtime.getRuntime().addShutdownHook无法执行的场景

PS:搜索了一下windows中的结束任务和linux中kill -9的区别,14个AI大模型的回答都是一致的:linux中的kill -9比windows任务管理器中的结束任务要更凶更猛,虽然没有在linux系统去实验,但是根据这个结论,如果在linux系统使用kill -9命令来杀死jvm,那么钩子函数就不会执行了。2、在oom之后注册钩子函数:-Xmx10000k,无法执行。1、在OOM之前注册钩子函数:-Xmx10000k,正常执行。4、任务管理器结束运行:没能执行。

2024-01-31 15:56:08 319

原创 通过Builder来构建集合list和map

之前已经写过一篇通用Builder来构建示例对象的(

2024-01-26 13:25:52 623

原创 归并排序-逆序对

逆序对:给定一个数据,从左往右,从第一个数开始,它右边每一个比它小的都能和它组成一个逆序对,比如{3, 4, 1, 2},对于3来说右边比它小的只有1,2,对于4来说,比它小的也只有1,2,对于1和2来说右边没有比它们自己小的,所以最终的逆序对是4,而{3, 4, 2,1}的逆序对则是5,因为2的右边有一个1比它小。之前的文章里有写归并排序的最小和问题(

2024-01-25 16:47:57 439

原创 比较同一个Class不同的实例对象是否变更

【代码】比较同一个Class不同的Bean示例是否变更。

2024-01-25 14:36:46 392

原创 @EnableFeignClients原理剖析

其中最重要的一行:BeanDefinitionBuilder definition = BeanDefinitionBuilder .genericBeanDefinition(FeignClientFactoryBean.class);今天闲来无事,临时突然想看看@EnableFeignClients的实现原理,现就个人的理解,整理一下记录下来,有不对的欢迎指正,共同进步,不喜勿喷!

2023-12-29 14:01:38 963

原创 jdbc获取mysql数据表的字段和对应的数据类型

第三种:从information_schema库去查:SELECT COLUMN_name,data_type FROM information_schema.columns where table_name='int_test_1';这种方式我在本地跑的好好的,但是到了测试环境和预生产环境会导致columns 的数据量翻倍,没找到原因。但是这种查出来的顺序与建表语句不一样,所以就没有用这种了,最终采用的是第二种方式。1、获取数据表的元数据,也就是字段名和对应的数据类型。2、查询一个样例数据(目标数据)

2023-12-21 15:45:02 282

原创 归并排序-最小和

首先澄清一下最小和的概念:给定一个数组,对于数组中的每个元素,把它前面所有比它小的元素全部加起来生成一个小和,然后把每个元素对应的小和全部加起来生成整个数组的一个小和,比如给定数组{3, 2, 2, 4, 1, 5},每个元素对应的小和是{0,0,0,7,0,12},整个数组的小和就是19。{2,2,3,4}和{1,5}合并为{1,2,2,3,4,5},局部累加和为2*1+2*1+3*1+4*1=11,因为左边的数组都比右边的数组中的5要小。2,4合并为{2,4},局部累加和是2*1,因为左边比右边小。

2023-12-15 16:08:30 104

原创 mysql中的int(1)和int(10)的区别

由此可见:int(1)和int(10)实际上没什么区别,不影响查询和计算结果,也就是说底层在存储的时候实际上还是4个字节,范围是负21亿多到正21多。2、如果在括号里面写了数值,并且建表语句用了zerofill,也没有什么影响,只是不同的客户端在处理的时候显示不一样,仅此而已。1、对于int类型括号里面的数字没有实际意义,在底层存储的时候占用的还是4个字节,特别要注意的是。再看第二个测试表:注意建表语句中多了ZEROFILL,翻译过来是0填充的意思。这个数字并不表示长度。

2023-12-15 13:44:48 274

原创 计算n的阶乘-递归与迭代之间的转换

尽管大多数情况下递归与迭代可以相互转换,但也有一些特殊情况,比如涉及到特定数据结构(如树、图)的问题,或者一些复杂的动态规划问题,它们可能更适合于使用其中的一种方法,因为另一种方法可能会导致代码变得过于复杂且难以理解。:对于递归来说,需要存在一个或多个基本的情况,在这些情况下,不需要进一步递归。总结:某些递归是可以通过迭代来实现的,那么递归和迭代能够相互转换的条件是什么呢,我们来看看不同的AI模型的回答。例如,3的阶乘表示为3!:无论是递归还是迭代,都需要一种方式将子问题的结果合并到整个问题的答案中。

2023-12-07 17:37:18 627

原创 归并排序的非递归实现

第一种思路:用步长来切分数组,也就是我们在切分数组的时候,每个子数组里面的数据个数要等于步长,假设给定数组:[3,2,5,4],我们初始给定一个步长step=1,那么第一轮切分出来的子数组分别是[3],[2]合并得到[2,3],[5],[4]合并得到[4,5],这样第一轮步长等于1就完成了,第二轮步长等与原步长乘以2,也就是每一轮都将原步长乘以2,这样得到的子数组分别是[2,3]和[4,5],进行合并,依次类推。

2023-12-07 10:28:03 53

原创 身份证mod11-2校验规则

这几天碰到一个需求是实现身份证最后一位的校验,需求文档里面写了个公式,没看懂(数学早就还给老师了),于是各种查资料,发现网上的资料要么只给了说明,要么给了个固定的代码,但是写的不清不楚的,没有说明为什么要这么写,现在我就自己这几天搜集到的资料做一个简单的总结。最后我们准备一个数组存的是身份证号最后一位数字:static char[] checkCodes = {'1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2'};

2023-11-30 10:08:08 304

原创 用栈实现队列的功能,用队列实现栈的功能?

我们首先来看用栈实现队列的功能,首先大伙儿要知道队列和栈的特点其实是“相反”,那么要想用栈来实现队列的功能,一个栈肯定是做不到的,我们可以用两个栈来实现,一个push栈,一个pop栈,push栈用来添加入队数据,pop栈用来出队数据,不论是入队还是出队的时候都可以加上一个检查和迁移操作,并且迁移必须遵守原则:pop栈为空,然后从push栈往pop栈迁移数据的时候必须一次性全部完成,这样就能满足先入先出的规则了。

2023-11-24 13:23:51 59

原创 用数组实现队列和栈

【代码】用数组实现队列和栈。

2023-11-21 17:09:03 77

原创 算法与数据结构之链表

链表的定义,相信大家都知道,这里就不赘述了只是链表分单向链表和双向链表,废话不多说,直接上代码。

2023-11-05 00:06:23 307

原创 异或运算的魔法

举个例子[1,2,3,4,1,2,4],我们要找的数据是3,根据前面的结论,任何一个数异或0等于它本身,同一个数异或它自己等于,那么这个数组其实我们把它排序看看[1,1,2,2,3,4,4],所以1,2,4在与tmp异或完之后tmp等于0,最终结果就是4了。思路:用一个临时变量tmp,初始值为0,从数组开头一直异或到结尾,最后tmp就是要找的数。第二题:给定一个数组,只有一个数在其中出现了奇数次,其他的数出现偶数次,找出这个数。1、任何数与0异或,结果是这个数本身。2、任何数和它自己异或,结果是0。

2023-10-30 19:40:24 103

原创 快速排序算法

快速排序二:给定一个数组,进行排序,要求排序完成之后,小于数组最后一个元素的数据全部在它的左边,大于它的全部在它的右边,等于的全部在中间,左右两边内部不要求有序,比如原数组是[5, 6, 3, 1, 2, 3]排序完之后:[1,2,3,3,5,6 ],也就是原数组最后一个数是3,排序完之后小于等于3的全部在3的左边,大于3的全部在3的右边,等于3的全部在中间。1、我们定义一个小于目标数据的区域,它的初始位置在数组第一个元素的前面,也就是下标为-1的位置,取名为lessEquals。

2023-10-26 09:55:17 636 2

原创 排序算法之归并排序

分别有两个指针P1和P2指向两个小数组的第一个元素,然后移动两个指针,哪个数组对应的指针所指的数据小,就将它拷贝到help当中,如果有一个指针先移动结束,那么另一个数组当前指针所指的位置以及后面的数据直接拷贝到help即可。新建一个数组,长度是总数组的长度,也就是4,我们记这个数组为help。将help数组的数据还原到原数组中。

2023-10-24 16:40:30 599

原创 给定一个文件夹,不允许用递归,统计其下面的文件数量,包括子文件夹下面的文件

对于统计一个文件夹下面的文件的数量,大家第一反应肯定是递归调用来实现,现在有这么一个目录结构:root1和root2下面各有一个文件file1.txt和file2.txt,所以最终统计出来的文件数量应该是3。ps:其实这里不一定要用Stack,也可以用queue等集合都可以实现,与递归的方式相比,各有优缺点吧,如果文件夹的数量过多,递归可能会导致StackOverflow,第二种方式可能会导致oom。

2023-10-17 10:29:22 135

原创 二叉树相关算法

那么我们可以看出来,不论是哪种遍历方式,其在处理左右子节点的时候,逻辑都是一样的,都是要递归处理,前序遍历:头左右,也就是先头后左再右:1245367。中序遍历:左头右,也就是先左后头再右:4251637。后序遍历:左头右,也就是先左后右再头:4526731。不同的只是头结点的输出时机。

2023-10-16 23:51:12 260

原创 合并K个升序链表

我们利用Java自带的PriorityQueue,这个queue底层实现实际上是通过数组实现的小根堆(小顶堆,名字无所谓怎么叫啦),反正就是加进去的数据可以自动排序,所以我们可以利用所有有自动排序的功能的集合来实现这个功能,只是队列用起来方便一点,像treeset等有序集合要一边加一边删有点麻烦,至于说能不能用java自带的这些工具,这个题目的重点不是让你实现排序,所以我觉得是可以的,当然要自己实现一个排序的集合,其实也不难。给你一个链表数组,每个链表都已经按升序排列。

2023-10-13 14:34:15 68

原创 用位运算实现加减乘除法

除法:除法是乘法的反向推导,比较绕,比如15/5=3,意思就是5*2+5*1=15,其中2就是2的一次方,1就是2的0次方,也就是说一个数a除以b,那么a一定可以表示为:b*2的0次方+b*2的1次方+....,我们说乘法实际上是加法实现的,那么除法其实就是减法的实现过程,比如15/5,也就是从15中不断地减去5,直到不够减或者为0为止,也就是:15-5*2-5*1=0,其中2就是2的一次方,1就是2的0次方,那么15/5实际上就是2的0次方加上2的一次方。减法:有两种方式,一种是跟加法一样,通过借位。

2023-10-12 14:50:20 133

原创 判断一个整数是否回文

回文数字的定义:第一位和最后一位相等,第二位和倒数第二位相等...一次类推,比如1221,12321等等,也就是说一个数字如果是回文,那么将它。解法三:一个数字如果是回文,那么它的前半部分和后半部分的反转一定相等,相当于是在解法二的基础上的优化,减少了循环的次数。解法一:投机取巧,用Java的StringBuilder的reverse方法。解法二:将数字反转,得到反转之后的值与原值相比较。反转之后,一定和原来的值相等。

2023-10-09 16:57:55 70

原创 验证NIO的非阻塞模型

可以看到accept并不会像NIO一样阻塞,而是直接返回-1,write(2, "\346\262\241\346\234\211\346\226\260\347\232\204\345\256\242\346\210\267\347\253\257\350\277\236\346\216\245.....", 32) = 32。我们再把两个选项都回复到false,然后丢到linux系统去运行,看看系统调用的情况(如何查看系统调用情况,之前有一篇BIO模型的文章。

2023-09-28 15:41:01 533

原创 Java当中的BIO模型

clone这一行的意思就是fork一个子线程出来处理任务,这时候我们可以用lsof命令看会多了一条数据,也就是clone出来的子线程,我们在上图看到文件内容阻塞在了poll,等待下一个连接进来,循环往复。我们知道任何一个应用程序在linux中都会表示程一个文件,并且都会有一对应的文件描述符,我们可以用lsof -p pid来查看应用程序打开了哪些文件(描述符)总结一下:传统的BIO模型中,所涉及到的系统调用主要是三个(当然这里还涉及到tcp三次握手,不在本文讨论范围)

2023-09-28 14:44:23 107

原创 利用CompletableFuture提高接口的响应速度

另外一种就是代码中的execWithCompletableFuture方法,CompletableFuture其本质还是线程池的玩法,它还有其他很多编排线程的玩法,比ThreadPoolExecutor花活多的多,后续有时间再追更。加缓存:把查询条件作为key,将查询到的数据放到redis里面去,但是这种方式,不太好评估过期时间,因为监控数据本身就是对数据实时性要求较高,而且我们检查tdengin数据库,发现负载并不高,于是我们采用多线程的方式并行的去查询。

2023-09-25 13:27:35 191

原创 关于Java NIO的的思考

总的来说就是一句话:poll是应用程序自己遍历所有的文件描述符(也就是每一个连接),挨个询问操作系统数据准备好了没有,而epoll则是应用程序把所有的文件描述符一次性给操作系统内核,由内核遍历文件描述符,然后告诉应用程序哪些文件描述符数据准备就绪了,相比与前面的写法,这种就要好的多,这也是netty框架的基本思想精华所在,在handleRead中读事件数据就绪时,将读取到的数据交给线程池去处理业务,那么可能会有人说这样遍历一次不还是很耗时吗,这个当然,但是想想来说,会返回一个就绪的文件描述符列表。

2023-09-25 10:07:47 262

原创 两个乒乓球队进行比赛,各出三人。甲队为a,b,c三人,乙队为x,y,z三人。已抽签决定比赛名单。有人向队员打听比赛的名单。a说他不和x比,c说他不和x,z比,请编程序找出三队赛手的名单,用java实现

另外一种就是取反思想:a说他不和x比,正面是第一个人等于a且第二个人等于x,这种条件是不满足的,那么取反就是只要第一个人不等于a或者第二个人不等于x即可。(第一个人不等于c或者第二个人不等与x。第一个人不等于c或者第二个人不等与x。* 甲队:a vs 乙队:y。* 甲队:a vs 乙队:z。* 甲队:b vs 乙队:x。* 甲队:b vs 乙队:y。* 甲队:b vs 乙队:z。* 甲队:c vs 乙队:x。* 甲队:c vs 乙队:y。* 甲队:c vs 乙队:y。* 甲队:a vs 乙队:x。

2023-09-21 17:11:16 811

原创 给定两个字符串ABCDEF和123456,用两个线程按照1A2B3C4D5E6F的顺序输出

这个问题考察的是对多线程和juc下面某些类的理解,总的来说,思路就是当一个线程t1输出当前字符之后,要阻塞或者等待,让另外一个线程t2输出,然后t2阻塞或者等待,有以下几种思路,废话不多说,直接上代码。

2023-09-21 15:50:59 91

原创 二分查找算法

题目:给定一个已经排好序的数组和一个目标数据,把目标数据插入给定的数组中。思路:因为数组是已经排好序的,所以可以用二分查找来快速定位要插入的位置。

2023-09-21 09:46:52 32

原创 基于Swing和科大讯飞星火大模型开发的可视化聊天界面

最近很荣幸的申请到了科大讯飞星火大模型的内测资格(已经开放网页版可以直接用,类似于chatgpt那种),给了我400w的免费token,有效期一年,其中1.5版本和2.0版本各200w,于是自己想着基于星火大模型写一个简单的聊天界面,刚开始是基于springboot搭建的一个网页版的,但是页面布局啥的太难看,调了好长时间也就那样,最后就想到了还是用swing来做算了,废话不多说,上干货。

2023-09-19 16:43:53 408

原创 使用redisTemplate通过lua脚本实现分布式锁的坑

我自己的代码是用Integer接收返回结果的,而AI给的代码是Long,于是我把我自己的代码改成了Long,并且把redisTemplate换成stringRedisTemplate,正常运行。1、redis服务端版本问题,看了一下,我自己的本机版本是5.0.14.1,项目中是5.0.5,于是在本机又安装了一个5.0.5版本的redis,用项目代码跑,也正常运行。

2023-09-04 15:16:47 116

原创 Java里面一个对象到底占用多少空间

可以看到这个时候就没有额外填充4个字节了,这个UseCompressedOops意思是时否开启压缩指针,因为在java对象头里面有一个类型指针指向它所属的类型,默认情况下是开启的,这个类型指针占4个字节,那么一个默认情况下Object对象实际上只占用了12个字节,为了对齐,额外填充了4个字节,而当我们不开启指针压缩的时候,类型指针站8个字节,这个时候就不需要对齐填充了。可以看到一个Object对象占用16个字节,其中有4个字节是不属于这个对象本身的内容,是额外填充的,至于为什么要填充,

2023-08-18 10:43:47 95

原创 还在用count查看数据是否存在?

我们在项目中通常会碰到查重,也就是查看数据库中是否已经存在某条记录的情况,存在则update否则insert,那么通常我们都会用count函数去统计总数,如果是大于0就认为存在,那么有没有更简单快捷的办法呢,答案是有的,就是把。场景1:根据主键id查看数据是否存在:SELECT count(1) FROM t_order where id=1;1、准备数据:准备一张订单表,里面只有一个主键id字段和订单id,然后往里面插入100w条数据。执行时间和索引使用情况是一模一样的。可见两种情况几乎是一模一样。

2023-08-18 09:42:23 76

原创 netty入门程序:从控制台输入数据发送服务端,服务端原样返回给客户端

【代码】netty入门程序:从控制台输入数据发送服务端,服务端原样返回给客户端。

2023-08-17 16:35:17 188

空空如也

空空如也

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

TA关注的人

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