自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 JVM垃圾回收

垃圾回收是当我们的线程结束之后,线程自己结束了,但是他不会将自己产生的一些线程私有的程序计数器、虚拟机栈以及本地方法栈带走,所以我们就需要将这些垃圾进行回收。但是在进行回收的时候我们要判断,哪些是已经真正的结束的对象,然后对他们进行回收。一、判断结束对象1、引用计数器算法 我们给每一个对象加上一个计数器,当我们用的时候计数器加一,不同的时候计数器减一,当计数器为0的时候就表示不再被使用,是一个已经需要被回收的对象。但是引用计数器算法不能解决对象循环引用的问题(a引用了b,b引用了a,没有

2022-06-14 22:07:51 328 1

原创 JVM内存分布、类加载机制以及双亲委派模型

一、JVM的内存布局JVM的内存布局分为五大部分,但是不同的jdk版本下的分布是有差距的。jdk1.7:本地方法栈、程序计数器、虚拟机栈、堆区、永久代jdk1.8:本地方法栈、程序计数器、虚拟机栈、堆区、元数据区堆区: 所有的对象存放的区域,其内部分为新生代和老年代,新生代存放的是新来的对象,而我们会不断的进行垃圾回收,在进行多次回收之后还是没有被回收的对象就会放在老年代。老年代和新生代的区别是在垃圾回收的频率不一样。【线程共享】...

2022-06-14 14:54:19 316

原创 TCP/IP五层模型之数据链路层

一、以太网 以太网不是网络,它是一种技术标准,规定网络拓扑结构、访问控制方法等等。包含数据链路层的内容,也包含部分物理层的内容。二、数据链路层的作用 数据链路层的作用是保证相邻节点之间数据的传输的,节点之间的数据传输依靠的是MAC地址。三、MTU MTU是我们数据链路层传输数据的时候的一个大小的限制,以太网帧汇总规定传输的数据最小是46字节,最大是1500个字节,这里的1500字节就是MTU,也就是数据报的最大长度限制是MTU,当然不同的网络类型的MTU是不同

2022-06-08 18:58:05 517 1

原创 TCP/IP五层模型之网络层IP协议头的格式

IP协议的协议头格式4位版本:表示时IpV4还是IpV64位头部长度:IP头部的长度8位服务类型:前三位已经弃用,最后一位是保留位,中间4位分别表示最小延迟、最大吞吐(每秒发送数据的多少)、最高可靠性、最小成本,这四个相互冲突,只能任选其一。16位总长度:IP数据报总体的大小占多少个字节16位标识:数据量过大的时候需要分组,这个就是分组的标识3位标识字段:第一位保留位,第二位标识当前的这个包有没有分包,1表示禁止分片,也就是没有分包,第三位是如果进行了分包,当前这个是分...

2022-06-08 18:14:16 501 1

原创 Java解决约瑟夫环问题(通俗易懂版)

约瑟夫环问题: 约瑟夫环(约瑟夫问题)是一个数学的应用问题:已知n个人(以编号1,2,3…n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列。通常解决这类问题时我们把编号从0~n-1,最后 结果+1即为原问题的解。解法一:利用链表 我们可以把每一个人变成一个链表,然后不断地循环这个链表。每次删除一个结点,直到最终只剩下一个结点的时候就表示我们找到个!解

2022-06-08 14:36:47 11149 3

原创 TCP/IP五层模型之传输层重点协议:TCP协议(八大特性,三次握手,四次挥手)

一、TCP协议段格式 数据在进行传递的时候需要五大元素:协议,源端口号,目标端口号,源IP地址,目标IP地址。TCP传输的是源端口号和目标端口号,源IP地址,目标IP地址是在网络层进行传输的。4位首部长度:表示TCP头部的最大长度32位序号和确认序号就是表示具体传输的消息中的一条消息。六位标志位:16位效验和:因为我们将数据传送进行加密,保存在效验和里,接收端拿到数据后再次进行机密,与效验和里的加密结果进行对比,一致就表明数据的完整性。16位紧急指针:配合URG使用找到紧急数据。..

2022-06-07 17:52:29 1063 1

原创 HTTPS产生的原因以及交互的完整流程

一、产生的原因 HTTP是一个超文本传输的协议,它用于传输客户端与服务器端的数据,但是HTTP存在三个问题,传输过程中内容很容易被窃取;不能对传输对方的身份进行效验,会有伪装的可能;没有办法保证报文的完整性,内容和容易被篡改。所以就产生了HTTPS来解决这些问题。二、HTTPS在HTTP基础上进行的升级 对于传输过程中内容很容易被窃取的问题,HTTPS选择进行加密的方式保护数据;对于不能对传输对方的身份进行效验,会有伪装的可能的问题,HTTPS利用证书来确定对方的身份;对于没

2022-06-06 23:12:34 679 1

原创 网络基本概念集合

一、局域网(Local Area Network 简称 LAN)局域网的建立方式: 1、通过网线直接将计算机连接在一起组成一个局域网 2、通过一个集线器将多个计算机连接在一起就组成了一个局域网 3、通过一个交换机将多个计算机连接在一起组成一个局域网 4、通过路由器将多个计算机连接在一起组成一个局域网 5、也可以路由器交换机互联再连接计算机组成局域网都是可以的二、广域网(Wide Area Network 简称 WAN)

2022-06-01 16:28:55 214 1

原创 从输入url到页面展示都发生了什么?

拿到url之后要对其进行效验, 判断是否符合http协议url效验通过之后对DNS进行解析,它的内部其实是一个大型的哈希表,里面存放的key值是我们的域名,value存放的是ip,然后我们从中获取目的ip,然后我们还可以拿到目的端口号,如果用户输入了那么拿到的就是用户输入的端口号,如果用户没有输入,然我们就拿到默认的端口号拿到ip之后就开始建立连接,http协议是基于TCP/IP协议的,TCP/IP协议就是基于TCP协议的,那我们就进行TCP连接,TCP连接是三次握手(a和b打电话,a:喂?能听到? .

2022-05-31 16:26:59 140 1

原创 java中通过JDBC编程连接MySQL数据库并对数据库进行操作

一、JDBC存在的意义        我们对于数据库的操作不能是单纯地对于一个库操作,最终一定是要连接我们的后端程序,在项目中对数据库进行操作,所以我们就要通过驱动让我们的程序连接到数据库,那么问题来了,数据库有很多种比如说MySQL数据库,比如说SqlServer数据库,等等,那么不同的数据库厂商对于他们自己的数据库操作是不一样的,我们不能今天这个程序连接的是这个数据库,明天想换一个数据库,直接代码全部重新来过,是比较麻烦的

2022-05-18 11:43:21 790 1

原创 HTML相关概念及常用标签的用法

HTML的基本结构框架,以及常用标签的列举与实例

2022-05-09 13:24:10 698

原创 枚举类型Enum的用法

枚举Enum的基本概念及用法

2022-05-03 10:57:51 31750 1

原创 线程的分类(用户线程和守护线程)

线程的分类:守护线程&用户线程

2022-04-24 18:32:29 2030 3

原创 什么是死锁,产生死锁的必要条件,以及避免死锁的方法

一、死锁的定义        死锁是指,有两个或两个以上的线程在执行的过程中,由于竞争的资源或者彼此通信而造成的一种阻塞状态,若无外力作用,他们将都无法进行下去,从而形成一直阻塞的状态叫死锁。        简单来说就是小李拿了东西A,小张拿了东西B,小李现在还想要东西B,小张还想要东西A,但是两个人都不放弃原来的,还要对方的,一直僵持的状态就叫

2022-04-19 11:40:09 4405 2

原创 线程池的概念及七种创建方法详解

线程池存在的意义:传统的线程池存在一些问题:1、每次都需要创建和消耗线程,是需要消耗系统资源的2、线程没有任务管理器功能,当任务量过大的时候没有任务队列对任务进行管理或者拒绝。因为传统线程存在这些缺点,所以引入了线程池来解决这些问题。线程池的优点:1、可以复用线程,从而避免线程重复创建和销毁的性能开发2、可以控制线程的数量,从而避免因为线程创建过多而导致的OOM(内存溢出)的问题3、提供了任务管理器功能,从而实现了任务缓存和拒绝4、线程池提供了更多的功能,例如:定时功能线程池的创建:线

2022-04-15 13:19:19 1953 1

原创 MySql数据库命令大全:数据库操作命令,表操作命令,修改表结构命令,数据操作命令,数据查询操作命令

数据库操作命令表操作命令修改表结构命令数据操作命令数据查询操作命令

2022-03-30 01:19:59 30057 7

原创 【数据库】SQL命令的分类:DDL、DML、(DQL)、DCL的概念与指令

SQL命令共分为三大类:DDL;DML;DCLDDL【数据定义语言】用来维护存储数据的结构代表指令:create;drop;alter…DML【数据操纵语言】用来对数据进行操作代表指令:insert;delete;updata…DQL【数据查询语言】是数据操纵语言中的一个单独的分类,包含在DML中包含指令:selectDCL【数据控制语言】主要负责权限管理和事务代表指令:grant;revoke…

2022-03-30 00:07:36 2961 1

原创 Proteus创建新项目的详细操作步骤(keil和Proteus联合仿真)

1、打开Proteus软件2、创建新工程点击New Project设置工程名,点击browse找到想要存放工程的位置,可以新建一个文件夹,将本工程的东西可以都保存在一个文件夹中。然后点击next。之后一路next还有Finish3、绘制电路图点P就可以搜索需要的芯片以及电子元件找到需要的器件,并点击OK点击OK后就可以看到我们已经将器件保存下来,再单击器件名称,后在画布上加入该器件将所有的器件全部找到,并绘制电路图,先将所有需要的器件放入画板点击左侧的按钮找到地线等所需

2022-03-29 01:25:52 21323 1

原创 Keil创建一个新的工程详细操作步骤(keil和Proteus联合仿真)

1、创建文件夹我们首先在一个固定的地方创造一个文件件,后期可以将代码以及和proteus联合仿真的项目也放在这个文件夹里。我这里就放在桌面上进行展示。2、在keil上创建新的工程找到keil软件,并打开找到Project,选择第一个找到刚才创建的文件夹,设置工程名,并点击保存。之后我们选择需要的芯片,通常使用AT89C51芯片。点击Atmel前面的小加号找到AT89C51芯片,再点击ok,点击ok后可能会出现一个提示,点是就可以了3、输入仿真代码点击File下面的白色文件

2022-03-29 00:52:17 21182

原创 哈希表的基本概念详解以及具体实现(哈希函数、哈希冲突、负载因子)

一、哈希表哈希表是一个典型的用空间换时间的操作,利用数组随机访问的特性,最大化查找效率。哈希过程就是将数组元素与下标建立关系的过程。二、哈希函数1、哈希函数的意义:哈希表是希望将元素与下标建立关系,那么当多个元素之间跨度较大时,我们不可能浪费大量的空间来完成这个存储的过程,就需要通过哈希函数。将下标控制在一定的范围内,就是将我们要存储的键值中的“键”利用特定的哈希函数计算得到一个整型作为数组的索引。2、哈希函数的设计(1)当key为整型时当我们的“键”是一个整型的时候,就利用直接取模的方法,通

2022-01-27 22:50:15 1291

原创 堆的相关概念

一、堆的概念1、堆在逻辑上是一颗完全二叉树(类似于一颗满二叉树只缺了右下角)2、堆的实现利用的是数组,我们通常会利用动态数组来存放元素,这样可以快速拓容也不会很浪费空间,我们是将这颗完全二叉树用层序遍历的方式储存在数组里的3、堆有两种分别是大根堆和小根堆二、大根堆    大根堆就是整个完全二叉树,任意一个根节点的值都比左右子树的值大。    这就是一个大根堆,所有根节点的值永远比左右子树的大,那么就可以看出,整棵树的根节点,他的值是整个堆中最大的。同时我们也发现没有直接父子关系的节点他们的值没

2022-01-11 18:55:59 1388

原创 栈和队列基本概念与实现

栈1、概念展示一种特殊的线性表,只允许在固定的一端进行插入元素和删除元素的操作。进行数据的插入删除的一端叫做栈顶,另一段叫做栈底,栈中的元素遵守先进后出的原则。2、LIFO原则栈遵守LIFO原则,Last In First Out,最后进入的最先出去,即先进后出。3、生活中常见的栈结构操作系统中方法的调用过程浏览器的前进后退编辑器的撤回操作代码编辑器的括号匹配算术运算的符号优先级4、压栈压栈就是在栈顶插入元素,也可以叫做进栈/入栈。5、出栈出栈就是将栈顶元素删除。6、画图看一下

2021-12-02 19:38:34 873 7

原创 泛型(泛型类、泛型方法、泛型接口、通配符)详解

泛型的定义:在定义类的时候并不会设置类的属性和方法的参数的具体类型,而是在类实际用的时候再定义。它存在的意义是帮我们在编译期间检查我们的类型是否正确。//定义一个Point类class Point{ private Object x; private Object y; public Object getX() { return x; } public void setX(Object x) { this.x = x;

2021-11-27 17:03:37 3299 1

原创 四种内部类详解

内部类就是嵌套在其他类内部的类,共分为四种,分别是:成员内部类、静态内部类、方法内部类、匿名内部类。1. 成员内部类://外部类Outterpublic class Outter { //外部类的私有属性 private int age = 20; private String name = "xiaoli"; //内部类 class Inner{ //内部类的私有属性和方法 private String msg = "

2021-11-22 10:16:40 2406

原创 认识Java中的异常并解决

异常就是在程序运行时出现错误通知调用者的一种机制,运行时表示的是程序已经编译通过生成class文件,再由JVM执行的时候。异常中的基本概念:防御式编程:错误代码是客观存在的,所以当出现问题的时候要及时通知调用者,主要有两种方式:LBYL:Look Before You Leap. 在操作之前做充分的准备EAFP:It’s Easier to Ask Forgiveness than Permission. 事后获得原谅比事前获得许可更容易防御式编程就是我们先执行代码,碰到异常再解决,其实它的核

2021-11-19 20:09:59 327

原创 类中的向上转型与向下转型详解

我们的类与类之间会存在继承关系,子类继承父类,一个父类可以有多个子类,例如Animal类就可以有Cat子类,Dog子类,等等。那么我们在运用的时候根据不同的场景会出现向上转型和向下转型的情况。一、向上转型1、Animal a1 = new Cat();2、Cat cat = new Cat(); Animal a2 = cat;这两种情况都是向上转型:一个父类引用指向一个子类实例向上转型的意思:假设我们现在有一只小猫,我可以说我喂了动物,也可以说我喂了小猫,这两种说法都是没有问题的,因为嘟

2021-11-13 20:29:00 2619 11

原创 四种访问修饰符详解

有四种访问修饰符规定了定义的属性和方法能访问的区域private关键字用private关键字修饰的属性和方法只能在该类的大括号内访问,出了这个类就不能被访问了。当一个子类继承一个父类的属性和方法时,若父类的属性或方法被private修饰,那么子类就不可以继承该属性或方法。default关键字(包访问权限)default关键字修饰的属性或方法只能在同一个包中的所有类访问,且必须是同级的包,在一个包中的子包也不可以访问。但我们在定义属性和方法时不需要将default关键字写出来,没有关键字修饰的属性或

2021-11-09 22:38:59 3515 1

原创 Java类与类的继承关系详解

代码中创建的类,主要是为了能将我们生活中的事物抽象成具体的属性和方法,但是在实际的场景中,有很多东西他们之间存在**有一定关联**的属性和方法,例如动物之间,城市之间等,他们存在有完全相同意义的属性和方法,所以遇到这种情况,我们可以设计一个类,让其他的类继承他的部分属性及方法。

2021-11-09 11:51:26 3374 1

原创 【LeetCode-142题】环形链表II——快慢指针,加图解

题目:给定一个链表,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。注意,pos 仅仅是用于标识环的情况,并不会作为参数传递到函数中。说明:不允许修改给定的链表。示例 1:输入:head = [3,2,0,-4], pos = 1输出:返回索引为 1 的链表节点解释:链表中有一个环,其尾部连接到第二个节点。示例 2:输入:

2021-10-31 15:59:37 119

原创 【LeetCode-141题】环形链表

题目:给定一个链表,判断链表中是否有环。如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。注意:pos 不作为参数进行传递,仅仅是为了标识链表的实际情况。如果链表中存在环,则返回 true 。 否则,返回 false 。示例 1:输入:head = [3,2,0,-4], pos = 1输出:true解释:链表中有一

2021-10-31 15:16:59 84

原创 【LeetCode-876题】链表的中间节点

题目:给定一个头结点为 head 的非空单链表,返回链表的中间结点。如果有两个中间结点,则返回第二个中间结点。示例 1:输入:[1,2,3,4,5]输出:此列表中的结点 3 (序列化形式:[3,4,5])返回的结点值为 3 。 (测评系统对该结点序列化表述是 [3,4,5])。注意,我们返回了一个 ListNode 类型的对象 ans,这样:ans.val = 3, ans.next.val = 4, ans.next.next.val = 5, 以及 ans.next.next.next

2021-10-30 15:48:45 77

原创 【LeetCode-82题】删除排序链表中的重复元素Ⅱ

题目:存在一个按升序排列的链表,给你这个链表的头节点 head ,请你删除链表中所有存在数字重复情况的节点,只保留原始链表中没有重复出现的数字。返回同样按升序排列的结果链表。示例 1:输入:head = [1,2,3,3,4,4,5]输出:[1,2,5]、示例 2:输入:head = [1,1,1,2,3]输出:[2,3]提示:链表中节点数目在范围 [0, 300] 内-100 <= Node.val <= 100题目数据保证链表已经按升序排列、思路:这个题我

2021-10-30 10:36:03 131

原创 【LeetCode-83题】删除排序链表中的重复元素

题目:存在一个按升序排列的链表,给你这个链表的头节点 head ,请你删除所有重复的元素,使每个元素 只出现一次 。返回同样按升序排列的结果链表。示例 1:输入:head = [1,1,2]输出:[1,2]示例 2:输入:head = [1,1,2,3,3]输出:[1,2,3]提示:链表中节点数目在范围 [0, 300] 内-100 <= Node.val <= 100题目数据保证链表已经按升序排列思路:我们还是选择引入虚拟头结点,从头结点开始遍历,再引入一个

2021-10-29 17:42:06 147

原创 单链表插入删除操作详解(引入虚拟头结点)

我们发现在解决单链表问题的时候发现在增加和删除的时候总是要单独考虑链表中头结点,再解决其他中间位置的结点,那我们可以引入一个虚拟的头结点,这样无论链表中有没有结点都是一样的解决方法。画图来看一下引入虚拟头结点后链表的操作过程插入在头结点插入我们发现引入虚拟头结点后在头部插入结点和在中间任意位置插入结点的操作都是一样的删除任意结点删除头结点引入虚拟头结点后的删除操作也是一样的,不需要单独对头结点的操作进行考虑代码实现操作过程class Node{ int data;

2021-10-28 17:50:52 286

原创 单链表的增删查改详解(代码加图解)

单链表的特点是只能从头开始向后遍历,所以我们在增删查改的过程中都要考虑从头开始的问题,单链表的临界情况是对于头结点的操作,我们需要对头节点多加考虑。class NodePractice{ //存储结点的内容 int data; //存储下一个结点的地址 NodePractice next; public NodePractice(int data) { this.data = data; }}public class SingleLi

2021-10-25 10:56:34 775

原创 方法的覆写【toString()方法的重写】

有的方法系统会自动给出来,但是我们不希望按照系统给的那样执行的话,可以对方法进覆写。对于引用数据类型在打印的时候系统都会自动调用toString()方法public String toString() { return getClass().getName() + "@" + Integer.toHexString(hashCode()); }例如我们定义了一个数组,直接通过系统的方法来打印的话将会打印数组的地址。public class Blog { int[]

2021-10-21 20:51:20 730

原创 java方法的重载

方法的重载:在一个类中可以有多个相同名字的方法,但是它们的参数类型以及个数不能相同,对于返回值没有要求。例如:public static int add(int a,int b){ return a+b; } public static int add(int a,int b,int c){ return a+b+c; } public static double add(double a,double b){ retu

2021-10-20 23:22:09 131

原创 动态数组(数组的增删查改)

在实际生活中,一段数组我们有可能会对其进行增删查改,当我们对数组进行改动后就有可能改变了数组的大小,若是我们每一次改动后都将数组重新开辟空间拷贝过去会相对来说比较麻烦,所以产生了动态数组,对于实际运用来说会比较灵活。动态数组就是在声明的时候没有明确数组大小的数组。当我们创建了一个动态数组后,需要完善进行增、删、查、改的操作。在这里插入代码片...

2021-10-19 19:46:44 672

原创 算法的时间复杂度和空间复杂度

算法的效率分为两种:时间效率和空间效率。时间效率被称为时间复杂度,主要是衡量一个算法的运行速度。空间效率被称为空间复杂度,主要衡量的是算法所需要的额外空间。时间复杂度定义在计算机中算法的时间复杂度是一个函数,他定量的描述了一个算法的运行时间。一个算法执行的时候所需要的时间应当是执行的时候才能知道的,但是这样非常的麻烦,所以就有了时间复杂度这样的分析式子。一个算法所花费的时间与其语句的执行次数成正比,算法中的基本操作的执行次数为算法的时间复杂度。大O的渐进表示法举个例子:voi

2021-10-18 17:41:54 609

原创 用递归和迭代的思想解决斐波那契数列问题

斐波那契数列,又称黄金分割数列,指的是这样一个数列:0、1、1、2、3、5、8、13、21、34、……在数学上,斐波纳契数列以如下被以递归的方法定义:F(0)=0,F(1)=1,F(n)=F(n-1)+F(n-2)(n≥2,n∈N)在现代物理、准晶体结构、化学等领域,斐波纳契数列都有直接的应用。斐波那契数列:1,1,2,3,5,8,13,21,34…从第三个数开始,这个数等于前两个数之和首先我们用递归的方式解决斐波那契数列的问题 public static int Fibonacci(int

2021-10-11 17:38:08 722

空空如也

空空如也

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

TA关注的人

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