- 博客(51)
- 收藏
- 关注
原创 Spring Boot使用(基础)
1.Spring Boot是什么?2.Spring Boot使用2.1Spring目录介绍2.2SpringBoot的使用
2023-04-24 21:19:32
2678
1
原创 Spring入门(万字详细附代码讲解)
1.什么是spring1.Spring介绍2.IOC容器3.控制反转(IOC)的好处4.DI.Spring使用1.较为古老用法1.1添加启动类1.2创建Bean1.3存储Bean1.4获取Bean常见面试题:1.5获取指定的Bean2.现在的 方法1.配置扫描路径2.添加类注解4.类注解类型多的原因5.Bean的命名规则6.方法注解@Bean7.对象装配7.1.属性注入7.2.构造方法注入7.3.set注入7.4.三种方法比较(面试题)7.5.Resource注解7.6.@Qualif
2023-04-08 18:06:52
876
原创 常见的开发模型和测试模型
软件开发阶段的生命周期需求分析->计划->设计->编码->测试->运维软件测试阶段的生命周期需求分期->测试计划->测试设计与开发->执行测试->测试评估。
2023-02-26 16:16:08
461
原创 简易项目:servlet实现个人博客(超级详细)
1.1.1用户登陆和注销这一部分需要满足用户的登入和注销操作,同时需要判断用户名和密码的正确性,我们使用JDBC从数据库中拉取数据来实现 1.1.2发布博客这一部分我们需要引入markdown来进行博客系统的编写页面,并且通过JDBC将发布的博客写入到数据库1.1.3删除博客这一部分我们需要将数据从数据库中将对应的博客进行删除,同时需要跳转到博客预览页1.1.4浏览博客这一部分我们通过JDBC将博客的标题和正文一部分展示到博客预览通过Linux部署到云服务器
2023-02-25 10:40:45
966
原创 Cookie 和 Session 的工作流程
1.Cookie1.什么是Cookie2.Cookie可以干嘛3.Cookie实现登陆逻辑的流程2.session1.session是什么2.session有什么用3.session的工作流程3.Cookie 和 session的区别(重点)
2022-12-22 20:16:42
764
原创 网络编程套接字Socket(通过两个用例,逐行注释,详细理解)干活满满建议收藏
3.UDP套接字编程1. DatagramSocket API1.构造方法1.DatagramSocket()2.DatagramSocket(int port)2.常用方法1.receive(DatagramPacket p)2.send(DatagramPacket p)2. DatagramPacket API1.构造方法1.DatagramPacket(byte[] buf,int length)2.DatagramPacket(byte[] buf,int offset,in
2022-12-21 20:18:55
1460
原创 网络中的一些基本概念(总结)
1.IP地址2.端口号3.协议4.五元组5.协议分层1.OSI七层模型2.TCP/IP五层(四层)模型6.网络分层对应7.封装8.分用9.客户端和服务器
2022-12-20 19:58:31
794
1
原创 HTTP协议详细总结
1.HTTP协议是什么?2.什么叫做应用层协议3.HTTP协议的工作流程4.HTTP报文格式请求报文:响应报文:5.URL6.方法的认识1.GET2.POST3.GET和POST的区别4.其他方法7.报头的认识用户登陆过程:8.状态码的认识9.HTTPS9.1HTTPS是什么?9.2HTTPS的工作流程9.2.1对称加密9.2.2非对称加密9.2.3引入证书
2022-11-19 20:12:52
786
原创 CSS常见选择器的用法
1.CSS引入方式1.内部样式2.内联样式3.外部样式2.选择器1.标签选择器2.类选择器3. id选择器4.通配符选择器5.后代选择器6.子选择器7.并集选择器8.伪类选择器1.hover2.active
2022-10-30 17:19:28
646
原创 HTML常见标签总结
1.标题标签2.段落标签3.字体修饰标签4.图片标签5.超链接标签6.表格标签7.列表标签8.表单标签9.下拉菜单10 多行文本框
2022-10-30 15:58:40
1972
原创 TCP协议特性总结
1.TCP特性2.报文格式3.确认应答4.超时重传5.连接管理(三次握手,四次挥手)1.建立连接(三次握手)2.断开连接(四次挥手)6.滑动窗口7.流量控制8.拥塞控制9.延迟应答10.捎带应答11.面向字节流的粘包问题12.TCP中的异常处理面试题:如何使用UDP来实现可靠传输?
2022-10-27 10:56:08
1911
原创 UDP报文结构
这个里面标识了UDP长度,这个的意思就是,整个UDP的报文长度,表示范围也是0~65535,也就是64Kb,这个范围其实是比较小的,所以,我们在进行大数据传输的时候,经常会分包上传,也就是把一个数据放到,多个UDP包中,分次上传,或者直接使用TCP传输,因为TCP是字节流传输的,没有对包的长度做出限制。我们可以看到,这张图的排版,很容易让我们以为是这种表格式顺序结构,其实不然,真正的UDP报头结构是这样的。,源端口里面是16位二进制的,可以表示源端口号,就是数据发送方的端口号,表示范围是0~65535。
2022-10-25 12:12:44
227
原创 锁策略,CAS以及synchronized的优化
1.锁策略乐观锁与悲观锁读写锁重量级锁与轻量级锁自旋锁与挂起等待锁公平锁与非公平锁可重入锁与不可重入锁2.CAS什么是CAS?CAS应用:1.实现原子类2.实现自旋锁3.ABA问题3.Synchronized的优化锁策略加锁过程的优化锁消除操作
2022-10-15 20:20:42
424
原创 死锁的成因和解决方案
这里面的解决方案就是改变加锁的顺序,在实际开发中,遇到多把锁,一定得多长心眼,否则很可能出现死锁问题,改变加锁的顺序,基本可以处理掉%95的死锁问题,以后我们就可以在处理死锁的问题上,优先考虑。如下图,有五位哲学家,在一起吃饭,如果其中一个想要吃到面,需要拿到左右手的叉子才可以吃,吃完了会把叉子放下来,这样当这个叉子用完之后,别的哲学家才可以使用那个叉子。我们的解决方案是给每一个叉子编号,从1-5,如果哲学家想要吃面,那么需要先拿编号较小的那个,才可以拿另一个,这样就有效的解决了死锁问题。
2022-10-15 11:09:48
517
原创 经典面试题HashTable, HashMap, ConcurrentHashMap 的区别
触发扩容的时候,会重新创建一个数组,扩容过程中,新旧数组会同时存在,接下来的每次对哈希表的操作,都会把旧数组的元素搬运一部分到新空间上,直到搬运完成,释放旧的空间在此过程中,如果需要查询元素,则新旧一起查找,如果插入,则在新数组中插入,如果删除,那直接在旧数组中删除。ConcurrentHashMap考虑到一个线程读,一个线程写的情况下,可能会读到修改一半的数据,它保证读的是谷歌,一定是囫囵个的数据(要么修改前,要么修改后)两个线程同时修改,才会有锁冲突,其余情况不会有锁冲突。3.充分利用CAS的特性。
2022-10-15 10:38:46
401
原创 java线程安全问题的原因与大致解决思路
线程安全的问题1.操作系统的抢占执行2.多个线程修改同一个变量3.操作不是原子性的4.内存可见性5.指令重排序线程安全的解决方法3.操作不是原子性的4.内存可见性5.指令重排序问题
2022-09-17 16:49:58
433
3
原创 java线程的状态与联系(一张图理解)
这张图对上述的状态转换进行了总结,当我们想从某一个状态转移到另外一种状态的时候,就需要通过调用一些方法,从而使线程从一种状态转换成另一种状态,如果想要监控到状态的转换,可以使用JConsole来进行监控。我们可以用Thread.Stave.values()来获取到线程所有的状态,这里获取到的信息是枚举类型的数组,我们对其进行打印,就得到了所有的线程状态。在java中,线程拥有不同的状态,这篇将带你初步理解java线程的一些状态和联系。我们可有看到,线程拥有6中状态,具体状态的内容如下。
2022-09-17 11:06:22
292
2
原创 一篇文章带你理解Thread(多线程)的基础用法
1.线程创建1.1通过继承类创建1.2通过类实现接口创建1.3通过内部类继承Thread来创建1.4通过内部类实现Runnable接口来创建1.5通过lambda表达式创建2.线程中断2.1自定义标志位2.2interrupt()方法3.线程等待4.线程休眠5.获取线程实例
2022-09-17 09:58:43
1165
1
原创 进程与线程的区别和联系(面试高频)
1.多个进程创建需要多次开辟内存资源 而 线程就不用,只是在第一个线程的时候开辟,并且在销毁的时候,线程也比进程的消耗要小得多,所以线程更加轻量化。操作系统的内核是通过PCB来描述进程的,更准确的说,一个进程需要一组PCB来描述,因为一个进程可以包含多个线程,每个线程由一个PCB描述。2.线程在执行的时候,需要相互协作,不同进程中的线程要利用系统提供的公共资源区进行通信,线程也是进程的可调度实体。3.同一个进程中的线程之间,是公用一块内存/文件资源的,而每个进程却是独立的。
2022-09-11 22:09:27
189
2
原创 JAVA异常类(简单明了)
在生活中我们也经常会感到异常,比如我们身体的某个地方疼,那指定是有什么地方做了不对的事情,对于计算机来说,也是这样,当你的程序运行的不对了,也是有一些做的不好的事情锁导致的.所以我们就能得到定义。受查异常:又叫编译时异常,程序在编译的时候就会报错的异常,不能通过编译.例如我们前面说的clone接口,使用的时候需要处理异常,这种就是受查异常。在这里我们可以看到,当我们哪一步出现异常的时候,我们在后面解决了异常,这样后面只要能执行,就没异常了,即使有,也会在里面处理了。
2022-09-08 18:28:43
2578
3
原创 String详解及StringBuffer,StringBuilder常用方法简介(含字符常量池)巨详细
1.2字符串的比较1.3字符串的查找操作1.3.1charAt()方法1.3.2indexOf()方法1.4字符串转换操作1.4.1字符串转数值1.4.2数值转字符串1.5字符串的替换1.5.1replaceAll(String regex, String replacement)1.5.2replaceFirst(String regex, String replacement)1.6字符串拆分1.7字符串截取1.8字符串修剪方法1.9大小写转
2022-09-08 10:34:54
944
4
原创 操作系统中的进程是什么?(详细讲解进程调度相关PCB信息)
1.进程调度是什么2.操作系统的管理2.1.描述:2.2.组织:3.PCB块中的信息3.1pid标识3.2内存指针3.3文件描述符4.进程调度相关的4.1进程状态4.1.1就绪状态4.1.2阻塞状态4.2进程优先级4.3进程上下文4.4进程记账信息PCB
2022-09-03 21:16:36
1155
2
原创 Clonable 接口 深拷贝与浅拷贝(超详细!!!代码附注释带图)
这里可以看到,s1中的func和s2中的func是一样的,都是一块地址,所以指向同一块空间,所以当s1中的func中的数据改变,s2中的数据也会随之改变。这里面就是给a和b同时开了两个空间,然后把a中的数值拷贝到b中去,这种当a中的值发生改变的时候,不会影响到b,就叫做深拷贝。最后修改s1中的A的x,导致s2中的A的x发生了改变,这种就不符合我们的预期了,成了浅拷贝了。在上述代码中,a和b指向的是同一块地址空间,当a中的内容发生改变的时候,b也会随之改变。不一定哦,我们再看下面的代码。
2022-09-02 20:52:17
298
原创 java抽象类和接口(Comparator和Conparable的使用)
注意:这里的default不是访问限定符可以看到是暗色的注意:接口时可以继承的,这里就不测试了接口和抽象类的区别3.一些重要的接口的使用这个接口是用来进行对象直接的比较的比如我们创建一个类Student实例化student1和student2的对象,然后调用Comparable接口中的compareTo方法来进行比较}}}}然后我们开始使用Comparable接口,只需要在原来的上实现这个接口,并且重写CompareTo方法就行了。
2022-09-02 19:50:22
738
原创 通俗易懂的经典反转链表OJ(附拓展题)
链表在笔试面试胸还是很重要的,为了加深印象,我们今天整几道反转链表得经典题目,废话不多说,直接开整目录1.反转链表2.链表内指定区间反转3.链表的回文结构牛客链接BM1 反转链表反转链表可以说是比较经典的题目了,而且代码和思维都比较简单这里我们采用最朴素的方法,直接在原链表的头节点处进行头插,就可以对链表进行反转了注意:这里要注意头插完之后要对原头节点的next域置空,否则的话节点将形成环我们用这样的四个节点的链表来举例我们要对这个链表进行反转,也就是得到如下的链表 这样我们就可以考虑使用头插法,把2先头插
2022-07-10 22:04:08
295
3
原创 Java继承和多态
目录1.继承1.1继承的概念1.2继承的语法1.3继承的作用1.4super的作用②当子类和父类中的方法重名时③子类构造方法④this和super的比较1.5练习小题2.多态2.1多态的概念2.2实现多态的条件2.3多态的实现2.4向上转型2.5动态绑定2.6多态的优缺点2.7注意事项继承是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加新功能,这样产生新的类,称派生类。继承呈现了面向对象程序设计的层次结构, 体现了 由简单到复杂的认知过程。这里的cat
2022-06-30 21:08:44
434
原创 从C到JAVA(类和对象)【3】
目录1.static成员1.1static修饰变量1.2static修饰方法1.3static成员变量的初始化2.代码块2.1普通代码块2.2构造代码块2.3静态代码块3.内部类3.1实例内部类内部类对象的创建3.2静态内部类静态内部类对象的创建3.3局部内部类3.4匿名内部类4.对象的打印...
2022-06-23 23:15:49
86
1
原创 从C到JAVA(类和对象)【2】封装
面向对象语言的三大特征就是:继承,多态,封装这里我们说一下封装封装的意思就是对实现细节的隐藏,我们的操作方法时使用对应的访问限定符java里面一共有这些限定符,我们这里主要讲一下public和privatepublic是...
2022-05-21 20:00:49
160
1
原创 从C到JAVA(类和对象)【1】
在java和C的区别主要就是面向对象和面向过程的语言的区别,这里我们来讲一下类和对象1.什么是面向对象就好比我要洗衣服,那么面向过程的时候,就相当于我们传统的用手搓衣服,每一个过程都需要我自己去执行,而面向对象就是我买了一个洗衣机,我只需要把我的衣服放到洗衣机里面,剩下的就交给洗衣机来完成,这就是面向对象2.类类是什么?类是用来实例化对象,那对象是什么?对象就是我们生活中的实例化,就好比我们上面的我的洗衣机,就是一个对象,然后我们需要一个创造洗衣机的工厂,他们就叫做类类的定义
2022-05-21 19:45:10
147
原创 从C到JAVA(数组)
我们在学完C之后想要学习一个面向对象的语言,我选择了JAVA,我会从C的基础上写一些我在学习时的感悟与理解,仅供参考,大佬请指教在JAVA中很多东西和C都时一样的,我就不过多阐述,前面基本一致的可以翻阅课本啥的看看就很容易理解了,这里我们从数组开始1.JAVA中数组的定义在JAVA中我们定义数组的方式和C不一样,我们是用int[] array;上面的格式进行定义的,和C语言中的中括号位置不同,其他的可以一样理解2.JAVA中数组的初始化在JAVA中我们数组的初始化有3种方法,这
2022-05-09 22:48:44
317
原创 C语言实战项目【3】简易扫雷
在学习C语言的二维数组之后,我们就有能力做一个简单的扫雷游戏了还是老规矩,分析思路1.最开始要给玩家选择是进入游戏还是退出游戏,所以给一个目录,这里我做出来的是这样的2.这里我们需要先对棋盘进行初始化我就选择把li然后需要棋盘棋盘还是比较容易的,我做了一个,可以作为参考,如果你们有更好的也可以用更好的我这里把给玩家操作的棋盘进行了一个小优化,给行列加上了头,然后里面的字符给了*2.又因为需要对比有没有雷,所以我选择创建两个数组,一个用来埋雷,一个给用户使用,这样就可以
2022-04-10 15:47:20
3689
原创 大概了解一下我们写C的时候编译器在做什么
我们在写完一段代码之后,就编译,执行,那我们有没有想过,编译器是怎么让我们写的代码变成可执行程序的呢?1.预编译首先编译器会先将我们的代码进行预编译,那这一步到底在干什么呢?编译器会把我们的注释全部给删掉,毕竟注释是给人看的,编译器又看不懂还要把#define定义的那些符号,全部给你改掉,包括宏定义的符号,也会在这一步全部都替换掉然后编译器还会把我们#include包含的头文件全部都加进去,然后预编译相当于是告一段落2.编译在进行完准备工作之后,编译器会进行编译,编译会干什么呢?
2022-04-09 14:27:24
1076
原创 C语言动态内存管理和柔性数组
1.动态内存管理为什么要存在动态内存分配?有时候我们需要的空间大小在程序运行的时候才能知道, 那数组的编译时开辟空间的方式就不能满足了。 这时候就只能试试动态存开辟了。 1.1mallocmalloc是C语言动态开辟空间的函数,但是没有初始化的功能用一段代码来举例子 ptr = (int*)malloc(num*sizeof(int));这段代码的意思是给num开辟一个大小位num*int的一个空间,并且把其实地址赋值给指针ptr详细解读一下malloc(n.
2022-04-04 16:02:05
511
3
原创 那些进阶的C语言函数
目录1.字符串的进阶函数2.内存的进阶函数1.字符串的进阶函数我们知道了字符串有strlen,strcpy,strcmp函数其实我们看C语言库就知道还有很多函数,这里我就大概的介绍几种1.1strnlenstrtokmemset...
2022-03-26 16:49:31
1016
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人