- 博客(29)
- 收藏
- 关注
原创 JVM的简单介绍
为什么要划分区域,因为JVM Java虚拟机是仿照真实的机器,真实的操作系统进行设计的,真实的操作系统中,对于进程的地址空间是进行了分区域的设计,JVM也就仿照了操作系统的情况,也进行了分区域的设计。
2025-03-08 15:35:14
903
原创 网络原理----TCP/IP(4)
1.数据链路层• 数据链路层的作⽤:两个设备(同⼀种数据链路节点)之间进⾏传递数据• 以太⽹是⼀种技术标准;既包含了数据链路层的内容,也包含了⼀些物理层的内容.例如:规定了⽹络 拓扑结构,访问控制⽅式,传输速率等;• 以太⽹帧格式• 理解mac地址• 理解arp协议• 理解MTU2.⽹络层• ⽹络层的作⽤:在复杂的⽹络环境中确定⼀个合适的路径.• 理解IP地址,理解IP地址和MAC地址的区别.• 理解IP协议格式.• 了解⽹段划分⽅法。
2025-03-03 12:45:00
591
原创 网络原理----TCP/IP(3)
默认情况下,接收方都是在收到数据报的第一时间,就返回ack,但是可以通过延时返回ack的方式来提高效率,理论上不是100%提高效率,但还是有一定帮助的。因为如果接收数据的主机⽴刻返回ACK应答,这时候返回的窗⼝可能⽐较⼩.那么所有的包都可以延迟应答么?肯定也不是;• 数量限制:每隔N个包就应答⼀次;• 时间限制:超过最⼤延迟时间就应答⼀次;具体的数量和超时时间,依操作系统不同也有差异;⼀般N取2,超时时间取200ms(这个数值不固定,根据实际情况而定);
2025-03-02 15:23:55
741
原创 网络原理--TCP/IP(2)
• MSL是TCP报⽂的最⼤⽣存时间,因此TIME_WAIT持续存在2MSL的话,就能保证在两个传输⽅向上的尚未被接收或迟到的报⽂段都已经消失(否则服务器⽴刻重启,可能会 收到来⾃上⼀个进程的迟到的数据,但是这种数据很可能是错误的);• 同时也是在理论上保证最后⼀个报⽂可靠到达(假设最后⼀个ACK丢失,那么服务器会再重发⼀个 FIN.这时虽然客⼾端的进程不在了,但是TCP连接还在,仍然可以重发LAST_ACK);
2025-03-01 11:59:35
1222
原创 网络原理---TCP/IP
这是一个以写作博客为目的的创作活动,旨在鼓励大学生博主们挖掘自己的创作潜能,展现自己的写作才华。如果你是一位热爱写作的、想要展现自己创作才华的小伙伴,那么,快来参加吧!我们一起发掘写作的魅力,书写出属于我们的故事。我们诚挚邀请你参加为期14天的创作挑战赛!
2025-02-27 14:43:58
930
2
原创 网络原理---HTTP/HTTPS
URL基本格式:协议名称,URL不是HTTP专属的概念,可以给各种协议提供支持。:要访问的服务器的IP地址或域名,域名和IP可以相互转换,这个过程通过DNS域名解析系统来完成的(DNS即是一套服务器系统,也是一种应用层协议)。:端口号,区分哪个应用程序。:带有层次结构的路径,想要访问的是,某个主机上某个程序管理的某个资源(某个资源可以是一个硬盘上的文件,也可以是虚拟的资源)。
2025-02-25 21:04:31
2666
1
原创 Map和Set
相关说明:1.Map是一个接口,不能直接实例化对象,如果要实例化对象只能实例化其实现类TreeMap或者HashMap。2. Map中存放键值对的Key是唯一的,value是可以重复的。3.在TreeMap中插入键值对时,key不能为空,否则就会抛NullPointerException异常,value可以为空。但 是HashMap的key和value都可以为空。4. Map中的Key可以全部分离出来,存储到Set中来进行访问(因为Key不能重复)。
2025-02-25 20:43:20
773
原创 Map和Set相关OJ题
基本思路:根据题目要求,其中的英文字母只输出大写,所以我们可以先把所有的字符串全都转换成大写,然后把实际输出的字符串放在一个集合中,遍历输入的字符串,如果该字符串中包含集合中未有的元素,则输出,还要注意题目中要求每个坏键只输出一次。基本思路:这个问题可以联想到之前介绍的top-k的问题,把前k个元素建立小跟堆,将剩下的元素与小跟堆的堆顶元素比较,直到所有的元素都遍历完,前k个元素就是我们所要求的。指针也都应指向复制链表中的新节点,并使原链表和复制链表中的这些指针能够表示相同的链表状态。
2024-11-30 21:00:53
1539
原创 二叉搜索树
对有n个结点的二叉搜索树,若每个元素查找的概率相等,则二叉搜索树平均查找长度是结点在二叉搜索树的深度 的函数,即结点越深,则比较次数越多。3).cur不是root,cur是parent.right,则parent.right=cur.right;2).cur不是root,cur是parent.right,则parent.right=cur.left;2).cur不是root,cur是parent.left,则parent.left=cur.right.1)cur是root,root=cur.right.
2024-11-25 18:54:19
774
原创 常见排序算法
排序:所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作。稳定性:假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次序保持 不变,即在原序列中,r[i]=r[j],且r[i]在r[j]之前,而在排序后的序列中,r[i]仍在r[j]之前,则称这种排序算法是稳 定的;否则称为不稳定的。内部排序:数据元素全部放在内存中的排序。外部排序:数据元素太多不能同时放在内存中,根据排序过程的要求不能在内外存之间移动数据的排序。
2024-11-24 14:42:14
1885
原创 优先级队列
前面介绍过队列,队列是一种先进先出(FIFO)的数据结构,但有些情况下,操作的数据可能带有优先级,一般出队 列时,可能需要优先级高的元素先出队列,该中场景下,使用队列显然不合适。2.对象的比较:有些情况下,需要比较的是对象中的内容,比如:向优先级队列中插入某个对象时,需要对按照对象中内容来调整 堆,那该如何处理呢?利用堆的思想来排序,分为两步:1.建堆:升序,建大堆;堆的插入分为两步:1. 先将元素放入到底层空间中(注意:空间不够时需要扩容) 2. 将最后新插入的节点向上调整,直到满足堆的性质。
2024-11-20 12:43:24
551
原创 网络编程套接字2
在这里clientSocket的生命周期是伴随一次连接的,每个客户端连接,都会创建一个新的;Socket是客户端Socket,或服务端中接收到客⼾端建⽴连接(accept⽅法)的请求后,返回的服 务端Socket(服务器和客户端都可以用)。创建socket对象就会在底层和对端建立TCP连接,及记录了对端的信息(服务器的IP和端口),不需要自己在创建变量保存了,直接TCP内部就保存了。暗含一个约定,一个请求/响应,使用\n作为结束标记,对端读的时候,也是读到\n就结束(认为读到一个完整的请求)。
2024-11-14 14:43:02
478
原创 树和二叉树
2.如果相同,则判断左子树的左树与右子树的右树轴对称&&左子树的右树与右子树的左树轴对称。:二叉搜索树是一种特殊的二叉树,它的每个节点值大于它的左子节点,且大于全部左子树的节点值,小于它右子节点,且小于全部右子树的节点值。遍历当前每个树的节点,求每个节点左树和右树的高度,如果二者之间的差值>2,则返回false&&root的左树是平衡的&&root的右树是平衡的。树的叶子结点=左子树的叶子结点+右子树的叶子结点。2. 若规定只有根结点的二叉树的深度为1,则深度为K的二叉树的最大结点数是 (k>=0)
2024-11-14 12:09:19
687
原创 栈和队列-----队列
1.概念:队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出FIFO(First In First Out) 入队列:进行插入操作的一端称为队尾(Tail/Rear) 出队列:进行删除操作的一端称为队头 (Head/Front)。模拟队列的出队操作:1.判断第二个栈是不是空的,如果是空的,需要把第一个栈中的所有元素都放到第二个栈中,取出第二个栈中的栈顶元素。2.模拟出栈操作是:把不为空的队列中的size-1个元素放到另一个队列中去。//双端队列的线性实现。
2024-11-10 13:00:27
885
原创 栈和队列------栈
逆波兰表达式也被称为后缀表达式,我们把中缀表达式转化为后缀表达式来计算其值,我们用一个栈来模拟后缀表达式的计算方法,当我们遇到数字时,就进栈,遇到操作符,便出栈(第一出栈的数放在运算符的右边,第二个在左边),计算的结果在入栈,直到遍历完所有的字符。栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。创建一个栈,用一个变量i遍历这些符号,如果是左括号就入栈,遍历到对应的右括号时便出栈,直到所有的符号全都遍历完。压栈:栈的插入操作叫做进栈/压栈/入栈,入数据在栈顶。出栈:栈的删除操作叫做出栈。
2024-11-08 21:02:32
350
原创 JAVA实现双向链表
4.A r r a y L i s t 和 L i n k e d L i s t 的 区 别。以上都是我们自己手动实现双链表,接下来简单介绍一下LinkedList。这里对于size()、display()方法不在赘述,同单链表一样。这里需要考虑是从头删,还是从尾删,以及普通位置删除。2.LinkedList的使用。3.LinkedList的遍历。5.删除所有值为key的数值。3.在指定位置插入数据。4.删除指定的key。6.删除链表中的所有值。这里只列举一些常用的。
2024-11-07 18:57:14
414
原创 JAVA实现单链表
其实这里的头节点并非真正的头,他只是一个引用,总是指向链表第一个对象,这个头并没有一个真正属于自己的对象。在有头链表中,第一个节点前会加一个节点,其next指向第一个节点对象,而其val并不存储元素,这个头是不可改变的,是一个固定的对象。链表是一种物理存储结构上非连续存储结构,数据元素的逻辑顺序是通过链表中的引用链接次序实现的。创建一个findIndexOfkey方法,找到指定节点的前一个节点,让他指向后一个节点。遍历到链表的尾节点,将其next指向 新节点,要注意链表为空时的情况。
2024-11-05 20:43:57
825
原创 网络编程套接字1
计算机中的文件通常是一个广义上的概念,文件还能代替一些硬件设备(操作系统管理硬件设备,也是抽象成文件,统一管理的),电脑中的网卡就可以抽象成socket文件,我们操作网卡的过程和操作普通文件差不多,直接操作网卡不好操作,把网卡转换成操作socket文件,socket文件就相当于“网卡的遥控器”这里的连接是抽象的概念,虚拟的/逻辑上的连接。对于TCP来说,TCP协议中,就保存了对端的信息,A和B通信,A和B先建立连接,让A保存B的信息,B保存A的信息(彼此之间知道,谁是和它建立连接的那个),这就是有链接;
2024-11-05 14:25:11
814
原创 网络原理----初识
主机的数据=>路由器(路由器是工作在网络层):路由器收到之后,物理层,数据链路层、网络层解析,重新构造出新的网络数据包,构造出以太网数据帧,构造出二进制数据,进行转发。3.传输层数据构造好之后,继续调用网络层的api,把传输层的数据包交给网络层,网络层继续进行处理,网络层最重要的协议,IP协议,IP协议继续对上述数据包进行加工,拼上IP报头。但真实情况不太一样,真实的路由器交换机,功能更丰富,更强大,现代的交换机,很多都有路由器的功能,路由器也可以开启特殊的模式,就可以起到交换机的效果,甚至更多的功能。
2024-11-03 18:03:30
1748
原创 文件操作和IO
因此在进行IO流对象的时候,就把要写的数据,先放到缓冲区里,攒一攒,在一起写,或者读的时候,一次读一批数据,在放到缓冲区慢慢解析。:即使是普通⽂件,根据其保存数据的不同,也经常被分为不同的类型,我们⼀般简单的划分为⽂本⽂ 件和⼆进制⽂件,分别指代保存被字符集编码的⽂本和按照标准格式保存的⾮被字符集编码过的⽂件。说明:对于 OutputStream来说,默认情况下会尝试创建不存在的文件,是会清除上次的文件内容,打开文件的一瞬间,上次的文件就清空了。总结:流对象的使用流程:先打开,在读写,最后关闭;
2024-10-31 19:07:34
878
原创 JUC(java.util.concurrent)的常⻅类
使用多线程,经常把一个大的任务拆分成多个子任务,使用多线程执行这些子任务,从而提高执行效率,那么如何衡量,这多个子任务都完成了呢?想象去吃⿇辣烫.当餐点好后,后厨就开始做了.同时前台会给你⼀张"⼩票".这个⼩票就是FutureTask.后⾯我们可以随时凭这张⼩票去查看⾃⼰的这份⿇辣烫做出来了没.信号量,⽤来表⽰"可⽤资源的个数",本质上就是⼀个计数器.申请一个资源,计数器-1(P操作);计数器为0,继续申请,就会阻塞等待。加锁成功,返回true,加锁失败,返回false,调用者判定返回值,决定接下来咋做;
2024-10-28 17:08:21
632
原创 CAS的运行机制
即使上述代码中出现线程切换,由于在进行自增之前,先判定当前寄存器读到的值是否是“科学得值”,如果不是科学的值,就会重新读取,另一方面,赋值和判断是原子的一个指令完成的,无法构造出这样的调度顺序,把赋值和判断中间加入其他线程的逻辑。这里本质上是在判定是否有其他的线程插入进来,做了一些修改,如果发现这里寄存器和内存的值一致,就可以认为是没有线程穿插过来修改,因此接下来的修改操作就是线程安全的。像++、--这样的针对内置类型的操作,都是非原子的;针对原子类,则是原子的,基于CAS实现,不涉及到加锁。
2024-10-27 19:09:53
879
原创 常见的锁策略
如果获取锁失败,⽴即再尝试获取锁,⽆限循环,直到获取到锁为⽌.第⼀次获取锁失败第⼆次的尝试 会在极短的时间内到来.⼀旦锁被其他线程释放,就能第⼀时间获取到锁. 相⽐于挂起等待锁,优点:没有放弃CPU资源,⼀旦锁被释放就能第⼀时间获取到锁,更⾼效.在锁持有时间⽐较短的场景 下⾮常有⽤. 缺点:如果锁的持有时间较⻓,就会浪费CPU资源.所以读写锁因此⽽产⽣。锁的粒度,加锁和解锁之间,包含的代码越多(不是指代码行数,指的是实际执行指令/时间),就认为锁的粒度就越粗,如果包含的代码越少,就认为锁的粒度就越细。
2024-10-25 21:10:45
518
原创 多线程案列-------定时器
分布式系统,有很多服务器.如果只是一个类意味着所有的服务器都需要执行这一套同样的逻辑,比较复杂.如果进行调整所有的都改. 提取出来,独立的服务器,大家都去调用.如果未来有升级调整也便于分配给这个定时任务服务器单独的硬件资源~~4.额外创建一个线程,负责执行队列中的任务(和线程池不同,线程池是只要队列不为空,就立即取任务并执行,此处需要看队首元素的时间,时间到,才能执行,时间不到,不能执行)由于定时器,是一个非常重要的组件,在分布式系统中,把定时器专门提取出来,封装成一个单独的服务器(和消息队列是很像)
2024-10-24 17:45:18
732
原创 多线程的应用---线程池
什么是线程池?我们都知道什么是常量池,比如,字符串常量,在java程序最初构建的时候,就已经准备好了,等程序运行的时候,这样的常量也就加载到内从中了。那我们为什么要创建线程池,因为平凡的创建销毁线程开销过大,而线程池最大的好处就是减少每次启动,销毁线程的损坏。为什么我们认为,直接创建线程开销比从池子里取线程更大呢?操作系统的 用户态和 内核态一个操作系统=内核+配套的应用程序内核包含操作系统的各种核心功能1)管理硬件设备2)给软件提供稳定的运行环境。
2024-10-23 15:33:27
995
原创 多线程案列——阻塞队列
那什么是生产者消费者模型,举个例子我和我妈在家包饺子,我妈负责擀饺子皮,我负责包饺子,包好的饺子放在面板上,在这个过程中,资源就是饺子皮,我妈就是生产者,我就是消费者,而面板是生产消费的交易场所,在此处的交易场所就是一个阻塞队列。阻塞队列,其实是一种更为特殊的队列,也遵循“先进先出”的原则。如果A直接访问B,此时A和B的耦合就高,编写A的代码时,多少会有一些和B相关的逻辑,同样,对B来说也是一样。此时加入一个队列,本来是A和B耦合,现在变成了A和队列耦合,B和队列耦合,降低了耦合,后续修改,成本会降低。
2024-10-21 18:23:58
858
原创 多线程案例----单列模式
上面说过,懒汉模式是第一次使用的时候需要创建实例,后面的使用就不要创建实例了,但是上述代码每次获取instance都要进行加锁操作,而加锁操作是非常消耗资源的,其实只需要在第一次创建出对象之前加锁,其他时候是没有必要的,所以这里在加锁时,可以给代码加上一个判定,判定instance是否为空,为空创建加锁,不为空直接返回instance。),是设计模式中一种非常典型的模式。与“饿汉模式一样”,“懒汉”也是形象描述的,与“饿汉”在类加载就创建实例不同,“懒汉”’是在第一次需要的时候才创建实例。
2024-10-19 16:30:31
723
原创 类与对象+继承多态
静态代码块:在类加载的时候被执行。如果出现多个静态代码块,都是静态下,和定义顺序有关。上面这个代码便是继承的简单应用,其中Dog是子类,Animal是父类。当父类和子类有同名的成员变量的时候,优先访问子类的。2.静态的属于类,不属于对象,不依赖于对象。2.非静态代码块3.实例代码块4.构造代码块。为什么需要继承,继承的意义是什么?1.通过对象的引用调用。
2024-05-14 18:51:47
190
1
原创 C语言的分支和循环语句
2.switch语句。对自己学习内容的一些感悟和体会。2.1.switch语句的结构。2.2 switch的使用。输出1~100之间的奇数。
2023-12-01 19:32:54
377
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人