- 博客(111)
- 问答 (29)
- 收藏
- 关注
原创 【JavaEE】一文读懂 UDP 协议原理
就要按照应用层协议解析,解析的过程会把网络传输中二进制的字节流(序列化)组装成遵守协议格式的数据(反序列化)。(这个过程好比我们网上买了一个床一般是拆散发过来的,我们用户收到后需要按照商家给的组装格式说明组装成一张完整的床)比如我们要开发外卖平台的某个功能,其实就是客户端和服务来实现,实际上就是前端和后端交换接口的设计,这个时候会开会让前端和后端都来。在介绍传输层的UDP协议之前,我们先来介绍一下应用层,因为我们工作中,大部分都是在应用层和传输层进行编程。除了可以按照应用层本身有的协议格式解析。
2025-09-28 09:51:02
324
原创 【JavaEE】网络编程套接字
注意:UDP协议本身并没有具有连接的特性,也就是客户端和服务器之间并没有保存彼此的信息(如IP和端口号), 这个时候如果说我们服务器和客户端之间要进行通信。那么就要在代码中获取对方的IP和端口(如服务器从请求数据包中获取)。才能发送到指定的服务器/客户端。2.根据请求计算响应(最关键的步骤, 这里我们写的是回显服务器就很简单,只需要重述客户端数据)进程B: 通过编程来提供它人所需网络资源。进程A:通过编程来获取所欲网络资源。3. 构造响应数据包,发给客户端。1.读取并解析客户端的请求数据包。
2025-09-22 20:15:56
806
1
原创 【JavaEE】网络原理初识
网络通信传输的数据类型可能有多种:图片,视频,文本等。同一个类型的数据,格式可能也不同,如发送一个文本字符串“你好!如何标识发送的数据是文本类型,及文本的编码格式呢?有了IP地址和端口号,可以定位到网络中唯一的一个进程,但还存在一个问题,网络通信是基于二进制0/1数据来传输,如何告诉对方发送的数据是什么样的呢?快递小哥关心相邻节点怎么送达(先送到相邻那个地点, 再送到相邻那个地点) -> 数据链路层。物理公司关心包裹是走那条路从发送地点到送达地点(比如走那条高速) -> 网络层。
2025-09-12 16:37:43
995
1
原创 【JavaEE】文件IO操作
狭义上的文件指的就是存储在硬盘空间里面的文件.广义上的文件指的就是操作系统管理资源的一种机制, 很多软硬件资源把他抽象成文件来表示.文件夹在计算机专业术语上指的是目录为什么要用文件?
2025-08-25 19:53:45
952
1
原创 【JavaEE】多线程 -- JUC常见类和线程安全的集合类
ReentrantLock是一把可重入锁. 他和synchronized这把锁的用法有些类似. 一样可以通过加锁和解锁来解决线程安全问题.
2025-08-23 18:02:21
890
原创 【JavaEE】多线程 -- CAS机制(比较并交换)
图中的场景就是t1线程想把num值改成100, 这个时候执行过程如下先读取 num 的值,记录到 oldNum 变量中;使用 CAS 判断当前 num 的值是否为 0,如果为 0 就修改成 100。
2025-08-20 19:26:29
663
原创 【JavaEE】多线程 -- 锁策略和synchronized 原理
接下来讲解的锁策略不仅仅是局限于 Java . 任何和 “锁” 相关的话题, 都可能会涉及到以下内容.这些特性主要是给锁的实现者来参考的. 我们虽然不实现锁, 但是了解这些特性可以更好的使用锁.
2025-08-20 15:21:50
1253
原创 【JavaEE】多线程 -- 阻塞队列
方案2: 我负责擀饺子皮, 小美和千均负责包饺子. 我把擀好的饺子皮放在簸箕上. 小美和千均用的时候就从簸箕上拿. 他们两个不用和我争夺擀面杖, 他们的任务是只是包饺子, 不需要擀饺子皮. 这个行为他们他们就可以不用花费很多时间等我, 因为我只是擀饺子皮, 不用包饺子. (和上个方案对比)方案1: 一个擀面杖, 我和小美和千均. 在桌子上谁先拿到擀面杖, 就先做出一个饺子皮. 让后包饺子. 所以我们三个要。阻塞队列的⼀个典型应⽤场景就是 “⽣产者消费者模型”. 这是⼀种⾮常典型的开发模型.
2025-08-18 16:31:48
814
1
原创 【JavaEE】多线程 -- 单例模式
设计模式好⽐象棋中的 “棋谱”. 红⽅当头炮, ⿊⽅⻢来跳. 针对红⽅的⼀些⾛法, ⿊⽅应招的时候有⼀ 些固定的套路. 按照套路来⾛局势就不会吃亏.软件开发中也有很多常⻅的 “问题场景”. 针对这些问题场景, ⼤佬们总结出了⼀些固定的套路. 按照这 个套路来实现代码, 也不会吃亏.
2025-08-17 16:32:24
803
原创 【JavaEE】多线程 -- 线程等待wait和notify
我们在使用 wait() 方法的大前提是必须在 synchaonized(加锁) 的状态下(因为我们wait方法要做的第一件事情解释解锁),如果在没有加锁的代码块中使用 wait() 方法就会抛出 “IllegalMonitorStateException”异常。3.当通知到达后, 从阻塞状态回到就绪状态, 并且重新获取到锁.notify 只唤醒等待队列中的⼀个线程. 其他线程还是乖乖等着。notifyAll ⼀下全都唤醒, 需要这些线程重新竞争锁。2.等待其他线程的通知(当前线程进入阻塞状态)
2025-08-16 13:40:08
623
1
原创 【JavaEE】多线程 -- 死锁问题
Java多线程中的死锁问题是指两个或多个线程互相持有对方所需的资源而无法继续执行的情况。这种情况下,线程无法释放已经占有的资源,也无法获取自己所需的资源,导致程序无法继续执行下去。前面两个条件是synchronized特性我们不能改变, 只能尝试改变请求和保持, 循环等待这两个条件. 这2个条件只要打破一个, 我们就可以破除死锁.
2025-08-15 21:49:02
876
1
原创 【JavaEE】多线程 -- 线程安全
synchronized 修饰普通方法时,锁的是当前对象的方法,等价于 synchronized (this)synchronized 修饰静态方法时,锁的是所有对象的方法,等价于 synchronized (类名.class)无论synchronized对那个对象加锁, 都不重要,重要的是对同一个对象加锁, 这样才会产生锁竞争。
2025-08-15 16:25:58
1064
原创 【JavaEE】多线程 -- 线程状态
这边千均等待的时候,小美给阿杰回了消息,说室友有空,晚上可以一起去看电影,阿杰收到消息后(忽略初始的心理准备),重新调整状态,准备晚上的约会安排(阿杰获得继续追求的条件,到了晚上,阿杰和小美以及她的室友一起看完电影,可小美说 “我和室友一起走就行,你先回去吧,明天再说”,此时阿杰知道要等明天才有机会,千均和小美聊得不错,想约她下周去看画展,小美说下周要准备考试,得考完试才行,大概一周后有空,此时千均线程陷入了。第二天,阿杰联系小美时,发现小美正在忙社团活动,没回消息,阿杰只能等着她忙完(
2025-08-14 17:10:45
611
原创 【JavaEE】多线程 -- 初识线程
加上 break 的作用:在执行 sleep 的过程中,调用 interrupt,大概率 sleep 休眠时间还没到,就被提前唤醒了提前唤醒,会做两件事:通过 interrupt 方法,已经把标志位设为 true 了但是 sleep 提前唤醒操作,就把标位又设回 false(此时循环还是会继续执行了)要想线程结束,只需要在 catch 中加上 break 就行了//获取当前线程的引用while(!cur.isInterrupted()){ //Thread类内部设置了一个boolean变量。
2025-08-14 09:14:53
1211
原创 【MySQL】事务的基本概念
不可重复读就是假设有事务A, 事务B, 事务C, 事务A把数据修改后, 提交了. 事务C读取第一次是事务A修改后的数据, 事务B又把同一个数据修改了. 提交了. 这个时候事务C第二次读取同一个数据读取到的就是事务B修改后的数据. 结果事务C两次读取同一个数据, 都不一样. 这就是不可重复读.这个隔离级别就是完全解决了幻读的问题, 我们幻读之所以导致结果集不一样, 根本原因就是事务A和事务B同时开启, 事务B同一时刻插入了数据.这个隔离级别, 只能一个事务执行完了, 另一个事务才能执行。
2025-08-09 16:42:01
1019
1
原创 【MySQL】初识索引
因为我们数据库读取硬盘中的数据至少要读取一页, 页里面我们上面说了, 可能存储若干个数据行. 这个又因为我们有一个叫局部性原理的东西: 根据经验如果我们读取了硬盘中的一部分数据, 那么他旁边的数据我们也可能会读取. 那么使用页就会把旁边的一部分数据也存在同一个页中, 这个时候我们把这旁边的数据也读取出来了, 我们就不需要再去硬盘读取那部分数据了. 减少了硬盘的IO次数.这里我们要进行查找40 - 60之间的数据, 这时候我们找到40的右分支, 找到43, 48. 这个时候我们又要。
2025-08-08 16:36:31
873
原创 【Linux】进程优先级和切换调度
问题1:如何理解权限和优先级权限是这个事情能不能做,比如我们现在能不能吃饭。关注的是能还是不能,而优先级则是什么时候轮到我们吃饭,关注的是什么时候到我们吃饭,隐含了我们已经有了吃饭的权限。优先级的意义就是对于资源的访问谁先谁后(cpu资源分配的先后顺序,就是指进程的优先权)问题2 :为什么要有进程优先级因为目标资源稀缺,需要优先级来确认先分配给谁后分配给谁。问题3:操作系统是怎么做到进程优先级的?
2025-06-14 16:46:33
1007
原创 【Linux】进程状态
是不是很方便啊,因为这个类在程序运行中一直存在,那么我们在Linux中描述信息的task_struct也可以在回收的时候缓存在一个数据结构对象的链表中,如果我再次需要这个task_struct信息的对象,我们就可以直接从链表中拿出来实例化,不需要重新写一个task_struct。那种进程最怕内存泄露,常驻内存的进程,比如操作系统,,他一直不退出,为啥一直不退出,因为操作系统要管理软件和硬件这些啊,除非是系统关机了才退出,如果他发生内存泄露,那么就会问题很大。ps aux / ps axj 命令。
2025-05-21 15:39:57
2240
46
原创 【Linux】进程的基本概念
这个时候你会发现,if和else if居然在同时运行这是为啥呢?在我们写过的程序中,怎么可能同时满足if又满足else if, 接下来我们就要对于这个现象进行剖析。
2025-05-18 16:23:08
2558
50
原创 【数据结构】手撕AVL树(万字详解)
我们这里直接实现KV模型的AVL树,为了方便后续的操作,这里将AVL树中的结点定义为三叉链结构(也就是多了一个parent,为什么后面讲解),并在每个结点当中引入平衡因子(右子树高度-左子树高度除此之外,还需编写一个构造新结点的构造函数,由于新构造结点的左右子树均为空树,于是将新构造结点的平衡因子初始设置为0即可。//三叉链//存储的键值对//平衡因子(balance factor)int _bf;//右子树高度-左子树高度//构造函数, _kv(kv), _bf(0){}
2025-05-16 15:09:42
2186
48
原创 【Linux】冯诺依曼体系结构和操作系统的理解
举个例子,现在校长要求辅导员将计算机成绩排名前十的学生的各科资料以及平时表现记录拿过来,他将从这十名同学之中选出三名学生参加本次的编程大赛,当辅导员将资料拿来后校长选出三名学生说:“就这三个了,你找个老师对这三名学生进行一下强化训练,然后参加本次的编程大赛。”然后校长就什么也不管了。那如果我们想把问题交给计算机处理,我们就需要一个输入设备把我们问题所需要的数据和信息交给计算机,然后我们需要计算机给出我们处理的结果,就需要一个叫做输出设备的东西来让计算机把结果显示出来(比如显示器)补充知识:高内聚和低耦合。
2025-05-10 15:18:57
2800
53
原创 【数据结构】手撕二叉搜索树
析构函数完成对象中二叉搜索树结点的释放,注意释放时采用后序释放,当二叉搜索树中的结点被释放完后,将对象当中指向二叉搜索树的指针及时置空即可。如此进行下去,直到找到与待插入结点的值相同的结点判定为插入失败,或者最终插入到某叶子结点的左右子树当中(即空树当中)。⼆叉搜索树⼜称⼆叉排序树,它或者是⼀棵空树,或者是具有以下性质的⼆叉树。待删除的两个节点都不为空。待删除结点的左子树为空。
2025-05-07 15:22:16
2281
54
原创 【Linux】gdb工具,Linux 下程序调试的 “透视眼”
until + 行号 —— 进行指定位置跳转,执行完区间代码 finish —— 在一个函数内部,执行到当前函数返回,然后停下来等待命令。d(delete) + 当前要删除断点的编号 —— 删除一个断点【不可以d + 行号】disable b(breakpoint) + 编号 —— 使一个断点无效【禁用断点】c(continue) —— 从一个断点处,直接运行至下一个断点处【VS下不断按F5】enable b(breakpoint) + 编号 —— 使一个断点有效【开启断点】
2025-04-25 20:10:30
2531
53
原创 【Linux】自动化构建,有Make就够了
在上一讲中,我们介绍了Linux下的编译器 - gcc/g++的使用,本节我们来介绍一下如何使用make/Makefile实现项目的自动化构建知道了如何在Linux上编译C语言代码,而且清楚了可执行文件a.out的由来,是从test.c经过预编译到test.itest.i经过编译到test.stest.s经过汇编到test.otest.o经过链接到a.out可是看着这些操作,如果说我们只编译一个文件还可以说过去,如果说要编译100个,1000个,1w个呢?
2025-04-22 21:57:50
3157
53
原创 【C++】深入浅出之多态
多态是指不同继承关系的类对象,去调用同一函数,产生了不同的行为。必须通过基类的指针或者引用调用虚函数。被调用的函数必须是虚函数,且派生类必须对基类的虚函数进行重写。1.这里派生类的指针去调用public继承下来的基类函数test, 那么test里面又去调用func, this(A*,j基类)指针调用func, 那么这里满足多态吗?多态两个条件(1):要实现多态效果,第⼀必须是基类的指针或引⽤,因为只有基类的指针或引⽤才能既指向基类对象也可以指向派⽣类对象(切片);
2025-04-20 20:08:11
1881
39
原创 【C++】深入浅出之继承
继承的概念继承(inheritance)机制是面向对象程序设计使代码可以复用的重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能,这样产生新的类,称为派生类。继承呈现了面向对象程序设计的层次结构,体现了由简单到复杂的认知过程。以前我们接触的复用都是函数复用,而继承便是类设计层次的复用。例如,以下代码中Student类和Teacher类就继承了Person类。//父类public:protected:string _name = "张三";//姓名//年龄//子类。
2025-04-17 21:06:31
1321
30
原创 【C++】特化妙技与分文件编写 “雷区”
通俗一点,声明就是一个承诺,我现在要结婚买房了,但是钱还差5w,这时候你想起你的好哥们,让他借你5w,你哥们说好,我过几天就给你打过来(声明),这时候你就要等5天后去找他(链接);这就是模板的特性造成无法确定类型,又恰好因为没确定类型,后面单向操作导致test.i有定义不知道初始化什么类型,a.i有类型缺无法实例化。你哥们太关心你了,知道你还差钱,早偷偷的就把钱打给你了,这时候你还需要5天后去找他(链接)吗。使用非类型模板参数后,我们就可以在实例化对象的时候指定所要创建的静态数组的大小了。
2025-04-17 10:40:44
1131
23
原创 【C++】priority_queue的底层封装和实现
priority_queue的介绍优先级队列默认使用vector作为其底层存储数据的容器,在vector上又使用了堆算法将vector中的元素构造成堆的结构,因此priority_queue就是堆,所有需要用到堆的位置,都可以考虑使用priority_queue。注意: 默认情况下priority_queue是大堆。
2025-04-17 09:01:38
1073
14
原创 【C++】Stack和Queue的底层封装和实现
Stack可以封装成前面三个变量的形式,但是这里我们提出一个概念叫容器适配器,回归我们生活中的适配器,比如电源适配器,就是把电流转换成对应w数的,如67w,120w,而容器适配器简单来说就是复用已有的容器,在他的基础上改成完理想容器的特性和功能,就把旧容器转化成了一个新容器。2.对于list,尾插的时候,如果要大量插入数据,则需要一个一个的去开空间,而deque通过buffer这个机制,一下开出很多空间,避免了频繁开空间,对于系统来说开一个空间和开一块空间的效率是一样的,假设每个buffer的长度是10。
2025-04-16 09:21:39
1136
20
原创 【Linux】Linux下的gcc/g++编译器与动静态库
1.可以看到,其实对于从网吧中拿来的电脑,就是库中的那个函数,也就是将库中的整个函数直接放到你的程序中来,这样你完全不需要再到库中去调用函数了,直接在你的程序中使用即可。那这么来说你的学长就相当于是一个链接器,网吧就是一个动态库,你知道了动态库中所需要的这个函数的地址,然后你就顺藤摸瓜🍈地找到了这个地方,你的学长就做了一个链接的功能。3.但是你怎么知道这个库函数在哪里的呢?2.当你的同学去到黑网吧,然后得知被封了之后无奈返回后,这个时候你有这自己的电脑,完全不需要再去考虑是否有电脑可用的安全性了,
2025-04-14 23:07:01
1911
20
原创 【Linux】VIM 编辑器,编辑加速引擎
正常/普通/命令模式【Normal mode】控制屏幕光标的移动,字符、字或行的删除,移动复制某区段及进入Insert mode下,或者到 last line mode。在此模式下无法进行代码编辑插入模式【Insert mode】只有在Insert mode下,才可以做文字输入,按「ESC」键可回到命令行模式。该模式是我们后面用的最频繁的编辑模式末行模式【Last line mode】文件保存或退出,也可以进行文件替换,找字符串,列出行号等操作。在命令模式下,shift+: 即可进入该模式。
2025-04-14 20:35:57
1572
12
原创 【Linux】Linux 权限:数字背后的神秘 “门禁卡” 系统
所以我们到提权到root的根目录下创建目录共享,但是却发现我们创建目录的文件居然会被other删除,是因为目录中的文件修改删除操作是由目录的w权限决定了,也就是目录是三体人,文件是普通人,普通人的生死由三体人决定,这时候如果把目录的other角色的w权限关闭,共享文件的用户也不能对目录中的共享文件进行修改了,这时候我们就不能这样暴力解决,在目录的other角色的权限中加一个粘滞位t,里面的共享文件除了文件拥有者和root账号以外都不能删除。说明:将现有的存取权限减去权限掩码后,即可产生建立文件时预设权限。
2025-04-10 19:03:48
1322
7
原创 【C++】list底层封装和实现
或许很多人有疑问,为啥list迭代器还要单独实现一个类来解决,而vector和string就可以直接写出来。我们先来回顾一下vector的迭代器可以看到我们不管是删除还是插入操作,如果我们想要找到下一个数据的地址,只需要简单的++或者–就行了,这就是原生指针,我们开辟空间的时候是开辟一块连续的空间但是对于链表,我们是一个节点一个节点的开空间,这样开出来的空间位置是随机的是不连续的,这时候我们再想要通过简单的++或者–就找到数据就不可能了。
2025-04-09 23:54:51
1597
10
原创 【C++】 string底层封装的模拟实现
或许有的兄弟会有疑问,为什么初始化_str的时候,开辟_str的空间要用 new char[1]而不是new char,这是因为我们string的数据存储都是连续存储在一起的,用\0标识结束位置,如果用new char那么单独在各个不连续的空间并不能让每个数据后面都有\0,所以我们new char[]连续的空间,存储在一起,在这块连续的空间后放上\0。因为我们接下来实现的类和和库中std命名空间的string类的类名相同,所以我们为了防止冲突,用一个bit命名的命名空间解决这个问题。
2025-03-30 21:16:36
464
1
原创 【C++】内存管理
看完了使用new/delete如何去操作C++中的【内置类型】,接下去我们来看看我们要如何去操作一个自定义类型首先我们来看看C语言中我们是如何去操作自定义类型的,下面有一个单链表的结构体,此时我们若是要构建出一个个链表结点的话,还需要去调用下面这个函数,很是麻烦int val;exit(-1);但如果用C++的话就不一样了,我们可以使用之前所学习过的构造函数初始化列表在开辟出空间的时候就做一个初始化的工作,做到事半而功倍int val;: val(x){}
2024-09-20 23:16:30
1223
2
空空如也
编程实现循环代码。.
2021-11-29
关于自定义头文件的问题
2021-11-21
关于打印替换字符的问题
2021-11-13
关于变量新来旧去规则
2021-11-11
关于结构体返回问题.
2021-11-11
关于for循环工作过程问题
2021-11-04
眼睛都看痛了,不知道怎么输出那个相加的数
2021-11-04
关于自定义函数问题。
2021-11-07
按要求写出正确的逻辑表达式
2021-10-28
关于代码问题.?!。
2021-10-01
关于后辈的前途道路疑问的问题
2021-10-10
关于ASCll码字符型运算问题和复合运算符问题
2021-10-20
关于c语言代码书写格式的问题
2021-10-18
关于刚刚接触c语言数组的问题
2021-10-17
关于代码的错误问题.
2021-09-20
c语言新小白第一次写代码问题
2021-09-11
关于换行符的问题求解决
2021-09-11
小白入坑c语言的问题
2021-09-10
关于c语言自增运算符的问题
2023-11-03
关于C语言双字符串组合问题
2023-07-20
关于结构体访问问题.
2023-05-06
关于变量与自身自减的比较问题
2023-04-04
关于C语言逻辑与的断路特性问题
2023-03-12
关于C语言阶乘问题。,
2022-10-21
关于C语言数据类型转换的问题
2022-08-26
一道关于c语言编程问题
2022-04-30
关于printf函数格式输出%%d的问题
2022-04-04
数学表达式转c语言表达式
2022-04-03
c语言练习题望解答。
2022-03-09
mac os操作系统下vs code 编译器c语言头文件无法打开问题
2022-02-14
关于qsort库函数排序问题
2022-01-21
关于辗转相除法的过程
2022-01-03
关于break语句的问题
2021-12-11
关于函数被不明引用问题
2021-12-05
关于c语言LNK2019问题
2021-12-10
执行代码后无缘无故出现的数字
2021-12-04
TA创建的收藏夹 TA关注的收藏夹
TA关注的人