自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(33)
  • 收藏
  • 关注

原创 java网络原理(四)----tcp特性

滑动窗口:可以提高传输效率,准确的来说是让tcp在可靠传输的前提下,效率不要太拉胯。使用滑动窗口不能使tcp变的比UDP块,但能减少差距。前面谈过tcp的传输数据的时,会把数据进行编号,每次传固定的长度。比如主机A给主机B发信息,信息经过应用层后到传输层,tcp会把应用层发来的信息通过每个字节进行编号,假设编号为1到3000,tcp会批量传输编号内容。设主机A第一次传输编号为1到1000的内容。主机B收到给A返回确认应答后,主机A才能接着发1001到2000的数据。

2024-03-26 17:41:13 1199

原创 java网络原理(三)----三次握手四次挥手

三次握手是建立连接的过程,四次挥手是断开连接的过程,三次握手发生在socket.accept()之前。客户端和服务器尝试建立连接的时候服务器就会和客户端进行一系列的数据交换称为握手,这个过程建立完了后,连接就好了。A和B完成建立连接的过程需要3次打招呼的数据交互。

2024-03-22 21:55:15 656

原创 java网络原理(二)------TCP确认应答和超时重传

TCP,即Transmission Control Protocol,传输控制协议。人如其名,要对数据的传输进行一个详细的控制。

2024-03-22 19:54:27 1044

原创 java----网络编程(一)

用户在浏览器中,打开在线视频网站,如优酷看视频,实质是通过网络,获取到网络上的一个视频资源。与本地打开视频文件类似,只是视频文件这个资源的来源是网络。所谓网络资源就是网络中获取数据。而所有的网络资源,都是通过网络编程来进行数据传输的。网络编程,指网络上的主机,通过不同的进程,以编程的方式实现网络通信(或称为网络数据传输)。当然,我们只要满足进程不同就行;所以即便是同一个主机,只要是不同进程,基于网络来传输数据,也属于网络编程。

2024-03-17 21:27:20 934

原创 java---网络初始

随着时代的发展,越来越需要计算机之间互相通信,共享软件和数据,即以多个计算机协同工作来完成业务,就有了网络互连。网络互连:将多台计算机连接在一起,完成数据共享。数据共享本质是网络数据传输,即计算机之间通过网络来传输数据,也称为网络通信。根据网络互连的规模不同,可以划分为局域网和广域网。局域网,即 Local Area Network,简称LAN。Local 即标识了局域网是本地,局部组建的一种私有网络。局域网内的主机之间能方便的进行网络通信,又称为内网;

2024-03-14 00:06:44 842

原创 java多线程面试题(三)-----HashTable,HashMap,ConcurrentHashMap

Hashtable是JAVA中依靠哈希表来实现的,学习数据结构的时候我们已经知道哈希表是基于数组加链表去实现的。哈希表最重要的是扩容机制和哈希冲突,当负载因子大于0.75时会触发扩容机制。哈希冲突是多个数通过哈希函数映射到同一位置。为了解决哈希冲突会在数组上挂一个链表,往链表上去插入元素。HashMap底层是依靠这种原理来实现的,是数组加链表加红黑树。

2024-03-12 20:02:43 888

原创 java多线程编程------CAS

在JDK1.之前,java的多线程都是靠synchronized来保证同步的,这会引发很多性能问题,例如死锁。但随着Java的不断完善,JNI使得java能越过JVM直接调用本地方法,例如CAS。CAS ,它用于实现多线程同步的原子指令,允许算法执行读-修改-写的操作,而无须担心其他线程同时修改变量。

2024-03-11 20:15:06 876

原创 java多线程面试题(一)

自旋锁:是轻量级锁的一种典型实现,在用户态下,通过自旋的方式(while循环),实现类似于加锁的效果。挂起等待锁:是重量级锁的一种典型实现,通过内核态,借助系统提供的锁机制,当出现锁冲突的时候,会牵扯到内核对于线程的调度,使线程出现挂起(阻塞等待)。自旋锁相当于追女孩子时,发现追的女孩子有男朋友了(锁被占用了),任然每天给这个女孩子发早安晚安,这样就可以在她分手的第一时间发现,并且抓住机会。这种锁会消耗一定的cpu资源,但是可以最快拿到锁。

2024-03-07 16:02:16 871

原创 java多线程编程(四)-----线程池

java中的池是非常重要的思想方法,比如内存池,进程池,连接池,常量池等等。本篇重点介绍java中的线程池。这里的这些池的概念都是一样的,比如做饭的时候,有烧水,切菜,炒菜等流程,如果等水烧开再去炒菜,切菜效率会很慢,但是可以烧水的同时去切菜,炒菜,效率大幅提升。如果我们需要频繁的创造和销毁线程,此时创建和销毁线程的成本就不能忽视了,因此可以使用线程池。提前创建好一波线程,后续需要用线程只需要从线程池中拿,线程用完后继续放到池子里面。思考一下为什么从池子里面取,就比从系统中创建线程更快更高效呢?

2024-03-05 19:30:23 823

原创 java多线程编程(三)----生产者消费者模型

front说明队列为空。放入元素的时候先判满,满了不能放,然后tail位置上放入元素,让tail走到下一个位置。比如第一次0号下标放入“hello”注意一定不能写tail++,队列元素已满的时候,再次++会越界,加1取模会让tail在次回到头节点,从而循环起来。同理删除元素也让头节点++。注意也不能直接++,必须取模,其条件为 front = (front + 1) % length;有了前置知识,那么我们首先实现一个循环队列。

2024-03-03 12:26:37 1038

原创 java多线程编程(二)----单例模式

单例模式是一种设计模式,就比如下棋的时候对于高手来说,每个人都会很多种棋谱,在比赛中按照棋谱的套路灵活应用,见招拆招。java中的设计模式就和棋谱一样,程序员按照棋谱来写代码能够保证下限。设计模式有很多种,之前有个大佬写了一本书有23种设计模式,不同的语言有不同的设计模式。对于新手来说最主要的是理解2种设计模式,单例模式和工产模式。

2024-02-28 21:16:07 815

原创 java线程安全(第一篇)

线程安全问题根本原因:1.多个线程之间的调度是随机的,操作系统抢占式的执行策略来调度线程.2.多个线程同时修改同一变量。3.进行的修改不是原子的。4.内存可见性5.指令重排性,引起的线程安全问题。

2024-02-26 15:57:21 791

原创 java线程的中断-interrupted,isinterrupted

线程中断在多线程开发中非常重要。中断线程意味着在线程结束前停止当前的操作。停止线程有许多好处。比如资源的释放,当一个线程完成了任务时,停止该线程可以释放资源。错误处理,如果某个程序发生了错误,停止线程可以防止错误蔓延。性能够优化。停止不必要的线程可以提高程序的性能等。

2024-02-25 10:51:03 965

原创 java多线程的创建

1一个程序正在运行的时候最少有一个进程,比如我们经常见到的public static void main(),他是由jvm去创建的。进程具有并发执行的特点,线程是进程的“轻量级”表现。也就是说不同的线程也可以同时执行。所以在一个程序中不单单只能有一个线程去执行代码,也可以有多个线程同时去执行。多线程编程可以提高程序的并发性,提高资源的利用率,适应复杂的业务逻辑等优点。所以掌握多线程编程是很重要的。java给我们提供了实现多线程的方式,继承Thread类或实现Runnable接口。

2024-02-24 19:28:28 861

原创 Map和Set-java

set.add("花木兰");set.add("公孙离");set.add("亚瑟");set.add("露娜");set.remove("亚瑟");Set是继承自Collection的一个接口类2. Set中只存储了key,并且要求key一定要唯一TreeSet的底层是使用Map来实现的,其使用key与Object的一个默认对象作为键值对插入到Map中的Set最大的功能就是对集合中的元素进行去重。

2023-10-26 22:10:22 59

原创 优先级队列(PriorityQueue)-java

如果有一个关键码的集合K = {k0,k1, k2,…,kn-1},把它的所有元素按完全二叉树的顺序存储方式存储 在一个一维数组中,并满足:Ki <= K2i+1 且 Ki<= K2i+2 (Ki >= K2i+1 且 Ki >= K2i+2) i = 0,1,2…,则称为 小堆(或大堆)。将根节点最大的堆叫做最大堆或大根堆,根节点最小的堆叫做最小堆或小根堆。

2023-10-24 18:17:29 144

原创 数据结构链表-java

单链表只有一个指向其后续的域,使得单链表只能从前到后依次遍历,要访问某个结点的前驱结点(插入、删除操作时),只能从头开始遍历,访问后继结点的时间复杂度为O(1),访问前驱结点的时间复杂度为0(n)。为了一服单链表的上述缺点,引入了双链表,双链表结点中有两个域prev和next域,分别别指向其前驱结点和后继结点。双链表在单链表的结点中增加了一个指向其前驱prev,因此双链表中的按值查找和按位查找的操作与单链表的相同。但双链表在插入和删除操作的实现上,与单链表有着较大的不同。

2023-07-18 15:05:17 176 1

原创 顺序表的实现-java

线性表的顺序存储又称顺序表。它是用一组地址连续的存储单元依次存储线性表中的数据元从而使得逻辑上相邻的两个元素在物理位置上也相邻。第1个元素存储在线性表的起始位置,元素的存储位置后面紧接着存储的是第i+1个元素,称i为元素a,在线顺序表的特点是表中元素的逻辑顺序与其物理顺序相同。//数组的大小 public int size;//数组的有效元素的个数 public static final int capacity = 10;//数组容量 public Seqlist() {

2023-07-11 01:07:40 85 1

原创 单链表---c 语言B版

线性表的链式存储又称为单链表,它是指通过一组任意的存储单元来存储线性表中的数据元素。为了建立数据元素之间的线性关系,对每个链表节点,除存放自身的信息外,还需要存放一个指向其后继的指针。}SLTNode;单链表的data是用来保存数据的,我们对data重命名这样当我们需要保存不同类型的数据时候便于修改,同时单链表也需要定义一个指针去存储下一个结点的地址。

2023-03-15 23:57:22 56

原创 顺序表----c语言实现

线性表的顺序存储又称顺序表。它是用一组地址连续的存储单元依次存储线性表中的数据元素,从而使逻辑是相邻的二个元素在物理位置上也相邻。第1个元素存储在线性表的起始位置,第i个元素的存储位置后面紧接着存储的是第i+1个元素,称i为元素Ai在线性表的位序。因此,顺序表的特点是表中元素的逻辑顺序与物理顺序相同。//用来指向开辟的空间int size;//当前存储数据的个数//容量的大小}SL;

2023-03-13 22:10:26 84

原创 字符函数和字符串函数2

上述代码把前16个字节拷贝arr2数组里面去,memcpy的拷贝是一个字节一个字节拷贝的,如果拷贝14个字节,那么结果也是2,3,5,6。因为是小端存放,当拷贝12个字节后也就是3个整形,第4个整形也就是第13,14,15,16字节时,其计算机的存储是06,00,00,00。思路:memove的模拟实现要分2种情况,从前拷贝和从后拷贝,没有重叠的从前拷贝和从后拷贝都可以。memcpy和么move的区别为memcpy拷贝的内存是不能重叠的,memmove拷贝的内存可以重叠。情况二:从后向前拷贝。

2023-01-29 17:39:21 63

原创 字符函数和字符串函数1

注意:size_t返回的一直是个正数,如果2个字符串长度相减,前者大于后者,那么在无符号数的计算中负数只能当成正数处理,会是一个很大的正数。字符串以“\0”为结束标志,strlen统计"\0"以前的字符串个数,该函数的返回值是size_t类型的。到一个字符串中查找另一个字符串,如果查到返回地址,查不到返回空指针。第一个字符串大于第二个字符串返回大于0的数字。第一个字符串小于第二个字符串返回小于0的数字。第一个字符串等于第二个字符串返回等于0的数字。会将源字符的\0拷贝到目标空间。源字符串必须以\0结束。

2023-01-28 11:12:17 72

原创 c语言qsort函数

用冒泡排序实现qsort函数

2023-01-07 17:10:37 151

原创 c语言——扫雷

它的基本规则是随便点一个小格子,就会出现一个小方块。上面显示的数字意味着周围的八个格子里会有几个地雷。例如,1表示周围只有一个矿。右键单击可以标记该网格,左键单击可以打开该网格。扫雷规则是:首先点击顶部的一个小格子,会出现一个小方块。上面显示的数字代表了周围八个网格中的几个矿。只需要判断地雷植旗。找到所有地雷就是胜利。

2022-11-13 14:55:14 104

原创 c语言-五子棋实现

容易上手,老少皆宜,而且趣味横生,引人入胜;不仅能增强思维能力,提高智力,而且富含哲理,有助于修身养性。已在各个游戏平台有应用。

2022-11-08 16:17:34 282

原创 程序员内功修炼——函数栈帧的创建与销毁

c语言是由函数构成的,那么函数是如何进行传参的?如何调用的?如何返回值的?这些问题与函数的栈帧有关。

2022-11-04 13:00:23 802

原创 初识指针和结构体

内存是电脑的存储空间,计算机中程序的运行是在内存中进行的。所以为了有效的使用内存,就把内存划分为一个小小的内存单元,每个内存单元的大小是一个字节。为了能够有效的访问到内存的每个单元,就给内存单元进行了编号,这些编号被称为地址。那内存的地址是怎么产生的呢?我们以32位机器为例,32位机器就有32个地址线产生高电频和地电频,我们记高电频为数字1,低电频为数字0,二个组合起来就能产生2的32次方种组合,我们把这些组合叫为内存的地址。我们大概知道了内存的布局接下来思考变量的内存是怎么存放的。

2022-10-23 00:14:22 121

原创 初识c语言之static关键字

全局变量的生命周期是整个工程。当我们跨文件调用一个全局变量的时候,只需要用关键字extern就能实现(上一篇博客介绍了extern和全局变量局部变量的生命周期)。如果在局部变量的前面加上static,那么程序会有怎样的改变。代码的运行结果显示“无法解释外部符号a”,

2022-10-20 19:56:07 270

原创 初始c语言之常量和变量

适合初学者对c语言的了解。

2022-10-16 17:50:24 223

原创 JavaSE中的类和对象

当调用构造方法的时候会先进入上述代码中第一个不带参数的构造方法中,接着碰到了this会寻找一个类中的另一个构造方法(第二个构造方法),第二个构造方法又碰到了this进入第一个构造方法,这样造成死循环。注意:1:this只能在成员方法中使用 2.只能引用当前对象,不能引用其他对象 3.编译器会将调试该成员的对象引用传递给该方法,this负责接收。在构造方法的时候名字必须于类名相同,在创建对象的时候,由编译器自动调用,整个对象的生命周期只有一次。在静态的方法中不能访问非静态的变量和方法。...

2022-08-04 20:44:11 115

原创 指针进阶

一.函数指针数组 1概念: 数组是一个存放相同类型数据的存储空间,把函数地址存放在一个数组中,那么这个数组叫做函数指针数组。其语法为 int(*parr1[10]();通过前面的课程的学习,我们已经掌握了函数指针的用途,要想在此基础上理解函数指针数组,必须从函数指针来进行拓展,下面有一例函数指针的用途,试试看你有没有更好的方法对下面例子进行改进。 很明显上述代码看起来不太简洁,试着优化一下代码使其看起来简单明了。在选择加减乘除代码中可以放在一个函数中进行运行。

2022-06-29 15:09:45 66

原创 初始c语言操作符

提示:本篇文章主要是对c语言零基础的人说明,只是大概说每个操作符的用法,具体用法原理以后说明。c语言的操作符c语言是非常灵活的,其具有非常丰富的操作符,使得用起来就比较灵活。要想掌握c语言的操作符,其难度还是很大的。下面让我们来先学习c语言中的单目操作符。单目操作符中“!”表示逻辑反操作,你可以这样理解,如果一个事件本身为真,那么!表示为假。(c语言中0代表假,非0表示为真)。int main(){ int flag = 0;if(!flag){ printf("hehe

2022-04-09 21:27:42 888

原创 c语言中的printf函数和scanf的区别

--printf函数在c语言中的普通用法在c语言中printf函数的作用非常大,用途也非常广泛,它主要具有打印功能。在调用printf函数是必须给其提供格式串,格式串后面的参数是需要在显示时插入到该串中的值。其主要的语法格式为: printf(“格式串”,表达式1,表达式2);在使用该函数时其字数没有限制,显示的值可以是变量,常量,或者更加复杂的表达式。下面让我们看看如下代码,思考其函数的值int main(){int a,b;float c;a = 78;b=...

2022-04-03 17:59:05 2947

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除