自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 HTTPS的加密过程

目录什么是HTTPS什么是‘加密’加密的方式有哪些对称加密非对称加密总结HTTPS传输过程什么是HTTPSHTTPS与HTTP一样都是应用层协议,与HTTP不同的是:HTTP的协议内容都是按照文本方式进行明文传输的,这导致在传输过程第三方者能够轻易获取传输的内容,而HTTPS在HTTP协议基础上引入一个加密以防止传输内容泄露或被篡改。什么是‘加密’加密就是指将明文(要传输的信息)按照指定的方式进行变换,生成密文。解密就是指将密文按照指定的方式进行变换,还原成为明文。在加密和解密的过程中,一般需要

2022-05-16 17:29:28 257

原创 CSS常见选择器的用法

1.选择器的作用当我们要对某个标签元素进行操作时,必须要选中它,才能设置其属性,由此引出了选择器。2.基础选择器2.1标签选择器特点:能快速把同一类标签选择出来 不能差异化选择(如果想要操作同一个标签中的不同内容,是不可以的)<style> p { color: red; } div { color: green; } </style>

2022-04-29 16:34:13 242

原创 TCP、IP、UDP协议

TCP协议TCP,即Transmission Control Protocol,传输控制协议。人如其名,要对数据的传输进行一个详细的控制。下图为tcp协议的格式:TCP协议提供的一些机制确认应答机制每一个ACK都带有对应的确认序列号,意思是告诉发送者,我已经收到了哪些数据;下一次你从哪里开 始发。这样能确保对方能知道自己已经收到了消息。超时重传机制当然,除了会丢失ACK,也可能会丢失发送的数据包,只要没有收到确认应答,主机A都会重复发送数据包。连接管理机制在.

2022-04-18 16:52:55 1803

原创 计算机网络中的一些基本概念

IP地址概念IP地址主要用于标识网络主机、其他网络设备(如路由器)的网络地址。简单说,IP地址用于定位主机的网络地址。格式IP地址是一个32位的二进制数,通常被分割为4个“8位二进制数”(也就是4个字节),如: 01100100.00000100.00000101.00000110。通常用“点分十进制”的方式来表示,即 a.b.c.d 的形式(a,b,c,d都是0~255之间的十进制整数)。如: 100.4.5.6。端口号概念在网络通信中,IP地址用于标识主机网络地址,端口号

2022-04-18 16:10:08 2510

原创 文件操作和IO

Java中操作文件Java 中通过 java.io.File 类来对一个文件(包括目录)进行抽象的描述。注意,有 File 对象,并不 代表真实存在该文件。看看这个类的方法修饰符及返回值类型 方法签名 说明 String getParent() 返回 File 对象的父目录文件路径 String getName() 返回 FIle 对象的纯文件名称 String getPath() 返回 File 对象的文件路径 String

2022-04-18 15:52:04 227

原创 常见的锁策略

乐观锁 vs 悲观锁悲观锁:总是假设最坏的情况,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这 样别人想拿这个数据就会阻塞直到它拿到锁。乐观锁:假设数据一般情况下不会产生并发冲突,所以在数据进行提交更新的时候,才会正式对数据是否产生并 发冲突进行检测,如果发现并发冲突了,则让返回用户错误的信息,让用户决定如何去做。Synchronized 初始使用乐观锁策略. 当发现锁竞争比较频繁的时候, 就会自动切换成悲观锁策略。读写锁多线程之间,数据的读取方之间不会产

2022-04-18 10:10:19 104

原创 线程安全问题的原因和解决方案

1.线程安全的概念线程安全的确切定义是复杂的,但我们可以这样认为:如果多线程环境下代码运行的结果是符合我们预期的,即在单线程环境应该的结果,则说这个程序是线 程安全的。我们来看一段代码:public class Demo13 { static class Counter { public int count = 0; void increase() { count++; } } publi

2022-03-30 21:22:35 135

原创 Thread类的基本用法

1.创建线程方法1继承Thread类class MyThread extends Thread{ @Override public void run() { System.out.println("Thread1"); }}public class Demo1 { public static void main(String[] args) { MyThread t = new MyThread(); t.st

2022-03-26 16:13:28 804

原创 进程与线程的区别和联系

1.什么是线程一个线程就是一个 "执行流",每个线程之间都可以按照顺讯执行自己的代码,多个线程之间 "同时" 执行 着多份代码。之前说进程相当于一个任务,我们可以举一个例子来描述一下进程和线程之间的关系,我们将一个工厂称为一个进程,工厂中有很多条流水线,每条流水线都在生产一个汽车不同部位的零件,将这些流水线上的零件组合起来就能形成一辆汽车。这时候,我们可以称每一条流水线为一个线程,整个工厂为一个进程。上面的这种情况我们就称为多线程,将一个大的任务分解为多个小任务,然后分配给不同的执行流去完成。

2022-03-26 09:45:29 289

原创 进程调度的基本过程

目录1.什么是进程2.操作系统是如何管理进程的2.1.先描述一个进程2.2.将若干个进程组织起来2.3.让进程正常工作2.4.进程的调度过程1.什么是进程要知道进程的调度过程,首先我们要了解什么是进程,我们打开任务管理器,就会发现它的第一栏就是进程,如下图所示:如果我们每多打开一个软件,就会发现任务管理器进程中就回多一栏,这就是软件对应的进程,我们可以理解为一个进程就是一个任务,当关闭任务时,对应的进程就会结束。这里面的进程,有些是系统自动打开的,有些是我们

2022-03-25 22:21:08 649

原创 leetcode9:回文数

题目:给你一个整数 x ,如果 x 是一个回文整数,返回 true ;否则,返回 false 。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。例如,121 是回文,而 123 不是。示例 1:输入:x = 121输出:true示例 2:输入:x = -121输出:false解释:从左向右读, 为 -121 。 从右向左读, 为 121- 。因此它不是一个回文数。示例 3:输入:x = 10输出:false解释:从右向左读, 为 01 。因此它不是一个回文数。

2021-12-03 15:04:36 195

原创 leetcode26:删除有序数组中的重复项

题目:给你一个有序数组 nums ,请你原地删除重复出现的元素,使每个元素只出现一次,返回删除后数组的新长度。不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。示例 1:输入:nums = [1,1,2]输出:2, nums = [1,2]解释:函数应该返回新的长度 2 ,并且原数组 nums 的前两个元素被修改为 1, 2 。不需要考虑数组中超出新长度后面的元素。示例 2:输入:nums = [0,0,1,1,1,2,2,3,3,4]输出:

2021-12-03 14:57:45 173

原创 Java:异常

文章目录1. 认识异常2. 异常的基本用法2.1 捕获异常2.2 异常处理流程2.3 抛出异常3. Java异常体系1. 认识异常我们在代码种肯定见过了一些异常,例如:除数为0System.out.println(10 / 0);// 执行结果Exception in thread "main" java.lang.ArithmeticException: / by zero数组下表越界int[] arr = {1, 2, 3};System.out.println(arr[100]);

2021-11-24 20:02:56 152

原创 Java:抽象类、接口

文章目录1. 抽象类2. 接口1. 抽象类class Animal{ public void func(){ System.out.println("hahaha"); //这个可以为空 }}class Dog extends Animal{ @Override public void func() { System.out.println("我是小狗"); }}class Cat extends Animal{

2021-11-15 18:42:49 366

原创 Java:继承和多态

文章目录1.包1.1 import和package的区别1.2 静态导入2.继承2.1 访问权限2.2 final关键字3. 多态3.1 向上转型3.2 动态绑定3.3 方法重写3.4 理解多态3.5 super关键字3.6 super和this的区别1.包在Java中,包是组织类的一种方式。使用包的主要目的是保证类的唯一性。例如,你在代码中写了一个Test类,你的同事也写了一个Test类,当两个同名的类出现时,就会产生冲突。1.1 import和package的区别在Java中,当我们需要

2021-11-14 19:59:33 228

原创 链表的实现

文章目录1 链表1.1 链表的概念及结构1.2 链表的实现1 链表1.1 链表的概念及结构链表是一种物理存储结构上非连续存储结构,数据元素的逻辑顺序是通过链表中的引用链接次序实现的 。之所以叫链表,因为其结构就类似于链条,每个节点包括一个value和指向下一个节点的引用。1.2 链表的实现这里主要实现的是不带头的非循环链表创建节点:class ListNode1{ public int val; public ListNode1 next; //有参构造,给val赋

2021-11-05 11:01:04 561 3

原创 顺序表的实现

文章目录1 顺序表1.1 概念及其结构1.2 接口实现1 顺序表1.1 概念及其结构顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构,一般情况下采用数组存储。在数组上完成数据的增删查改。顺序表一般可以分为:静态顺序表:使用定长数组存储动态顺序表:使用动态开辟的数组存储。静态顺序表适用于确定知道需要存多少数据的场景。静态顺序表的定长数组导致N定大了,空间开多了浪费,开少了不够用。相比之下动态顺序表更灵活, 根据需要动态的分配空间大小。1.2 接口实现下面来实现一个动态顺

2021-11-04 19:02:45 138 4

原创 Java:面向对象

文章目录1 面向对象2 类与对象3 类的成员3.1 字段3.2 方法3.3 static关键字3.3.1 修饰成员变量3.3.2 修饰方法4 封装4.1 private封装4.2 getter和setter方法5 构造方法5.1 基本语法5.2 this关键字6 代码块6.1 普通代码块6.2 构造代码块6.3 静态代码块1 面向对象我们都知道C语言是面向过程的,C++,Java等语言是面向对象的,那么这两者之间有什么区别呢?来举一个洗衣服的例子:面向过程:把衣服放在盆中->加入洗衣液-&gt

2021-10-30 16:03:53 72

原创 Java:类型转换及运算符

1.类型转换1.1 int和long/double相互赋值int a = 10; long b = 20; a = b; // 编译出错, 提示可能会损失精度. b = a; // 编译通过. int a = 10; double b = 1.0; a = b; // 编译出错, 提示可能会损失精度. b = a; //编译通过 结论:和double表示的范围更大,可以将int赋值给long或者double,反之不行。这种转换是隐式转换。1.2 int和boolean相互赋值in

2021-10-13 19:43:47 164

原创 Java:初识Java

文章目录1.Java语言概述2.第一个Java程序3.基础数据类型3.1整型3.2长整型3.3双精度浮点型3.4单精度浮点型3.5字符类型3.6字节类型3.7短整型3.8布尔类型3.9字符串类型1.Java语言概述Java是一门面向对象的编程语言,有一系列计算机软件和规范形成的技术体系,这个技术体系提供了完整的用于软件开发和跨平台部署的支持环境,并广泛应用于嵌入式系统、移动终端、企业服务器、大型机等各种场合。总的来说,Java是一门很火的语言。2.第一个Java程序看下面的例子:public cl

2021-10-10 19:20:00 80

原创 C语言:预处理

1.预处理1.1#define定义标识符举个例子:#define MAX 1000 //将代码中的MAX直接替换成1000#define reg register //为 register这个关键字,创建一个简短的名字我们在#define定义标识符的时候需要在后面加上:(分号)吗?如果我们不知道该不该加的时候,不妨来尝试一下加了会有什么后果,看下面的例子:#define MAX 100;int main() { printf("%d\n", MAX); //相当

2021-10-09 11:00:09 88

原创 C语言:文件操作

1.为什么要使用文件在生活中,我们在电脑或手机上下载了一些东西,当我们关机再开机后,那些东西依然存在,只有当我们主动删除它的时候,它才会消失,使用文件我们可以将数据直接存放在电脑的硬盘上,做到了数据的持久化。2.文件的打开和关闭及读写2.1文件指针每个被使用的文件都在内存中开辟了一个相应的文件信息区,用来存放文件的相关信息(如文件的名字,文件状态及文件当前的位置等)。这些信息存储在结构体变量中,系统会将结构体改名为FILE,此后,我们只需要通过一个FILE类型的指针就可以访问相应的文件。2.2打开

2021-10-04 09:35:10 83

原创 C语言:动态内存函数

1、动态内存函数1.1 malloc和freemalloc这个函数向内存申请一块连续可用的空间,并返回指向这块空间的指针。参数为开辟字节的大小,返回类型为void*,空间开辟成功指针指向该空间的地址,开辟失败后指针为NULL,所以每次开辟空间后都需要判断是否开辟成功,我们来看一个例子:int main(){ int* ptr = NULL; ptr = (int*)malloc(10 * sizeof(int)); if (NULL != ptr)//判断ptr指针是否为空 { fo

2021-09-27 20:26:36 313 2

原创 C语言:自定义类型

一、结构体1.结构体变量的定义及初始化直接上代码:struct Point { int x; int y;}p1; //创建结构体时顺便创建变量,分号一定不能掉struct Point p2; //单独创建变量struct Point p3 = { 1,2 }; //创建变量时顺便赋值struct Node { char str[20]; struct Point p; //结构体嵌套}n1 = { "abcd",{3,4} };int main()

2021-09-23 20:39:03 124 2

原创 C语言:字符串函数与内存函数

一、字符串函数1.strlen该函数用于求字符串长度,有人会问了,一个简简单单的求字符串长度的函数也需要讲吗?我们先来看一个普通的求字符串长度的例子:int main() { char str[] = "abcd"; printf("%d\n", strlen(str)); return 0;}如我们所愿,结果为4.我们再看下面这个例子:int main() { char str1[] = "abcdef"; char str2[] = "sss"; if (strlen(str

2021-09-16 15:49:37 115

原创 leetcode-1:两数之和

题目:给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。你可以按任意顺序返回答案。示例1:输入:nums = [2,7,11,15], target = 9输出:[0,1]解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。示例2:输入:nums = [3,2,4], targ

2021-08-29 17:50:27 62 3

原创 C语言:扫雷小游戏

**扫雷**设计思路:需要一个菜单界面,让玩家选择玩游戏或者退出,并且可以玩完一次继续玩;可以用两个二维数组,一个用来显示雷的分布,另一个显示周围雷的数量;设计埋雷和扫雷函数,并判断扫雷是否成功。1.主菜单int main(){ int input = 0; srand((unsigned)time(NULL)); do { menu(); printf("请输入:"); scanf("%d", &input); switch (input) {

2021-08-15 17:02:21 5159

原创 C语言:三子棋游戏

说到三子棋,我想大家一定不陌生吧,它也是我童年中的一部分,今天我们用C语言来实现一下简易版的三子棋。首先,介绍一下游戏规则:在一个九宫格上进行下棋;玩家两名,双方先后落子;若在一条直线上有三颗同一玩家的棋子,则该玩家赢,若棋盘下满也没有出现三颗棋子在一条直线上,则为平局。设计思路如下:1.用do…while循环可以保证玩完一把还能接着玩,玩家可以自行选择继续玩还是退出。2.用一个3x3的二维数组来存放玩家和电脑下的棋子,再进行判断输赢。3.进行游戏的棋盘如下:代码如下:头文件gam

2021-08-14 13:48:35 121

原创 C语言:数据的存储

1.数据的类型在C语言中,基本数据类型有char、short、int、long、long long、float、double,那有没有字符串类型呢?答案是没有,哈哈哈。在整形中,每个类型可分为有符号数和无符号数,即signed和unsigned,在vs2019中,默认的都是signed类型,所以想要表示无符号数时必须在前面加上unsigned。除了这些类型,还有指针类型、空类型以及可以自己构造类型,如:struct、enum、union。2.整形在内存中的存储在了解整形在内存中的存储之前,我们先来

2021-08-09 17:20:30 365

原创 C语言:函数栈帧

1.什么是函数栈帧在C语言中,每一个正在运行的函数都有一个栈帧与其对应,栈帧中存储的是该函数的返回地址和局部变量。从逻辑上讲,栈帧就是一个函数执行的环境:函数参数、函数的局部变量、函数执行完后返回到哪里等等。2.函数栈帧的创建与销毁在调用函数时,会为该函数在栈上开辟一块空间,在该函数运行的过程中,寄存器ebp保存的是栈底地址,寄存器esp保存的是栈顶地址。而且还应该明确一点,esp和ebp寄存器一次只能存储一个地址,所以,任何时候,这一对指针都会指向同一个函数的栈帧结构。并且ebp一般由系统改变它的

2021-08-07 18:19:12 189

原创 初识结构体

可能有点繁琐,但还请你能耐心看完~~在谈什么是结构体之前,我们先来说说为什么会有结构体这个东西,在C语言中,如果我们想创建一个整形变量,那我们可以用int,想创建一个字符变量,可以用char,想创建一个小数,可以用float或者double,但是如果我们想描述一个人,或者一本书,该怎么办呢?就拿人来说吧,描述一个人,需要他的姓名、性别、年龄等等,这些变量不是同一个类型的,所以我们无法用单纯的int或者double等等关键字来创建,所以我们需要一种变量类型可以满足各种类型的变量,于是乎结构体就来但此重任了。

2021-08-04 15:52:34 122

原创 数组名是首元素地址吗?

数组名确实是首元素地址,但是有两个例外。1.sizeof(数组名),这里的数组名不是首元素地址,是表示整个数组。上代码:int arr[10] = { 0 }; printf("%d\n", sizeof(arr));打印结果为:如果是首元素的地址,在32位平台地址的大小是4个字节,64位平台地址大小为8个字节,但是这里的输出结果是40字节,所以sizeof(数组名)这种情况,数组名代表的是整个数组。2.&数组名,这里的数组名也表示的是整个数组。上代码:int arr[10]

2021-08-02 16:41:01 5967 4

原创 C语言中交换两数的方法

在学习C语言的过程中,很多地方都会用到交换两个数这一步,下面来介绍一下交换两数的常见的3种方法:1.采用一个临时变量,这也是我们最常用的一种方法,直观且简单,其代码如下: int a = 3; int b = 5; int temp = 0; temp = a; a = b; b = temp;2.不创建临时变量,也可以完成交换,其代码如下: int a = 3; int b = 5; a = a + b; b = a - b; a = a - b;这种方法虽然可以完成交换,

2021-08-01 12:04:14 5955 2

原创 Static关键字的三种用法

在C语言中,static关键字有3种常见的使用方法:1.static修饰局部变量2.static修饰全局变量3.static修饰函数

2021-08-01 11:46:06 1313

原创 折半插入排序

1.折半插入排序因为折半查找比直接查找更快,所以当需要排序的数字越多时,折半插入排序相较于直接插入排序效率更高。2.算法思想采用折半查找招待待排序元素的插入位置3.代码实现#include <stdio.h>void display(int arr[],int size){ for(int i=1;i<size;i++) printf("%d ",arr[i]); printf("\n");}void BInsertSort(int arr[],int size

2021-02-12 17:13:49 210

原创 折半查找

1.折半查找从已给的数组中查找某元素,每次都从中间查找,前提是数组是递增或递减的,效率较高。2.原理和数学中的二分法类似,将需要查找的元素和数组的中间元素比较,进过这一次比较就能排除一般的元素,然后再循环这个过程3.代码实现#include <stdio.h>//折半查找int BinarySearch(int arr[],int size,int e){ int left=0; int right=size-1; while(left<=right) {

2021-02-10 16:11:08 94

原创 直接插入排序

1. 直接插入排序将需要排序的元素按升序或降序插入到适当的位置。2. 原理以升序为例,从数组第二个元素开始,从a[0]开始比较,若知道找到合适的位置,即保证比后面的元素小。3.代码实现#include <stdio.h>//直接插入排序void display(int arr[],int size){ for(int i=0;i<size;i++) printf("%d",arr[i]); printf("\n");}void InsertSort(int

2021-02-10 13:19:22 105

空空如也

空空如也

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

TA关注的人

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