- 博客(44)
- 收藏
- 关注
原创 HTTPS加密原理详解
HTTPS的工作流程主要用到了三次加密,一次对称加密和两次非对称加密用于校验证书是否被篡改,公钥在客户端系统中内置,私钥由公证机构给服务器,服务器用私钥对签名加密,客户端用公钥对签名解密来确认证书的合法性用于协商生成对称加密的密钥,公钥私钥都由服务器生成,公钥通过证书传递给客户端,客户端用这个公钥给对称密钥加密,服务器用私钥给对称密钥解密其实前两次的非对称加密都是为了解决对称加密遇到的问题,因为对称加密的运行效率要比非对称加密快得多,所以后于业务请求都用对称加密,
2025-03-08 21:12:52
2081
28
原创 leetcode刷题--超详解
在排序数组中查找元素的第⼀个和最后⼀个位置看到这道题我们首先想到的肯定是直接遍历,找到target然后定位左右位置,但是这样显然是行不通的,因为题上明确规定要求时间复杂度为O(logN)。所以我们要换个思路,既然是要查找,那么我们就可以想到使用二分查找。//找到区间中点//分析情况return mid;
2025-03-08 21:12:16
667
7
原创 MyBatia详解-下
动态SQL是Mybatis的强大特性之一,能够完成不同条件下不同的sql拼接,以下的动态sql均使用XML的方式举例使用的类数据库信息。
2025-03-07 18:51:53
586
2
原创 Mybatis详解-上
Mybatis是一个优秀的ORM持久层框架,几乎支持所有的JDBC语句,以及设置其参数和获取结果集持久层:指的就是持久化操作的层,通常指数据访问层(dao),是⽤来操作数据库的。ORM:就是OBject Relation Mapping对象映射关系,可以通俗来将就是讲数据库里的表关系映射成,java里的对象mybatis的持久层代码一般写在mapper包里,使用接口来编写相应代码,命名方式一般在最后加上**Mapper使用@Mapper来交给Spring管理。
2025-03-07 18:51:05
774
1
原创 Spring原理
我们先创建一个student类并把它交给Spring管理@Component接着通过直接注入ApplicationContext来获取Spring容器拿到两个student对象@Autowired@Test运行结果可以看到这两个对象的地址是一样的,说明我们从Spring容器里取出来的对象是同一个这也是一个单例模式(确保一个类只有一个实例),在默认情况下,Spring容器中的bean都是单例的,这种行为模式被称之为,bean的作用域,就是指,Bean在Spring框架中的某种行为模式。
2025-03-04 20:44:33
6148
29
原创 HTTP协议详解
也是一种一问一答的结构模型的协议,HTTP的请求的响应格式是有所差别的,HTTP大多是基于传输层的TCP协议实现(HTTP1.0 1.1 2.0都是基于TCP实现,HTTP3.0是基于UDP实现),目前应用应用比较广泛的是1.1和2.0版本。HTTP协议是文本格式的协议,内容都是以字符串的形式展现,而TCP,UDP,IP...协议都是二进制格式,HTTP响应也是文本格式,但是直接查看往往能看到二进制的数据,因为HTTP响应经常会被压缩,压缩之后,体积变小,传输的时候就可以节省带宽。
2025-03-04 20:44:15
702
5
原创 TCP协议
不过随着窗口大小不停的增大,达到一定程度,可能中间节点就出现问题了,发送方就要调小窗口大小,如果依然丢包就继续调小窗口直到不丢包,就再次尝试阔大窗口,在这个过程中,发送方不断调整窗口大小,逐渐达成‘动态平衡’(这种做法就相当于把中间节点都视为整体,通过实验的方式,来找到中间节点的瓶颈在哪里,然后确定最后的窗口大小,大概就类似于木桶原理,水面与取决于最低的那块木板)不过时间变长也不是无限的,当重传若干次后,时间已经拉长到一定程度,就会认为数据已经传不过去了,就会放弃tcp连接(会触发tcp的重置连接)。
2025-03-03 20:20:43
886
8
原创 JVM详解
一个运行起来的Java进程就是一个JVM虚拟机,当进程运行起来时,就需要像操作系统申请一大块内存,JVM就会把这些内存化分成不同的区域,每个区域有不同的作用。这里存储的内容就是类对象(.class文件,加载到内存之后,就成了类对象)这里存储的是,代码中new的对象(占据的空间最大)这里储存的就是在代码执行过程中,方法之间的调用关系,储存结构和数据结构里的栈类似,这里的每一个元素,称为“栈帧”,每个栈帧就代表一个方法调用,栈帧里就包含方法的入口,方法返回的位置,方法的形参,方法的返回值,局部变量。。。
2025-03-03 20:18:28
1143
1
原创 UDP协议
把当前要计算校验和的数据,每个字节,都进行累加,把结果保存到这两个字节的变量(校验和)中,过程中溢出也没关系,如果中间某个数据,出现传输错误,第二次计算的校验和就会和第一次不同(CRC这个算法其实不是特别靠谱,比如如果前一个字节大小少1,后一个字节大小多1,那么最后得到的校验和任然相同,但是数据可能已经不同了)。描绘这个数据报的报文长度(包含报头),这里的长度是指该报文有多少个字节,因为只有16位比特位的大小,因为数据传输可能会出错,所以需要一定的方法知道所传输的数据是否正确传输。
2024-09-04 20:36:45
1006
31
原创 网络编程详解
socket是文件描述符表里的一个表项,每打开一个文件,就会占用里面的一个位置,文件描述符表是再pcb上的(跟随进程),这个socket在整个程序运行中都是需要使用的,不能提前关闭,当socket不再使用的时候,就意味着程序就要结束了,进程结束此时文件描述符表,就随着pcb销毁了,随着销毁的过程中,socket就被系统回收了。
2024-09-04 20:34:49
1782
40
原创 常见的锁策略
顾名思义就是比较悲观的锁策略,在每次拿数据时总感觉会有其他人会对数据进行修改导致自己拿到一个无效数据,所以每次拿数据时都会进行加锁,这样别人想修改就会阻塞等待。认为数据一般情况下不会发生并发突变,在数据进行提交更新的时候,才会对数据是否产生并发冲突进行检测,如果发现并发冲突了,就返回用户错误的信息,让用户决定如何去做。假如有两个朋友要找你出去玩,友人A比较悲观,认为你可能比较忙,会先发个消息“今天下午三点有空吗,出来玩”(将相当于要给你加锁),如果你有空他就可以来找你,如果没有他就会等待你有空之后再来找你。
2024-08-26 18:46:50
956
18
原创 工厂模式详解
现在这个快餐店为了更好的销售产品,推出了一系列的套餐。抽象工厂模式提供了一个接口,用于创建一系列相关对象,而不是一个单一的对象。它允许客户端使用抽象接口来创建一整套相关的对象,而不必指定具体类抽象产品//抽象食物接口具体产品//薯条@OverrideSystem.out.println("做了一个薯条");//炸鸡@OverrideSystem.out.println("做了一个炸鸡");//汉堡@OverrideSystem.out.println("做了一个汉堡");//可乐。
2024-08-25 22:13:01
1112
21
原创 《javaEE篇》--线程池
线程的诞生是因为进程创建和销毁的成本太大,但是也是相对而言,如果频繁的创建和销毁线程那么这个成本就不能忽略了。一般有两种方法来进一步提高效率,一种是协程(这里不多做讨论),另一种就是线程池假如说有一个学校食堂窗口的老板想到给学生提供外卖服务,而且有一个奇妙的想法,每当需要送外卖就现场雇一个学生来送,然后解雇。(就相当于平时的有一个任务就创建一个线程来处理),但是老板还是觉得频繁的雇佣和解雇学生的成本太大,于是老板又有一个点子。指定一个指标,外卖员的人数扩张到3个人,但还是随着外卖的数量逐步雇人。
2024-08-25 09:58:45
2464
16
原创 《javaEE篇》--定时器
当我们不需要某个线程立刻执行,而是在指定时间点或指定时间段之后执行,假如我们要定期清理数据库里的一些信息时,如果每次都手动清理的话就太麻烦,所以就可以使用定时器。定时器就可以比作一个闹钟,可以让我们的线程在指定的时间执行,还可以指定时间循环执行。
2024-08-21 21:50:08
1068
27
原创 《javaEE篇》--阻塞队列详解
这样就可以实现上面的功能了。因为如果队列处在阻塞状态下,必然是因为满了或者为空,而且必须是在其他线程完成tack/put操作之后,在可以使用notify解阻塞。
2024-07-24 18:32:53
1374
44
原创 《javaEE篇》--单例模式详解
饿汉模式:在类加载时创建对象,通过方法直接返回该对象,不会出现并发安全问题懒汉模式:在第一次需要对象是才会创建对象,但会有并发问题,建议使用Double Check(双重检验) + Lock(加锁)可以很好的解决问题为了在多线程环境下防止,疑问指令重排序而导致代码出现问题,要使用volatile修饰对象以上就是博主对线程知识的分享,在之后的博客中会陆续分享有关线程的其他知识,如果有不懂的或者有其他见解的欢迎在下方评论或者私信博主,也希望多多支持博主之后和博客!!🥰🥰下一篇博客博主将分享有关。
2024-07-24 11:28:02
1068
7
原创 《JavaEE篇》--多线程(2)
线程之间的共享变量存在主内存(实际物理内存)中,而且每一个线程还有自己的工作内存(寄存器/cpu高速缓存),当线程要读取一个共享变量时,会把变量从主内存拷到工作内存中,再从工作内存读取数据,当线程要修改一个共享变量时,也会先修改工作内存中的副本,在同步到主内存中。计算机运行的程序,经常要访问数据,这些数据往往会存储在内存中(比如,定义一个变量,变量就会存储在内存中),当cpu使用这个变量的时候,就会把这个变量,先从内存中读出来,再放到cpu的寄存器中,最后在参与运算。那么我们如何保证线程是安全的?
2024-07-20 17:25:14
1293
33
原创 《javeEE篇》--多线程(1)
进程是操作系统对一个正在运行的程序的一种抽象,又或者说,可以把进程看作程序的一次运行过程(通俗的讲就是跑起来的程序)。而且在操作系统内部,进程是资源分配的基本单位PBCPBC的中文翻译是进程控制抽象,在计算机内部要管理任何现实事物,都需要将其抽象成一组有关联的、互为一体的数据。PBC就相当于是对进程的抽象,里面包含了描述一个进程的各种属性,每一个PBC对象就代表着一个进程。在操作系统中,会有很多进程那么,操作系统对这些进程进行管理,管理的方法是。
2024-07-16 16:28:48
1058
42
原创 《mysql篇》--JDBC编程
低耦合:用来描述代码模块之间的依赖程度,列如有两个模块A,B其中B依赖A,那么每次A修改后都要修该B,那么A,B间就是耦合的高内聚:表示某个特定的软件模块内部,是由很多相关性很强的代码构成,每个模块只负责一项任务,一个功能可以由各个模块通过聚合或组合等达到高度内聚,这样即使聚合的内容发生改变,也不用做很大的变动就等轻松的达到扩展的目的接下来我们来介绍一下使用到的方法都是什么作用🤔首先你是不是对。
2024-07-12 16:00:04
2710
54
原创 《mysql篇》--索引事务
我们先来举一个例子,假如我们现在要去银行把钱转账给另一个人,那么把这个操作简化为MySQL语句的话,就是我的账户删除一条数据,另一个人的账户插入一条数据,那么假如中间出现了错误,我的账户少了,另一个人的账户没有变,这样的场景显然是不合理的。事务就是将多条sql语句打包为一个整体,要么都执行,要么都不执行,事务把多个sql打包为一个整体来执行,称之为“原子性”(意为不可再拆分)。
2024-07-09 17:00:25
2772
45
原创 《mysql篇》--查询(进阶)
可以看作两个表相乘,在数学符号中,如果A = {a, b} 且 B = {1, 2},那么A × B的笛卡儿积为{(a, 1), (a, 2), (b, 1), (b, 2)}。//计算笛卡尔积时要注意如果两张表数据量都比较大时,就要考虑能不能使用笛卡尔积,因为笛卡尔积的表的数据量是,两张表的乘积如果数据量过大,可能会卡死服务器;外连接和内连接正好相反,外连接是尽可能显示较多的数据,即使表1没有数据为了显示表2数据,也会以null的形式显示表1;实际开发中往往数据来自不同的表,所以需要多表联合查询。
2024-06-29 15:44:37
1235
14
原创 《mysql》--mysql约束
有的时候数据库中的数据是有一定要求的,有些数据认为是合法数据,有些是非法数据,如果靠人工检查显然是不靠谱的;数据库会自动的对数据的合法性进行校验检查目的就是,保证数据中能够避免被插入/修改一些非法的数据//这些约束一般都是在创建表时添加上的在创建表时在所对应的字段后面加上not null该列字段就不能为空举例: create table student1(name varchar(20) not null,age int,score int,calss varchar(20));
2024-06-26 21:23:12
984
11
原创 《mysql篇》--mysql常用命令
- 单行插入: insert into 表(字段1, ..., 字段N) values (value1, ..., value N);-- 多行插入: insert into 表(字段1, ..., 字段N) values (value1, ...), (value2, ...), (value3, ...);-- 全列查询: select * from 表-- 指定列查询:select 字段1,字段2... from 表。
2024-06-25 22:35:42
1092
5
原创 《java数据结构》--哈希表
大概方法就是,将表中的每一个位置加上一个状态,状态有三种,空,有值,删除,删除状态就是这个位置之前有值但是现在被删除了,但是这个位置的值并没有改变,而是将状态设定为删除,这样我们进行其他操作就能知道那些时不用选中的了,这样我们即完成了删除又可以找到另一个冲突的值。,当然不是,如果只是简单的将原来的数据拷贝过来,这时数组大小扩容总空间变大,根据我们的哈希函数。如果不扩容的话,表的长度就是一定的,负载因子就和“插入表中的元素个数”成正比,所以,负载因子越大,表明插入表中的元素越多,冲突产生的概率越大;
2024-06-02 15:59:14
1577
1
原创 《java数据结构》--详解Map和Set
Map和set是一种专门用来进行搜索的容器或者数据结构,其搜索的效率与其具体的实例化子类有关。这两种排序一般用在静态查找,在查找时一般不会进行插入和删除,但现实中我们需要的往往是动态查找,即在查找时会进行一些插入和删除操作。这时就要用到map和set了,这两个是一种适合动态查找的集合容器。
2024-06-01 16:24:17
1166
1
原创 《java数据结构》--一篇解决二叉搜索树!!
我们可以根据二叉搜索树的特性,它的每一个结点的左子树比根小右子树比根大来进行快速查找,当一个数比根结点小就往根结点的左边找,比根结点大就往右边找,每次都可以将搜索范围缩小一半,最多查找h(树的高度)次,一个相对平衡的二叉树搜索树的时间复杂度大概为O(logN),为什么要说相对平衡呢?这种情况利用上面的方法依然可以实现,比如cur在父节点的右边,因为cur没有子树,所以不管父节点连cur的左边还是右边(左右都为null)都可以完成删除,cue在父节点左边也是一样的,所以这部分内容利用上面的代码也能实现。
2024-05-31 17:43:23
860
原创 《java数据结构》--队列详解
我们一般将如数据的操作叫入队,入队的一端称作队尾,取出数据的操作叫做出队,出队的一端称作队头,根据上面的图我们可以发现元素1是最先入队的并且是最先出队的。我们要注意的是在java中Queue是一个接口,不能直接实例化,但是LinkedList实现了Queue接口(它的底层是用一个双向链表实现的),可以用Queue接口去实例化LinkedList对象😉。的原则,栈是只有一端可以存取,队列是一端存,一端取。博主这里也是用链表来实现的,为了方便进行尾插,这里我们不仅定义一个头结点还定义一个尾结点。
2024-05-28 20:42:00
486
原创 《java数据结构》--栈的详解
栈是一种不同于链表和顺序表的储存数据结构,它对存储数据和取出数据有着特殊的要求🤔。首先栈只能从一端存储数据,这也是栈最大的特点,这也导致在栈中存取数据都必须遵循的原则😊,即先存入的数据只能最后拿出来,嗯🤔你可以把它想做一个细长的圆桶,你要往里放东西肯定是先放在最下面,当放满这个圆桶后你要再拿出刚开始放的那个,就必须把它上面的东西都拿出来才行。下面我来画图演示一下(画的不好请见谅🦊):一般我们将栈用来存取的一端叫做我们常常说取栈顶元素就是去取离栈顶最近的元素(也就是图中的3),另一端叫做。
2024-05-28 17:07:27
888
原创 《Java数据结构》--单链表详解
单链表是一种物理存储结构是非连续,非线性的但是在逻辑结构上是连续且线性的,链表是通过一个个结点来实现的,使每个相邻结点之间存在一定关系来将所有结点串起来,在物理存储上像是一条链子。
2024-05-27 23:47:41
1126
原创 《java数据结构》--顺序表详解
接下来开始添加,既然要指定位置添加数据那么原来的数据顺序肯定不能变而且被指定的位置肯定还要是可覆盖的,我们直接让那个位置以后的数据都向后移动一步就行,然后用要添加的数据直接覆盖掉那个位置就行。//这里改了list 3,结果list 1也跟着改了,是因为,sublist方法,并不是返回一个新的数组,而是返回原来数组的sublist的方法的第一个参数下标处的地址也就是返回1下标处的地址,还是在对同一个数组操作。到这里我们的顺序表就实现完了,但是Java中的顺序表还有很多方法有兴趣的小伙伴可以自己去实现一下。
2024-05-27 19:49:13
1074
原创 刷题篇--数据结构--链表
这道题可以利用快慢指针的方法来解决,即定义一个快指针f他的速度是一次走两步,慢指针s他的速度是一次走一步,这时我们假设链表有环,环的入口点为N,当两个指针一起向前走f会比s先进环内,当s走到环的如入口点N时,如下方第二个图,此时如果链表有环则两个指针都在环内,这时我们可以在做一个假设🧐,因为f的速度比s块,如果两个指针相遇了,那么这个链表就是有环的,如果f最后指向null了,那么说明,这个链表就是没有环的。这样一看是不是感觉很简单🥰。
2024-05-18 17:22:25
848
1
原创 刷题篇--数据结构--链表
如果我们有一个链表是1-->2-->3-->4-->5这样的,那我们反转后就是5-->4-->3-->2-->1这样的,那么要如果对链表操作呢?我们可以发现在反转后的链表里1-->2,变成2-->1那么我们就顺着这个思路,直接将下一个节点插到头节点前不就好了!!看起来好像不是很难,但是实现起来却很简单😉👌,嘿嘿!(^0^)我们可以再思考一下,将一个节点插到头节点前不就是头插嘛对不对,所以我们可以直接利用头插的方法来解决问题。
2024-05-18 11:32:43
590
1
原创 Java--面向对象--抽象类和接口
抽象类顾名思义,就是比较抽象的类,它不像之前我们见到的一些类可以具体到某个对象。比如动物类,当你看见这个类时你并不知道这是一个什么东西,只能确定它是一个动物。类似于这种一个类中没有包含足够的信息来描绘一个具体的对象类,这就是抽象类。抽象类的特点抽象类内被abstract 修饰的方法称为抽象方法,因为不同的动物做一个相同的动作可能会是不同的表现,所以抽象方法不用去具体实现,只需要给出一个声明就行(抽象方法不能是 private 的)。
2024-05-09 15:25:22
764
2
原创 Java--面向对象--继承和多态
继承是面向对象程序设计的一种重要手段,其最终目的是为了实现和当我们发现一个类A的功能不足以满足我们的需求,而需要重新建一个类B,但是类B又恰好需要类A的全部方法,这时我们就可以让类B去继承类A,语法是class B extends A{}。这就表示,类B继承了类A,其中类B叫做子类或派生类,类A叫做父类(超类,基类)。子类会继承父类的所有属性和方法。举个例子,就像手机的发展,手机每出现新的一代,是在旧的一代的基础上,在添加新的功能,可以说新手机继承了旧手机的功能,并在其基础上开发新的功能的。
2024-05-01 23:47:51
246
2
原创 java语法--面向对象--类和对象
这里用一个学生类来做例子:一个类是由属性和行为组成,class为定义类的关键字,Student为类的名字(用大驼峰),{}中为类的主体.属性一般是用来描述一个类的,比如像是名字,年龄,升高体重这些都是用来描述一个学生的,而行为则是描述这个类的动作,比如考试是一个学生会做的动作。从一个类中提取这些信息的过程叫做抽象,不同人的抽象能力可能会不一样。
2024-04-26 20:52:01
1387
3
原创 数据结构--手撕八大排序(超级详细)!!
排序是一种重要的算法,需要我们掌握的方法有很多比如最常见的八种排序算法:插入排序,希尔排序,直接选择排序,堆排序冒泡排序,快速排序,归并排序。当然还有一些其他的排序方法如基数排序,桶排序这里就不多做阐述。1. 冒泡排序和选择排序均为简单直观的排序算法,但是在大规模数据下效率较低。2. 插入排序在部分有序序列下具有较高的效率,但在一般情况下效率低于其他算法。3. 希尔排序通过分组插入排序的方式提高了效率,但在最坏情况下仍然是较慢的排序算法。
2024-04-11 23:46:21
1052
5
原创 罗马数字和整数的转换
/通常情况下,罗马数字中小的数字在大的数字的右边。// 若输入的字符串满足该情况,那么可以将每个字符视作一个单独的值,// 累加每个字符对应的数值即可。//例如:XVIII可以看作X+V+I+I+I=10+5+1+1+1=18//若存在小的数字在大的数字的左边的情况,根据规则需要减去小的数字。//对于这种情况,我们也可以将每个字符视作一个单独的值//若一个数字右侧的数字比它大,则将该数字的符号取反。
2024-03-21 09:38:37
449
3
原创 c语言实现记账溥(方法简单超详细)
我们既然想要完成一个记账簿,那么首先就要考虑需要实现哪些具体的功能。首先一个记账簿需要有以下基础功能1.记账 2.查询 3.修改 4.删除 5.退出。记账功能又可以分为1.收入 2.支出,查询功能可以分为,1.查询余额 ,2.查询总收入,3.查询总支出,4.查询总账单。我们现在一一进行功能的实现。
2024-03-18 23:33:05
2130
5
原创 常见字符串函数的用法
srtlen函数是用来求字符串长度的函数,返回值是size_t(unsigned int)类型,返回值大小是,要求的该函数的实际长度(不包含"/0").
2024-03-05 23:10:06
714
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人