- 博客(35)
- 收藏
- 关注
原创 Map和Set
Map和Set也是Java标准库的集合类,能够快速进行。Map和Set是接口实际的实现类,有两种风格:核心思路就是“二叉搜索树”(特殊的二叉树)接下来就看看二叉搜索树。
2026-09-19 20:47:17
148
原创 网络层-IP协议
值得注意的是,这些手段是不和NAT冲突的,本质上都是借用其他的带有公网IP的设备进行转发。它就描述了网络号的范围,是当前网络划分的方式,也是一个32位的整数,左半部分都是1,右半部分都是0,不会出现1 0交错的情况。,标识传输层使用哪种协议。在分用的时候,IP协议解析IP数据报的时候,拿到载荷,交给上层处理(比如:TCP/UDP),此处8位协议编号,就能起到区分的效果。值得注意的是,不是带有公网IP的就一定触发NAT,得看本来的源IP是不是私网IP,如果已经是公网IP了,经过其他的公网IP也就不必转换了。
2026-09-18 12:13:06
218
原创 网络原理-UDP和TCP
有两种方法:1 约定包和包之间的分隔符(包的结束标记)echonserver 采用的办法,约定\n作为结束标记这回直接往后read,读到\n,就认为读完了一个数据包2 约定包的长度比如约定每个包开头几个字节,来表示数据包一共多长先读4个字节,得到长度,再根据长度的值,决定接下来读多少先读3,然后读aaa,这是一个完整的数据包。再读4,然后读bbbb,这也是一个完整的数据包……如果是43aaa,后面应该就是43个a。长度写了43,实际a不足以43,相当于应用层代码有bug。
2026-09-17 20:54:34
215
原创 网络原理-HTTPS
HTTPS = HTTP + S(SSL/TLS),其中SSL是一个应用层协议,专门来负责加密的,而TLS是SSL的升级版关于HTTPS,首先得知道加密,加密是为了保证数据安全。数据在明文传输时,很容易被劫持,那就需要对数据进行加密,通过密文来传输。明文加密就得到密文,密文解密就得到明文,在加密,解密的过程中,有一个非常重要的东西,那就是:密钥接下来,就来了解一下密钥。
2026-09-14 20:44:02
153
原创 网络原理-HTTP
a)首行:请求方法 URL 版本号(比如:GET https://www.sogou.com/ HTTP/1.1)b)请求头(header):键值对结构,每一行是一个键值对,键和值之间使用 :空格 来分割,HTTP请求头中的键有哪些取值,对应的值就有哪些取值,都是由标准约定的c)空行:用来标识header结束了d)正文(body):有些请求有正文,有些请求没有正文描述了响应结果是正确的还是错误的,以及出错的原因。状态码有很多,我们只掌握几个常见的就可以了1)200 OK。
2026-09-13 18:37:10
336
原创 网络初识(Java)
发展到现在,我们大概经历了:单机时代 -> 局域网时代 -> 广域网时代 -> 移动互联网时代组建网络需要两个核心的设备:1)路由器:要想上网,机器就需要连网线,但是太多就容易乱,所以就有了路由器。路由器上是有很多网络插口的,把很多机器,设备连接到同一个路由器上,就在同一个局域网中了。要想组建更大的网络,就把路由器连接更多的路由器2)交换机:可以视为“对路由器的接口进行了扩展”,但是不会组建局域网。如果不够用,还可以连接更多交换机,引入更多的插口。
2026-09-13 09:05:05
186
原创 多线程(5)
wait 和 notify,等待和通知,是用来可以让后执行的逻辑等待先执行的逻辑先跑。虽然无法直接干预调度器的调度顺序,但是可以让后执行的逻辑(线程)等待,等待到先执行的逻辑跑完了,通知一下当前的线程,让他继续执行。那join也是等,它和wait有什么区别呢???join是等另一个线程彻底执行完,才继续走。而wait是等到另一个线程执行notify,才继续走,不需要另一个线程执行完。
2026-09-04 09:46:45
159
原创 多线程(4)
上一篇我们已经知道了synchronized加锁来解决线程安全问题(修改操作不是原子的),synchronized修饰普通方法相当于给this进行加锁,synchronized修饰静态方法相当于给类对象加锁。synchronized-监视器锁 monitor lock:JVM中采用的一个术语,使用锁的过程中抛出一些异常,可能会看到监视器锁这样的报错信息。
2026-09-03 22:06:53
196
原创 多线程(2)
lambda是回调函数,它的执行时机是很久之后(操作系统真正创建出线程之后,才会执行),很有可能,后续线程创建好了,但是当前main的方法执行完了,isFinished销毁了。为了解决上述的问题,Java把被捕获的变量给拷贝一份,拷贝给lambda里面,所以外面的变量是否销毁,就不会影响lambda里面的执行了。但是,Thread对象的生命周期和系统中的线程的生命周期是不同的(可能存在Thread对象还存活,但是系统中的线程已经销毁的情况)。比如我们写了一个项目,有很多代码,很多文件,很多类,很多逻辑……
2026-09-02 17:50:38
218
原创 mysql-索引2
也称为聚集索引或聚簇索引当一个表定义一个主键时,会自动创建索引,索引的值是主键列的值,innoDB就使用它作为聚集索引这里推荐为每一个表定义一个主键,如果没有逻辑上唯一且非空的列或列集可以作为主键,则需要添加一个自增列。
2026-08-14 16:40:33
237
原创 mysql-索引1
MySql的索引是一种数据结构。它可以帮助数据库地查询、更新数据表中的数据。它类似于书籍的目录,通过指向数据行的位置,可以快速定位和访问表中的数据。那为什么使用索引呢?主要就是提升数据检索的效率刚才提到索引是一种数据结构,那它选择的是哪种数据结构呢?让我们一个一个地来看一下吧。
2026-08-12 20:40:20
522
原创 mysql-视图
比如:表中的信息有的比较关键,不想让其他人去查,就可以使用视图把想要返回的字段给创建出来,用虚拟表的方式,这个视图就不包含关键字段了。定义视图时没有指定列名的话,这时视图的列名是由结果集决定的。例如,针对⼀个复杂的多表连接查询,可以创建⼀个视图,⽤⼾只需查询视图⽽⽆需了解底层的复杂逻辑。例如,⼀个系统的⽤⼾表中,可以创建⼀个不包含 密码列视图,普通⽤⼾只能访问这个视图,⽽不能访问原始表。简单来说,视图是一个虚拟的表,是基于一个或多个基础表或其他视图查询的结果集创建的,本身是不存储数据的。
2026-08-10 18:41:51
241
原创 二叉树(Java)
所以上边的图的先序遍历结果为(这里就不写值了,直接用节点代替):a b d e g c接下来就用递归方式来实现一下先序遍历对于递归来说,它有两个要素:1)结束条件 2)对递归变量进行修改,逐渐接近结束条件代码:递归图:红色的线代表递归,绿色的线代表回溯之后的递归图就不画了,不仅篇幅大,而且显的字还小,乱,不知道大家能不能看清楚。递归这种的,大家好好画图,就能很好理解啦。运行结果:
2026-08-10 07:52:59
212
原创 常见的排序算法2
大堆的话,就把当前的最大值放到数组最后了(升序:由小到大),小堆就把当前的最小值放到数组最后(降序:由大到小)。与此同时的是,把值放到数组最后。可能会对堆的结构造成破环,所以需要继续向下调整,循环往复。这里升序排序代码:运行结果:时间复杂度:O(NlogN)空间复杂度:O(1)稳定性:不稳定(由于堆排序,最核心的操作是“建堆”,一旦建堆,原来值相同的元素,就不知道被调整到哪里了,它们之间的相对顺序,大概率就会被打破)
2026-08-09 18:09:15
264
原创 优先级队列(堆)
什么是优先级队列呢?对于普通的队列来说是先进先出的。而在实践中,经常会用到一些队列的变种,比如,优先级队列。对于优先级队列来说,它不是严格的先进先出,而是把优先级最高的元素先出。举个生活中的例子:去医院挂号排队,默认情况下,大家都是先进先出(先排队的,先看病),但是有特殊情况,比如军人优先那什么是堆呢?堆,本质上是一个特树结构特殊要求的二叉树,是实现优先级队列的核心方式堆和优先级队列之间的关系:数据结构的名称是堆,堆的主要用途就是作为带有优先级的队列刚才说堆是一个特树结构特殊要求的二叉树,特殊在哪里呢?堆
2026-08-07 19:31:06
214
原创 MySql-联合查询2(表连接查询)
自己与自己进行表连接,可以,在查询的时候可以使用where条件过滤。比如:显示所有“计算机原理成绩”比“java成绩”高的信息。
2026-08-04 20:55:14
163
原创 MySql-联合查询1(表连接查询)
那为什么要联合多个表进行查询呢?在三大范式)设计数据库时要把表进行拆分,是为了消除表中字段的依赖关系(比如部分函数依赖,传递依赖),这时会导致查出来的一条数据,对于业务来说是不完整的,那么我们就可以接下来就谈谈联合查询是MySql是如何执行的。
2026-08-04 12:28:33
192
原创 栈和队列(Java)
栈是一种数据结构,是基于线性表封装得到的,可以基于顺序表/链表实现。这里使用顺序表,一般约定顺序表头部是栈底,尾部是栈顶它涉及到三个核心操作:入栈、出栈、取栈顶元素入栈:顺序表尾插 出栈:顺序表尾删 取栈顶元素:获取到顺序表最后一个元素我们发现,后进来的元素,比如2,等到栈要删除元素的时候,2是最先被删除的,所以,可以看出,栈的特点是后进先出。栈虽然被线性表限制了,但仍然有很多的应用场景,比如当期末考试结束了,往箱子里装书。当你想要拿到最下面的书时,你得把前面的书都拿走,才能拿到。
2026-08-01 21:25:15
216
原创 SpringBoot
Spring Boot 项⽬有两个主要的⽬录:•src/main/java: Java 源代码•src/main/resources: 为静态资源或配置⽂件:◦/static:静态资源⽂件夹, ⽐如js, css, html等静态⽂件, 不需要服务器数据进⾏绑定的⻚⾯◦/templates:模版资源⽂件夹, 主要存放动态模板⽂件, ⽐如JSP, Freemarker, Thymeleaf等需要服务器动态渲染数据的⽂件•src/test/java: 测试代码源代码。
2026-07-31 21:07:02
276
原创 聚合函数以及分组查询
新建一张表,把旧表中的数据导入到新表中的语法:其中,table_name为目标表名,select为要从旧表中查出来的列例如:现在要把stu中的数据复制到stu1中注意:列名必须匹配,想复制几个列就复制几个列,是一一对应的。
2026-07-31 13:01:48
208
原创 Mysql-表设计
表设计的方法:1)从需求中获得类,类对应到数据库中的实体,实体在数据库中就表现为一张一张的表,类中的属性就对应着表中的字段(类和实体,属性和字段是不同的环境不同的称呼)2)确定类与类之间的关系:实体之间的关系分为:一对一,一对多(反过来是多对一),多对多,没有关系3)使用SQL去创建具体的表。
2026-07-29 15:45:09
223
原创 一些关于文件的小工具程序(Java)
分析题目:首先,遍历目录,但是之前学过的list和listFiles只能遍历到“儿子”,不能遍历到“孙子”。1 扫描指定目录,并找到名称中包含指定字符的所有普通文件(不包含目录),并且询问用户是否要删除文件。3 扫描指定目录,并找到名称或内容中包含指定字符的所有普通文件(不包含目录)分析题目:复制需要把文件里的每个字节都读出来,写到另一个文件中。分析题目:和第1个相比,这个得在内容中查找字符,也不用删除文件。2 进行普通文件的复制。
2026-06-08 20:55:42
42
原创 文件(Java)
当前IO流对象,read和write属于直接读写文件,效率比较低,要想提高效率:1)写代码的时候,手动创建缓冲区(byte[]),手动减少 read write次数2)使用标准库提供的“缓冲区流” BufferedStream,把InputStream之类的对象套上一层OK啦,到此结束!!!
2026-06-06 12:25:56
372
原创 多线程案例编写(线程池2+定时器)
时间到了,执行一些逻辑(类似于闹钟)Java标准库的定时器:Timerschedule:Timer中最关键的方法有两个参数:1、TimerTask(任务):正常描述任务是Runnable,在定时器这里,把Runnable给封装了一下成为了TimerTask,TimerTask的核心还是重写run方法2、delay(时间)这个代码的运行结果:会隔2000毫秒打印Hello world!
2026-06-02 14:39:35
320
原创 多线程案例编写(线程池1)
说到线程池,大家有没有想起“常量池”(字符串常量在Java程序最初创建的时候就已经准备好,等程序运行的时候,就已经加载到内存中了)呢?线程池:把线程提前创建好,放到一个地方(类似于数组),需要用的时候随时去取,用完了还回池子中。目的:让我们有线程池的原因:最初引入线程是因为频繁创建销毁进程,太慢了。随着互联网的发展,随着我们对于性能要求的更进一步,咱们现在觉得频繁创建销毁线程,开始有些不能接受了。那么为啥我们认为,直接创建线程的开销比从池子里取线程的开销大呢???
2026-05-31 13:29:18
379
原创 多线程案例编写(阻塞队列)
既然要模拟阻塞队列,就得满足阻塞队列的特性,先来满足第一个线程安全的特性代码示例:当然也可以不用this,新建一个锁对象啥的也可以接下来,就得满足阻塞队列的第二个很长的特性了,就需要使用“wait 和 join了”对于入队,代码示例:所以:对于出队,代码示例:所以:假设有若干个线程使用这个队列,要么所有的线程阻塞在put,要么所有的线程阻塞在take,不可能有一些阻塞在put,有一些阻塞在take,因为队列不可能既是满的,又是空的。
2026-05-28 17:29:40
518
原创 多线程代码案例编写(单例模式)
设计模式相当于程序员的棋谱单例模式是设计模式中非常典型、比较简单的一种设计模式,强制要求某个类在某个程序中只有(不允许new多次)单例模式很常见。
2026-05-26 17:27:41
456
原创 多线程(1)
通过多进程编程的方式,可以实现“并发编程”的效果。进程整体是一个比较“重”的概念,创建进程/销毁进程 开销比较大,尤其是频繁创建进程的时候(服务器开发)。所以为了解决问题,引入了线程(Thread),轻量级进程(创建 销毁的开销比较小)。
2026-05-14 22:28:50
481
原创 继承(Java)
总体来说,和 this的用法差不多,都可以访问成员变量和成员方法,只不过super访问的是父类。值得注意的是,Cat和Dog这两个子类一定要有区别Animal这个父类的成员变量或成员方法,就。(二)如果子类和父类存在同名成员变量的话,优先访问子类的,若想要访问父类的,用super关键字。作者感悟:我对父类的别名“基类/超类”是这样记的,父亲可以为我们的成长提供各种的帮助,是。在过程中,父亲“超累”的,所以叫做“超类”。先执行父类和子类的静态,再执行父类的实例和构造,最后执行子类的实例和构造。
2026-04-27 14:06:43
359
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅