- 博客(51)
- 收藏
- 关注
原创 HTTP请求方法:GET与POST的深度解析
用来在客户端保存数据最为主要的是保存用户的身份标识,服务器就可以通过标识来区分用户了一些其他的业务数据一般不会存储在 cookie中cookie 随时可以删除掉,把业务数据存储在服务器,通过 cookie 中的身份标识找到对应的数据浏览器的另一个保存机制,一般账号密码不会在 cookie 中保存,cookie 是要传输给服务器的一般浏览器保存的密码都是明文密码,明文密码放到 cookie 是不合适虽然 https 能加密,https 侧重于是“不能被篡改”,而不是“不能被解密”
2025-08-17 20:14:35
638
原创 TCP与UDP:如何选择最佳传输协议
打开一个网站,浏览器和服务器之间进行的 HTTP 交互不是只有一次,通常有很多次,第一次交互拿到这个页面的 html,html 还会依赖其他的 css 和 js,图片等,html 被浏览器加载之后,又会触发一些其他的 http 请求,获取到 css,js等,当执行js 的时候,js 代码里可能又要触发很多的http请求,获取到一些数据。数据报中包含了“目的 IP” 字段,就是要问路的目标,每个路由器都对于网络环境(和他相邻的设备情况)有一定了解的,此时,就可以根据它的了解告诉我们下一步往哪个方向走。
2025-08-10 10:44:58
966
原创 TCP与UDP校验算法详解及可靠性机制
一般情况下 CLOSE_WAIT不太容易观察到代码中会比较快速的关闭 socket,这个时候,状态就从 CLOSE_WAIT -> LAST_ACKTIME_WAIT 存在的意义,主要防止最后一个 ACK 丢包服务器如果没有收到最后一个 ACK,就会重传 FIN客户端如果在这个环节,把TCP连接释放掉,此时意味着重传的 FIN 就无法被返回 ACK 了(保存对端信息的数据结构存在,才能给这个连接提供各种操作,才能返回 ACK)
2025-08-10 10:44:51
1041
原创 Java并发编程:Callable与ReentrantLock实战解析
1. 继承 Thread(包含匿名内部类)2.实现 Runnable(包含匿名内部类)3.基于 lambda4.基于 CallableRunnable 关注的是这个过程,不关注执行结果Callable 要关注执行结果Callable 提供的 call 方法,返回值就是线程执行任务得到的结果当我们要想获得结果,就得专门创建一个成员变量,保存计算结果。如果使用Callable 就可以避免引入额外的成员变量了。
2025-07-09 05:35:53
944
原创 深入解析synchronized锁升级机制
核心思想“懒汉模式”,只有真正用到的时候才会去加锁,会做一个非常轻量的标记,只有在与其他锁竞争时才会去加锁,偏向锁就会升级到轻量级锁。在遇到竞争时不会提高效率,但当没有遇到竞争时就会大大的提高效率。
2025-07-09 01:07:14
1041
原创 阻塞队列:线程安全与生产者消费者模型解析
如果针对一个已经满了的队列进行入队列,此时入队列操作就会阻塞,一直阻塞到队列不满(其他线程出队列元素)之后如果针对一个已经空了的队列进行出队列,此时出队列操作就会阻塞,一直阻塞到队列不空(其他线程入队列元素)之后。
2025-05-19 22:58:31
951
原创 线程调度与单例模式:wait、notify与懒汉模式解析
引入 wait notify 就是为了能够从应用层面,干预到多个不同线程代码的执行顺序,可以让后执行的线程主动放弃被调度的机会,等先执行的线程完成后通知放弃调度的线程重新执行。
2025-05-19 15:24:51
1475
原创 Java线程终止与死锁:强制操作的风险与应对
在java中,线程的终止,是一种“软性”操作,必须要对应的线程配合,才能把终止落实下去然而,系统原生的api其实还提供了,强制终止线程的操作,无论线程执行到哪,都能强行把这个线程干掉。这样的操作Java的api中没有提供的,上述的做法弊大于利,强行取结束一个线程,很可能线程执行到一半,会出现一些残留的临时性质的“错误”数据。我们将变量isQuit作为main方法中的局部变量。
2025-05-11 23:05:30
954
原创 揭秘冯诺依曼体系与现代计算机的运作奥秘
现代的计算机,带动遵循冯诺依曼体系。cpu中央处理器:进行算术运算和逻辑判断存储器:分为内存和外存,用于存储数据。
2025-05-08 19:57:35
832
原创 深度解析数据库查询优化与事务管理
对于B树来说查询速度往往是不稳定的,因为如果查询的元素层数高的话就很快,反之,对于B+树来说最终都会在叶子节点来进行查询整体时间差距不大,是稳定的。
2025-05-04 02:07:08
1102
原创 二叉搜索树:高效查找与动态插入详解
二叉搜索树又叫二叉排序树,其特性就是,它的根节点的左子树所有的结点都小于根节点,右子树所有结点都大于根结点,除过左/右子树为空。
2025-04-22 15:00:37
1092
原创 深入解析排序算法:从概念到实现
排序:对一组数据进行从小到大/从大到小的排序稳定性:即使进行排序相对位置也不受影响如:如果再排序后 L 在 i 的前面则稳定性差,像图中这样就是稳定性好。
2025-04-16 23:46:26
914
原创 优先级队列:高效管理最大最小值的利器
队列是一种先进先出的结构,在一些特殊的情况下,我们需要队列返回的可能不只是第一个那么简单,而是队列中最大或者最小的,这就需要用到优先级队列了。优先级队列这种数据结构能够提供:返回最高优先级对象,添加新对象两种方法。
2025-04-16 14:12:12
740
原创 深入解析栈与队列:从基础到实现
队列是一种在一端插入另一端删除的特殊线性表,其特点是先进先出。进行尾删,头添。队列中a作为第一个放入的元素出去的时候是第一个,元素b作为最后一个进入出去也是第一个。
2025-04-14 12:44:54
896
原创 单向链表:实现与操作全解析
对于链表我们有很多种,有带头和不带头,双向和单项,循环和不循环。我们实现的单向链表是不带头单向不循环链表。链表不比顺序表,它可以连续也可以不连续,是链子型的每条链子两边都有节点(除首尾)。
2025-03-16 22:21:19
593
原创 顺序表的优势与实现全解析
首先线性表要通过数组来存储数据,其次呢,为了能够得知数组现在的有效数据是多少,我们得设置一个变量来记录,然后呢,既然是数组就得有个默认的起始空间。这样我们的工作就完成了。在删除数据前我们得先看看数据是否合法,就是数据是否存在,所以我们就实现了方法一,包含方法 ,之后我们就会找到该数据,然后进行覆盖操作。接下来就可以实现方法了,我们要先进行增删查改,首先我们得先解决一下如果空间不够的话,我们得申请一个足够的空间,一般是之前空间的二倍。在这里提供了两种选择,一种是,默认的数组大小,一种是自己设定的大小。
2025-03-16 19:52:25
221
原创 揭秘Java装箱拆箱与泛型的神奇机制
这里的T代表这是一个泛型类,可以看到在经过我们改造后的代码,变得不能存储多种类型的数据了,这里我们再声明字符串类型后,后续设置整形,直接报错,这就是泛型的检查作用,使得当前同期只能存储特定的类型。我们发现泛型可以存储不同类型的数据,但在get方法中我们得进行一个强制类型转换,一般情况下我们使用泛型是为了指定当前容器为特定的数据类型,用泛型来做检查,为什么呢?我们发现对于i有一个取值范围,也就是最大值和最小值,而他的存储方式就是再一个数组中存储,这个数组的大小就是low+high+1,在存储数据时是这样的。
2025-03-15 23:15:42
763
原创 时间复杂度与空间复杂度:程序效率的关键
我们发现程序执行的次数是一个等差数列,所以我们用到了等差数列的求和公式,再根据大O推到得出时间复杂度为O(N^2);衡量一个程序好坏的标准,除了能处理各种异常,还有就是时间效率,当然,对于一些配置好的电脑数据处理起来就是比配置低的高,但从后期发展来看,当数据量足够庞大时,对于时间效率的作用就显得十分重要了。在计算时间复杂度时我们会优先忽略掉对整体影响不大的值,如该运行次数中的3,我们将其忽略,另外因为n平方为指数函数,相比于n这个常函数,指数函数能更好的表达时间复杂度,所以我们将其忽略。
2025-03-15 18:24:34
334
原创 Javase总结
经过将近一个月的学习我已经了解了Java的基础语法,从c语言过渡到javase,我感到Javase语法跟c语言还是有许多相似,所以在学习起来并没有像刚开始学习c语言一样困难。同时我的代码风格也变得更好看了,相比于学习c语言阶段,我在学习Javase的时候一直都在注意自己写代码的风格,开始注意到空格的重要性。从基础数据类型到数组再到类的使用,这其中有很多值得我去记忆的地方,如重载与重写的区别,还有String类不能修改的原因,还有许许多多的面试题都是需要我加强记忆去理解。
2025-03-10 19:46:00
141
原创 深入解析Java字符串构造与不可变性
我们发现Sting类被final修饰并且不能继承,并且返现变量value被private修饰这表明,修改字符串并不能实现,而String是引用类型,表面上的修改字符串实际只是修改引用对象,真正不能修改的是String类。我们发现与上个方法输出值不同,该方法因为不忽略大小写的区别所以根据长度和asm表大小比较并返回差值,回到方法内部。在equals中我们发现s6和s8返回true,我们发现两者的防止内容相同但对象却不同。我们通过控制台发现该方法返回值是整数,我们回到方法代码。该方法是返回改位置对应的字符。
2025-03-07 23:49:51
247
原创 java接口(2)
Java有一个接口叫做comparator它里面的方法叫做comparato,该方法是让参数方法与当前对象进行比较。我们在学生类中将其进行了重写,用来满足我们的需求。我们设计了比较年龄和名字大小的方法,在这之中又调用了Comparable接口中的comparaTo方法。这种方法使用于同一种数据类型来比较大小返回两者的整型差值。如果是字母则是比较两者的asm值。
2025-03-06 13:54:50
723
原创 java接口(1)
将class替换成了interface,而需要注意的是在成员变量不加任何修饰关键字时,默认为 pubilc static final,而方法默认为 pubilc abstruct。子类与父类之间用extend,而接口和类之间用implement,父类和子类不能多继承,而类可以多接口。5.重写接口方法是不能使用默认的访问符,因为接口的是pubilc,权限必须大于等于它才行。3.接口中方法只能在实现类中实现,不能再接口中实现,因为它也算是抽象类。接口是一种Java类公共规范,是一种引用类型。
2025-03-05 20:18:35
322
原创 面向对象三大特性:多态
对于多态是一个极其抽象的词,比如说动物有猫和狗,猫和狗的行为不同,这也叫多态,就是根据引用对象的不同,产生的行为也不同,这就叫多态。
2025-03-04 23:29:28
367
原创 java面向对象的三大特性:继承
在设定一些对象是他们有时候都是有一些共性的,如狗,猫,熊猫,他们都是有年龄体重和颜色的,如果不用继承的方法的话就会使得代码出现很多的重复性,如果设定一个对象:动物,将他们的共性都加到动物上去,用的时候只要利用继承便可以提高代码的复用性,提高便利性。
2025-03-04 23:16:47
596
原创 面向对象的三大特性:封装
首先要理解封装可以从生活中去了解,比如说电脑,在制造电脑时,厂家只会给客户留一个电源键,耳机孔或者usb接口,让客户可以直接理解到其功能,而不是让客户自己先去学习了解,然后再学着使用,厂家将复杂的方法给隐藏起来了,这就是封装。
2025-02-27 00:30:00
389
原创 C语言数据结构:单向链表的实现
链表是线性表的一种,它向链子一样把数据串在一起,类似于火车,所以链表是一个连着一个,如果其中有一个链子断了,那这个链子后面数据都丢失了,它并不是连续的。
2024-12-26 00:00:00
585
原创 c语言数据结构:顺序表以及实现通讯录(1)
首先呢,顺序表是线性表的一种,它的本质是数组,既然是数组说明它就是连续的,而数组呢,要考虑有效长度和总长度的问题,而且在开辟空间方面呢,就需要预先开辟足够大的空间来接收数据,这就导致了空间的浪费,这就是顺序表的大概了。
2024-12-24 00:00:00
558
原创 关于根据输入来确定数组中的值
我之后在调试的时候发现EOF是用来判断输入的数据是否全部用完的,而getchar()会在scanf读取结束后读取下一个符号,这就说明我们的结束可以用判断‘\n'的方式来完成,就是换行符,这一点只有在慢慢调试的时候才能体会到。之后我便开始运行,却发现输入的是负数时输出会为0。
2024-12-03 20:00:13
316
原创 c语言的编译与链接(浅认识)
_FILE__ //进⾏编译的源⽂件__LINE__ //⽂件当前的⾏号__DATE__ //⽂件被编译的⽇期__TIME__ //⽂件被编译的时间__STDC__ //如果编译器遵循ANSI C,其值为1,否则未定义为了以免出现一些我们所注意不到的影响我们应该多加一些括号比如说下面这种情况我们预想的是6*6,代码实现时其实是5+1*5+1.为了准确行我们应该为其加上括号来提高优先级。宏相比于函数拥有不稳定性。这样操作后程序就不认识print了,直接报错了。
2024-12-02 23:09:07
490
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人