- 博客(59)
- 收藏
- 关注
原创 优选算法:位运算
:有0则为0| :有1则为1^ : 相同为0,相异为1;也可以称为无进位相加>> << : 右移,左移~:按位取反一个数异或自己等于0,异或上0等于自己。一个数取负数:n变为-n,要经过按位取反在加1。提取最右侧的一个1:n&-n ,因为-n的本质是将最右侧的1的左侧全部变为和n相反的。去掉最右侧的一个1:n&n-1 , 因为n-1需要最右侧的1来进行相减。位图:就是将一个int的32位比特位看为一个数组,里面存储的东西就表示信息,这样就可能用一个变量就能解决。
2025-09-13 10:38:54
929
2
原创 优选算法:二分查找
这道题就体现了二分查找的寻找左端点和右端点。这道题中数组是非递减的,数组中要不就是上升要不就是不变,又是要根据二段性寻找目标数,此时就使用二分查找。首先是寻找左端点tra,我们可以发现,数组可以分为两段,一段是小于tra的,一段是大于等于tra的,那么我们根据二分查找到的点mid如果落到左边,此时我们就更新left让left=mid+1;当mid落到左边,此时就可以将right更新,但是我们不可以让right=mid-1,当mid落到最左端端点时,mid-1就会跳过目标值,因此只能让right=mid。
2025-08-30 10:22:22
1170
原创 优选算法1:双指针
算法思路:我们可以先用一个变量dest遍历数组,cur停留在-1位置,通过dest遍历到的元数进行处理,让[ 0 ,cur ] 全是非零元素,[ cur+1,dest-1]全是0。算法流程:先让cur = 0;dest = -1,然后再让dest遍历数组,当dest下标元素非零时,让cur++,然后将cur所指向的值和dest交换,就完成了一次搬运,将此过程重复。
2025-08-22 20:18:59
482
原创 基于SpringBoot实现的抽奖系统(二)
我们对⼿机号进⾏存储时,要先将⼿机号加密,如果要拿出使⽤时,还要进⾏⼀次解密操作。为了不让每次⼿动去加密解密,决定使⽤Mybatis的TypeHandler来解决.简单理解就是当处理某些特定字段时,我们可以实现⼀些⽅法,让Mybatis遇到这些特定字段可以⾃动运⾏处理。我们只需要在配置文件中指定一下对应得路径.
2026-10-20 17:45:42
245
原创 基于SpringBoot实现的抽奖系统(三)
在service层中先从数据库中拿到数据,然后将数据通过lamda表达式的方式,UserDO是从数据库拿到的原始数据,通过定义UserDTO这个类,将数据进一步处理,构造成service层向上层传输的数据格式,最后返回构造好的List.接收controller层的奖品信息与图片,先使用savePicture将图片存储到本地,然后构造dao层数据,将构造好的数据传入Mapper层中.在创建奖品时,需要上传奖品图片,这个功能就是将上传的图片进行本地的保存,在后面获取奖品列表时,就需要获取图片.
2026-10-20 17:26:49
182
原创 基于SpringBoot实现的抽奖系统(一)
抽奖系统类似于直播中的抽奖活动,在日常生活中也是比较常见,于是基于SpringBoot提供一个安全,可靠,易于维护的抽奖平台,本次项目采用了以下的策略:1.集成多种技术组件:项目中集成了MySql,redis,RabbitMQ等常见的中间件.2.允许管理员创建配置抽奖活动,管理人员和奖品信息.3.使用了哈希加密,对称加密等加密方法保障用户的隐私数据.4.提供了比较全面的日志处理与异常处理机制,简化维护过程.
2026-09-28 10:04:21
196
原创 如何保证RabbitMQ消息可靠传输
RabbitMQ在发送消息时会出现很多问题.以上图为例,生产者发送给broker时会出现的问题,broker内部会出现的问题,broker发送给消费者会出现的问题.
2026-09-07 16:19:11
296
原创 RabbitMQ在SpringBoot中的应用
之前介绍的RabbitMQ的几种工作模式主要是体现其思想,下面是基于SpringBoot来针对RabbitMQ的几种工作模式的开发.
2026-09-05 17:31:03
307
原创 理解Cookie和Session
Cookie表示存储客户端的一小段文本数据.每次访问同一个网站时,浏览器都会自动的带上这份Cookie给服务器.当下一次打开这个网站时,就不用重新登录.特点:数据存储在你的电脑中,服务器不存在这一份内容.用户可以查看\删除\篡改cookie,不安全.可以设置过期时间,有效期可以设置.
2026-08-31 20:57:47
216
原创 树及其二叉树应用 , 反射枚举lambda
树结构是非线性结构,主要是一个节点可以延伸出多个子节点,而每个子节点也只有一个父节点,类时的文件目录就是典型的树结构.节点的度:表示的是一个节点的子树的个数.树的表示形式类时链表,在链表中叫做头节点,而在树中就叫作根节点.知道根节点就可以得到树的其他子树.最常用的表示方法就是孩子表示法,创建的Node节点中存储的是当前节点的子树引用.当然也可以使用其他的表示方法.例如双亲表示法(只有当前节点父节点的引用).
2026-08-29 08:42:04
265
原创 RabbitMQ介绍及其工作模式
AMQP(高级消息队列协议)是一个通用的应用层协议,提供主要的消息服务的协议,为面向消息服务的中间件.基于此协议的客户端和消息队列进行传递消息,不会受客户端,中间件,开发语言等因素影响,后面RabbitMQ中定义的交换机,队列等概念都是这个协议中的提出的,AMQP的模型结构和rabbitMQ是一样的.rabbitMQ是基于AMQP协议的消息服务的中间件,是主流的消息中间件之一.
2026-08-29 08:40:16
441
原创 Java中的String和异常
当我们要循环输入多个数时,可以使用has系列的方法,这个方法返回的都是boolean类型的值,它会判断控制台输入的是否和它的规定类型相一致,hasNext读入一行字符串,hasNextLine判断是否有一行可读.当我们通过键盘输入一段数时,此时操作系统根据输入的东西放到对应的位置.解决办法就是在要clone的方法内部再实现Cloneable接口,重写clone方法,再在clone时调用克隆类的克隆方法,就可以将其中的引用类型也克隆(深克隆就是递归克隆引用类型).
2025-10-28 20:11:08
953
原创 递归_搜索_回溯算法
汉诺塔问题实际就是将一个柱子上的所有盘子全部移到另一个柱子上,但是每次只能移动一个盘子,且大盘子不能在小盘子上.以只有两个盘子为例, 有abc三个柱子,a上有两个柱子,要移动到c柱上,那么需要借助b柱,将除最下面得盘子之外得所有盘子全部移动到b柱上,这样就可以将a盘最大的移动到c柱.当有三个盘子时,要将最大得盘子移动到c柱,需要将除最大盘子以外得所有盘子移动到b盘,那么当最大得盘移动到c盘后,此时所有得盘都在b上,那么就需要借助a盘将b盘上最大得盘移动到c,步骤就和当有两个盘时一样.
2025-10-28 20:10:22
733
原创 链表强化算法
使用模拟的思想,引入四个下标,这里创建一个傀儡节点会跟加方便.pre是傀儡节点,fastnode是第一个节点,secnode是第二个节点,nextnode是第三个节点,我们需要交换第一和第二个节点,再更新下标,当判断到两个要交换的节点有一个为空时,此时就停止交换.创建一个新链表,遍历两个链表,当两个链表的头节点的值不相同,且有一个比较小时,将这个节点添加到新结点上,然后继续遍历.直到两个链表中有一个已经遍历完毕,此时将另一个链表身剩下的节点添加到新节点上,此时完成添加.这里可以创建一个傀儡节点,方便统计.
2025-10-26 17:07:11
527
原创 redis中的数据类型
1.set和get:NX表示如果key不存在才设置,存在就不设置.XX表示key存在才设置,不存在就不设置.EX表示设置的过期时间,时间单位是秒;PX表示的是时间单位是毫秒.2.mset和mget:可以批量的设置和获取key.分别是set nex,set ex,set px的缩写,功能一致.分别表示整数value的自增和增值固定值,但只能针对整数,同时增加固定值也是只能增加整数.分别是自减一和减去固定整数,增加小数.6.append在字符串的最后加上要拼接的字符串.
2025-10-26 17:06:46
1255
原创 初识redis(分布式系统, redis的特性, 基本命令)
redis和MySQL一样也是客户端-服务器结构的程序.在Linux系统下下载redis,下载后需要使用rides-cli来打开redis的命令行客户端.当然redis不止一个客户端,还有图形化客户端和基于redis提供的api自行开发的客户端(类似于MySQL中的JDBC).
2025-10-13 20:42:41
799
2
原创 Spring IOC , DI 和 应用分层
DI: Dependency Injection(依赖注⼊),容器在运⾏期间, 动态的为应⽤程序提供运⾏时所依赖的资源,称之为依赖注⼊。上面说到的将对象交给Spring进行管理,那么使用时就需要将对象从容器中取出来使用,DI就是实现从IOC容器中取出。
2025-10-04 12:51:58
1039
原创 分治_快排算法
这里可以使用将数组分三块的思想,我们使用left表示第一个区间的边界,right表示第三个区间的边界,这里的[0,left]中包含的是0,[left+1,i]包含的全是1,[i+1, right-1]包含的是未扫描的数,[right,n-1]是全是2,当i开始遍历数组,当为元素为0时,需要将这个数加入到第一个区间,此时将left先加一再交换;当元素为2时,因为right表示的是2,此时先将right减一,再进行交换,如果此时i++,就可能会导致right和i重合,造成死循环,所以此时不能加一;
2025-10-04 12:51:37
830
原创 EE进阶:Spring MVC入门
SpringMVC简单的来讲就是Spring中的一个部分,主要用于开发构建web应用程序,所以它也可以叫做Spring Web MVC。它提供了一个MVC模型的Web框架,用于处理web的请求和响应。Spring MVC通过将响应映射到相应的处理器上,通过视图呈现响应,这使得Web的开发变得简单灵活。SpringMVC其实就是Spring使用了MVC这样的模式来优化了web应用的开发,它的本质上其实还是Spring。
2025-09-13 10:39:01
1077
1
原创 EE进阶1:Maven和SpringBoot基本介绍
Maven简单的理解就是一个项目管理工具,使用pom.xml文件进行管理和获取.jar包,而不用手动进行添加.jar包。
2025-08-30 10:22:06
964
原创 网络编程6(JVM)
在学习Java的时候会接触到这样三个概念:JDK(Java开发工具包,写/编译Java代码时需要的内容)JRE(JAVA运行环境,运行Java代码需要的环境)JVM(Java虚拟机,JRE的核心模块)传统的虚拟机,其实是通过软件的来模拟出硬件,构造出新的电脑,甚至可以在上面安装新的系统。而Java中的虚拟机,其实不能模拟出电脑上的所有硬件设备(只有一部分),只能运行Java的代码,所以JVM其实是Java语言的“运行环境”,JVM的核心功能其实就是将Java语言翻译成CPU的指令。
2025-08-22 20:17:29
690
原创 网络编程5(HTTPS)
因为http协议的传输是明文的,就会引入了例如运营商劫持这样的安全问题,所以为了解决这样的问题就对http协议进行加密,加入了一个加密层,https就诞生了。例如当我们在浏览器上下载一个软件,会通过运营商的路由器发送请求,获取到软件的下载地址,但是此时运营商服务器就会将我们获取到的地址进行篡改,这样的情况就是运营商劫持。因此HTTPS就会对请求数据进行加密,将明文加密得到密文,将密文解密得到明文,而加密解密过程中的一个关键数据就是密钥。
2025-08-20 18:55:10
812
原创 网络编程4(DNS协议,HTTP协议)
DNS是一个应用层协议,用来简化IP,IP是由32位的整数表示的,不便于观察,所以就通过“域名”一串有意义的单词表示。最早的DNS是通过hosts文件表示,但是如今的DNS是通过一组DNS服务器完成的域名解析。本来是通过hosts查询域名和IP的关系,但是现在将这些域名和IP映射关系储存在一组服务器中,当我们通过域名访问服务器时,就会通过访问DNS服务器得到服务器的IP,从而访问到服务器。
2025-08-20 15:43:26
987
原创 网络编程1(UDP,TCP)
了解了网络的一些概念,接下来就要进行网络中的跨主机通信,了解网络中的一些API,这里谈到的API都是针对传输层进行的,这是因为我们编写的代码是在应用层,而传输层就是到了计算机内核中操作系统中已经实现好了的,编写网络编程代码就是调用系统API,将数据传输到传输层,传输层->物理层就由操作系统进行。将应用层数据传输到传输层的这些API就叫做socket api(网络编程套接字),要将数据传输到传输层就要了解传输层中涉及到的协议:TCP,UDP,这两个协议涉及到两组不同的socket api,要分别进行讨论。
2025-07-02 12:17:00
557
原创 计算机初始网络
网络其实是用来进行通信的。在计算机刚刚引入国内时是没有网络的,但是在2003年左右出现了局域网对战游戏,通过局域网连接可以与其他玩家进行对战,而所谓的局域网连接就是将多台计算机通过网线连接到一台叫做的设备上进行计算机之间的连接,此时连接的这些设备就叫做局域网。上面的一般在一个网吧中进行局域网连接,而随着后面的发展出现了网游,而网游就不是仅仅在一个网吧中进行连接对战,是在各个地方都可以进行连接,也就是在广域网上进行连接,而所谓的广域网其实就是多个局域网通过进行连接,达到各个地区的局域网相互通信的效果。
2025-07-01 14:49:49
679
原创 JAVA EE:文件IO
文件在计算机中是保存在“硬盘”中的。操作系统在把硬盘操作进行了封装,在编程时是不会对硬盘进行直接操作的,而是通过文件进行操作硬盘的,直接通过打开文件,修改文件等操作进行简化,又通过文件资源管理器进行对文件的管理。
2025-06-16 16:59:14
817
原创 多线程4(Thread)
前面谈到创建销毁进程太消耗资源而引入了线程,而频繁的创建和销毁线程就失去了线程轻量化的特点,而无法忽视线程的创建和销毁,所以进一步优化就得到了线程池这个概念。提前将线程准备好,放进一个“池”(数据结构)中,当需要时就去池中申请,用完后就放回池中。
2025-06-10 12:27:07
784
原创 多线程3(Thread)
线程调度是随机的,但是我们可以使用wait/notify进行规划。join是控制线程结束顺序,而wait/notify是控制详细的代码块,例如:线程1执行完一段代码,让线程2继续执行,此时线程2就通过wait进行阻塞,等到线程1执行结束后,再通过notify唤醒线程2。线程饿死:线程1释放锁资源后,其他线程和线程1要进行竞争锁,但是由于其他线程还要进行唤醒操作,可能会出现线程1一直拿到锁资源,导致其他线程拿不到锁的情况。wait/notify可以解决线程饿死问题。
2025-06-08 22:22:21
1153
1
原创 多线程2(Thread)
NEW:线程创建出来了,但是还是没有被start。创建好Thread后,先使用getState方法查看状态,再start,看到的就是NEW。TERMINATED :线程执行结束,入口方法执行结束,但是Thread对象还在。线程结束后调用getstate,观察到的线程状态就是terminated。RUNNABLE :线程执行过程中一直是此状态。在线程start和join之间创建就可以看到RUNNABLE状态。
2025-06-06 17:59:32
783
原创 多线程1(Thread)
在进程中,要创建一个进程和销毁一个进程所消耗的硬件和软件资源是巨大的,因此为了优化上述过程,我们引入了“线程”。1)线程和进程的关系可以认为进程包含线程,一个进程里最少有一个线程,每个线程都可以单独执行一段逻辑,并且可以单独在CPU上调度,因此线程可以叫做“轻量级进程”。在一个进程中,多个线程共享进程资源,而在后面在这一进程中创建的线程就直接使用进程创建的资源,可以省下申请资源的开销。2)线程安全问题。
2025-06-03 21:37:28
832
原创 MySQL初阶:JDBC
JDBC编程就是使用JAVA代码操作MySQL数据库。:就是数据库提供了一组API供程序员使用。:就是提供了一组函数/类,供我们调用,不同的数据库提供的API也是不同的。因此如果要操作不同的数据库就要学习多套API,为了方便JAVA提供了一套API,让数据库们都要和JAVA的API对接上,这样我们只要学习JAVA提供的API就可以进行操作数据库了。数据库并非单独提供一套API,而是通过驱动程序(类似于转接口)将数据库的原生API转换成符合JAVA要求的API。
2025-05-22 14:56:08
566
原创 MySQL初阶:查询进阶
查询可以搭配插入操作进行使用:创建一个class表(id int,varchar(10) classname),和一个student表(id int,varchar(10) studentname),class表中有三条记录,student表无记录:此时使用查询和搭配操作就可以实现将class表中的记录全部插入到student表中:注意事项:可以进行实行多次插入;插入表和被插入表的参数列表的列和类型要相同,否则会报错。表达式查询是针对列和列之间进行运算,聚合查询是在行和行之间进行运算。sql中通过-- 或
2025-05-13 21:51:13
615
2
原创 MySQL初阶:基础增删改查(CRUD)
先创建一个表1)单独插入一条insert into 表名 values (列名 类型)...;插入的记录要和表一开始创建记录的类型,个数,结构一样。如果不一样,就会报错。2)指定列进行插入insert into 表名 (列名,列名...) values (值,值...);这里选的列名设的值要和创建表时的一样,没选择的列在插入时会被设为NULL。3)一次性插入多行insert into 表名 values (值,值),(值,值)....;
2025-05-06 21:43:53
782
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅