自定义博客皮肤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)
  • 收藏
  • 关注

原创 页表与虚拟内存

引言  虚拟内存也叫做虚拟存储器,作为现代操作系统中存储管理的一项重要技术,实现了内存扩充功能。我们知道一台计算机的内存其实是很小的,但很多程序所需要的空间却是非常大的;这个问题有两个解决方案,一个显而易见的方法就是从物理上增加容量,但这往往受到机器自身的限制,而且无疑要增加系统成本;所以现在大多数计算机都采用第二种方法,就是虚拟内存加交换技术。一、页表  分页技术是用来管理内存空间的。分页技术可以解决内存不连续的问题,让碎片化空间最小化。页面:分页储存管理将进程的逻辑地址空间分成若干个页,并为各

2021-09-03 00:32:11 2581

原创 Java垃圾回收机制

引言  我们在之前聊JVM,谈到内存划分时,说到一个栈的栈帧会随着方法的调用结束而被释放,而Java堆和方法区却没有这样的机制,我们知道任何一块空间都不能只进不出,那么堆和方法区中具体是怎么管理内存的呢?这就要说垃圾回收机制了,而说垃圾回收,就首先要判断什么是垃圾。一、什么是垃圾  在生活中我们一般把不用的东西、坏掉的东西、或者是已经没有价值的东西称之为垃圾,垃圾没有一个准确的定义,每个人都有不同的判断。但是在计算机世界中,必须要对垃圾有一个准确的判断,才能做出回收;在Java中我们把没有已经没有被引

2021-08-24 20:42:46 226

原创 了解JVM

一、JVM1、基本概念  JVM全称为Java Virtual Machine,也叫Java虚拟机,JVM诞生之初,最主要的目的是为了跨平台,因为在那个年代里,计算机行业还处于一个不稳定状态,各种操作系统和各种语言层出不穷,在一台电脑上编译另外一台电脑上执行就成为了重要需求,所有JVM诞生了,JVM处于应用程序和操作系统之间,相当于起到一个翻译的作用,它可以根据操作系统的不同,把文件翻译成不同的机器指令。但是现在编程大概率已经不需要跨平台了,所以跨平台就成了"伪需求",但是JVM却依然存在,主要是因为现

2021-08-24 15:08:56 250

原创 Java反射机制

一、反射的定义  首先我们需要知道什么是动态语言,动态语言,是指程序在运行时可以改变其结构:新的函数可以引进,已有的函数可以被删除等结构上的变化。比如常见的 JavaScript 就是动态语言,除此之外Ruby、Python 等也属于动态语言,而 C、C++则不属于动态语言。从反射角度说 JAVA 属于半动态语言。  Java的反射(reflection)机制是说,**在运行状态中,对于任意一个类都能知道它的所有属性和方法,并且对于任意一个对象,都能调用它的所有方法,**这种动态获取信息以及动态调用对象

2021-08-23 23:03:37 111

原创 深入理解Java的类加载机制

一、 编译  我们知道Java代码在运行时,首先编译器会把我们的代码编译成一个.Class文件,Java中有句话“一次编译,到处运行”,能到处运行的原因和这个Class文件有很大的关系。二、类加载  我们知道每一个类都会生成一个.Class文件,这是一个字节码文件,其实就是一串二进制的比特流;一个类的生命周期从被类加载开始,到从内存中卸载结束,一共被分为加载、验证、准备、解析、初始化、使用、卸载七个阶段,其中从加载到初始化这五个过程被称为类加载过程。系统可能在第一次使用某个类时加载该类,也可能采用预加

2021-08-21 03:45:09 358 2

原创 理解Java迭代器原理

引言Java中一些简单的线性结构可以通过使用for循环和while循环来遍历,但是当我们要遍历一个很复杂的结构时,比如二叉树,这时就需要我们手写一个方法去遍历这个结构,但是如果没遇见一个复杂结构就去专门写一个方法,不说方法本身的难度问题,就从效率上讲,每个程序员水平都不一样,写出的代码效率肯定有高有低,所以Java为了解决这种情况,就设计了一个接口——Iterator,可以在不了解对象内部细节的情况下,遍历整个对象中的元素。Iteratorpackage java.util;public inter

2021-08-20 01:17:57 210

原创 了解ConcurrentHashMap

介绍  ConcurrentHashMap是在Java.util.concurrent并发包下的一个类,它相当于是一个线程安全的HashMap。这里可能还有人会提到HashTable,这也相当于是一个线程安全的HashMap,但是它因为效率太低,所以现在很少被使用了,HashTable是对整个对象上了一把锁,在synchronized被优化之前,他的效率可以说是相当的低,所以就有了ConcurrentHashMap的诞生。Java1.8之前的ConcurrentHashMap在JDK1.8之前Conc

2021-08-19 03:27:03 339

原创 多线程总结

引言经过了这么多天的线程学习,终于告一段落了。线程这里面涉及的问题有很多,知识面也很广,其中最重要的就是线程安全问题,这是多线程编程的基础。想要学好多线程光靠短段时间的学习肯定是远远不够的,还需要在日后不断的去积累、去深入。什么是线程线程是CPU最小执行单元,一个进程可以包括多个线程,多个线程之间共享同一份资源;一个进程中最少要包含一个线程,而这时这一个线程也可以叫做进程,所以线程也可以被叫做"轻量级进程";线程有如下几个状态:新建状态(NEW):当使用new关键字创建了一个线程时,该线程就属于新

2021-08-18 00:15:19 86

原创 Runnable和Callable区别

RunnableRunnable是一个接口,该接口中只有一个run方法,实现Runnable接口的类需要重写run方法,然后可以把这个类作为Thread类的一个参数,来创建线程,具体的用法有两种:创建一个类,实现Runnable接口,重写run方法class MyThread implements Runnable { @Override public void run() { System.out.println("My Thread"); }}使

2021-08-17 02:04:09 243

原创 常见的锁策略和synchronized实现原理

一、常见锁策略在多线程编程中,对代码上锁是很平常的事,但是对待不同情况我们需要用到不同的锁,所以就对锁进行了一下分类。1、乐观锁VS悲观锁乐观锁:乐观锁在处理一段代码时,它会乐观的认为读多写少,也就是并发执行的情况概率很低,代码都是串行执行的,他认为每次去拿数据时,别人都不会对数据进行修改,而只有当写数据时才会正式对数据上锁,它会先去获取一下版本号,看一下版本号有没有发生改变,如果发生改变,就会重复读–比较–写的操作(CAS操作),Java中的乐观锁一般都是通过CAS操作实现的。悲观锁:悲观锁和乐

2021-08-16 02:51:17 266

原创 Java内存模型和Volatile关键字

一、什么是Java内存模型  Java内存模型(Java Memory Model,简称JMM)。在了解Java内存模型之前我们要先知道计算机的内存机制,现在大多数计算机都是多核CPU,每个CPU上都可以执行线程,而线程使用的数据都是储存在内存中,所以我们就需要从内存中去读取数据,但是这个过程对计算机来说是一个很慢很慢的的过程,而CPU处理指令的速度却是很快的,所以为了解决这两者之间速度的问题,就引入了高速缓存的概念,高速缓存分为L1、L2、L3多级,详细的看下图。  其中越靠近CPU的结构读取速度就

2021-08-15 00:11:41 198

原创 阻塞队列的创建和应用

一、什么是阻塞队列  阻塞队列本质就是一个能保证线程安全的特殊队列,阻塞是线程的一种状态,当队列满的时候,入队就会阻塞;当队列为空的时候,出队也会阻塞。这种实现其实就是经典的生产者消费者模型。生产者消费者模型当生产者生产速度过快时,队列已经满了,这时生产者就会阻塞等待,如果消费者消费速度过快,队列空了的话,消费者也会进入阻塞等待状态。这样的模式很好的平衡了生产者和消费者生产和消费的速度,阻塞队列在中间就相当于一个缓冲区,同时也可以起到降低耦合的作用,生产者的数据放到队列中,不需要关心消费者的一些状态,

2021-08-14 01:36:52 222

原创 数组全排列

概念  什么是全排列,我们在高中时应该都学过排列组合问题,排列要考虑顺序,组合不需要考虑顺序。比如a b的排列有a b和b a两种,而组合的话有只有a b一种。全排列就是把这个数组和字符串的所有排列方式全部打印出来。  我们接触这个问题的第一想法应该就是暴力法,遍历整个数组或者字符串,先找第一个元素,然后再后面第二次遍历的时候如果前面输出过这个元素的话,就跳过,再输出下一个,这样做的话要遍历n次数组,时间复杂度是O(n^n)。这对计算机来说都是非常非常慢的,所以我们就在想有没有一个简单的方法可以求出这个

2021-08-13 01:42:47 543

原创 认识单例模式

一、什么是单例模式   单例模式是设计模式的一种,为了保证整个系统中一个类只有一个对象的实例。就比如我们之前在JDBC编程中使用DataSource,我们就希望只需要与数据库建立一次连接,就可以一直使用,而不用反复创建,这时我们就可以使用单例模式。单例模式主要有以下两个优点节省公共资源,我们在创建一个类的实例时,可能是需要很多计算机资源的,如果我们反复创建的话,就会浪费许多资源。方便于管理和控制,一个类的实例中可能有很多个变量,如果同时有很多个程序在修改,可能会造成数据不准确(线程安全问题),如果想

2021-08-12 21:39:23 136

原创 KMP算法

简介  KMP 算法是 D.E.Knuth、J,H,Morris 和 V.R.Pratt 三位神人共同提出的,称之为 Knuth-Morria-Pratt 算法,简称 KMP 算法。该算法相对于 Brute-Force(暴力)算法有比较大的改进。KMP 算法是一个著名的字符串匹配算法,效率很高,但是确实有点复杂。KMP算法我们在匹配两个字符串时,最简单的方法就是暴力匹配,从头开始对比两个字符串,一个一个字符对比,如果遇到不匹配的情况下,把短的字符串向后移一位,然后继续从头比较。这种方法虽然很简单,但是

2021-08-11 18:14:52 153

原创 操作系统进程和线程

一、操作系统操作系统(Operation System, OS) 是指控制和管理整个计算机的硬件和软件资源、合理的组织和调度计算的任务和资源的分配、并给用户和应用软件提供合理的接口和环境的一种系统软件,它是计算机系统中最基本的系统软件。简单点说,操作系统有两个作用,一是关系下层硬件,二是给上层用户和软件提供接口。1、对硬件资源进行管理、分配、调度...

2021-08-10 23:54:53 173

原创 当在浏览器输入一个URL后会发生什么

上网这件事对于现时代年轻人来说已经是家常便饭了,那么当输入一个URL(网址)之后会发生什么呢?这里面涉及到计算机图形学、操作系统、编译原理、计算机网络、通信原理、分布式系统、浏览器原理等多个不同的学科、领域。在这里由于我的能力和知识都有限,只能大概讲述我认知中的事情大致会发生下面这些事情:DNS解析域名建立连接发送HTTP请求TCP/IP协议封装和分用返回HTTP响应浏览器解析断开连接一、DNS解析首先,浏览器向本地DNS服务器发起请求,如果本地有缓存,就直接能找到域名对应的IP地址

2021-08-08 23:28:44 544

原创 MySQL的简单认识

一、数据库1、基本介绍数据库就是一种用于管理数据的软件,数据库是利用内存和磁盘来储存和控制数据的,所以能更高效和快速的管理和处理数据。数据库可以提供远程服务,即通过远程连接来使用数据库,因此也称为数据库服务器。2、数据库的分类关系型数据库:是指采用了关系模型来组织数据的数据库。 简单来说,关系模型指的就是二维表格模型,而一个关系型数据库就是由二维表及其之间的联系所组成的一个数据组织。基于标准的SQL,只是内部一些实现有区别。常用的关系型数据库有下面这几个:Oracle:甲骨文产品,适合大型项目,

2021-08-07 23:34:19 295

原创 以太网协议

一、介绍数据链路层负责的是两个相邻节点之间的通信。从整体来看数据链路层的目的有三个:(1)为I P模块发送和接收I P数据报;(2)为A R P模块发送A R P请求和接收A R P应答;(3)为R A R P发送R A R P请求和接收R A R P应答。T C P / I P支持多种不同的链路层协议,这取决于网络所使用的硬件,如以太网、令牌环网、F D D I(光纤分布式数据接口)及 R S-2 3 2串行线路等。二、认识以太网“以太网” 不是一种具体的网络, 而是一种技术标准; 既包含了数据链路

2021-08-06 22:58:35 3439

原创 简单介绍IP协议

一、介绍IP协议是TCP/IP协议栈中最核心的协议,所有的TCP、UDP等数据的传输都是靠IP协议来完成的,IP协议是一个不可靠的,无连接的协议。不可靠:它不能保证 I P数据报能成功地到达目的地。 IP协议仅提供最好的传输服务。如果发生某种错误时,如某个路由器暂时用完了缓冲区, IP协议有一个简单的错误处理算法:丢弃该数据报,然后发送 ICMP消息报给信源端。任何要求的可靠性必须由上层来提供(如T C P)无连接:是 IP并不维护任何关于后续数据报的状态信息。每个数据报的处理是相互独立的。这也说明

2021-08-05 22:39:33 498

原创 抽象类和接口的区别

一、抽象类在Java中我们把被abstract字段修饰的方法称为抽象方法,把被abstract修饰的类称为抽象类。含有抽象方法的类一定是抽象类,但是抽象类不一定含有抽象方法。抽象类的特点有以下几点:抽象类不能被实例化一个类继承一个抽象类,必须重写其中的抽象方法,除非这个类也是一个抽象类抽象类可以包含属性、方法、构造方法,但是构造方法不能用于实例化,主要用途是被子类调用抽象类中的抽象方法不能是private,JDK 1.8以前,抽象类的方法默认访问权限为protectedJDK 1.8时,抽象类

2021-08-04 22:17:32 190

原创 UDP和TCP协议

目录一、UDP协议1、UDP协议格式2、UDP的优点和适用场景3、基于UDP的应用层协议二、TCP协议1、TCP协议格式2、TCP协议中的重要机制(1) 确认应答(ACK)机制(2) 超时重传机制(3) 连接管理机制(4) 滑动窗口机制(5) 流量控制机制(6) 拥塞控制机制(7) 延迟应答机制(8) 捎带应答机制(9) 面向字节流\粘包问题(10) TCP对异常情况的处理3、总结一、UDP协议UDP是一个简单的面向消息的传输层协议。由于它的协议格式非常简单,所以功能也很有限,它有三个特点,无连接、不可

2021-08-03 23:57:48 216

原创 浅谈HTTP协议

目录引言一、认识URL二、HTTP协议的特点三、HTTP请求1、请求行2、请求报头3、请求正文四、HTTP响应1、首行2、响应报头3、响应正文五、Cookie和Session六、HTTPS引言HTTP协议是一个基于请求和响应模式的应用层协议,通过浏览器和服务器进行数据交互,进行超文本(文本、图片、视频等)传输的规定;它主要关注的是数据内容;就比如我们要在淘宝上买东西,卖家[客户端]把物品通过顺丰[路径选择]等渠道送到买家[服务器]手里,买家和卖家只关注其中物品的信息,至于中间是谁送过去的,怎么送的,都不

2021-08-02 22:29:28 149

原创 浅谈什么是协议

目录一、协议二、协议栈1、协议栈模型2、各层的作用3、封住和分用一、协议客户端和服务器之间要相互传输数据,由于客户端和服务器是两个主机上面的两个不同的程序,所以就需要保证客户端和服务器能互相理解双方发送信息的含义,协议就是规定好通信双方按照什么样的规则来进行传输数据,然后把很多个不同协议放在一起,就称为协议栈,例如,人与人之间的交流就是通过语言协议,就好比协议栈,然后中间还有汉语协议,英语协议等等,只有双方都遵守同一个规则,才能相互理解。两个程序通过网络传输的数据本质上是二进制的比特流,网络通信其实

2021-08-01 21:54:16 731

原创 基于Servlet的博客系统

目录一、设计思路二、用到的接口1、Servlet2、Thymeleaf三、功能实现1、注册功能(1)代码实现(2)测试功能2、登录功能3、博客列表页(1)代码实现(2)测试功能4、博客详情页(1)代码实现(2)测试功能5、博客发布(1)代码实现(2)测试功能6、博客删除功能四、总结一、设计思路需求分析:根据整体的需求,设计数据库,然后建立数据表;首先建立一个数据库,根据需求见了了User表和Blog表。实现数据库代码,并进行封装;首先创建实现了数据库的初始化,然后建立了两个实体类,然后分别对User

2021-07-25 23:07:15 601 1

原创 顺序表和链表的比较

目录空间性能的比较1、储存空间的分配2、空间利用率时间性能的比较1、插入和删除元素的效率2、存取元素的效率空间性能的比较这里是拿顺序表和单链表为例来做比较的1、储存空间的分配顺序表的储存空间必须预先分配,元素个数扩充受一定限制,容易造成存储空间的浪费或空间溢出现象;而链表不需要预先分配空间,只要内存空间允许,链表中元素个数就没有限制。因此,当一个线性表元素个数难以预测时,宜采用链式存储。2、空间利用率链表的每个结点除了储存数据元素外,还额外储存了指示元素之间逻辑关系的地址,从储存密度上讲,这是不

2021-06-08 17:53:14 1109

原创 顺序表和链表的简单介绍

目录一、线性表1、基本概念二、顺序表1、概念2、实现功能(1)、插入(2)、删除一、线性表1、基本概念线性表是一组同类型数据的集合,逻辑结构为线性结构,对于任何一个非空线性表都有以下特点有且只有一个结点无前驱(头结点)有且只有一个结点无后进(尾结点)除头结点外,其他结点有且只有一个前驱除尾结点外,其他结点有且只有一个后进注意:线性表的定义只是逻辑上是线性结构,物理上不一定有关系二、顺序表1、概念顺序表的本质是一个顺序存储的线性表,是用一组地址连续的存储单元依次存储线性表的数据元素,

2021-06-02 18:21:09 644

原创 简单认识七种基于比较的排序方式(下)

目录一、冒泡排序二、快速排序1、递归实现2、非递归3、优化方式三、归并排序1、递归2、非递归四、海量数据排序问题五、排序与数据的关系一、冒泡排序冒泡排序应该是我们最先接触到的排序,思路和选择排序很像,只是实现方式不同。冒泡排序是比较当前元素和下一元素,如果当前元素大,则互换;当前元素小,则不换。当最大的元素到达元素末尾时,则从头再来,找出第二大的元素。public static void bubbleSort(int[] array) { for (int i = 0; i &lt

2021-05-29 20:10:40 372

原创 简单认识七种基于比较的排序方式(上)

目录概念1、排序的概念2、排序的分类3、排序的性能分析一、插入排序1、直接插入排序2、折半插入排序(了解)二、希尔排序三、选择排序四、堆排序概念1、排序的概念排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作。平时的上下文中,如果提到排序,通常指的是排升序(非降序)。通常意义上的排序,都是指的原地排序(in place sort)。2、排序的分类排序分为比较排序和非比较排序,比较排序就是根据数据本身的大小关系来比较进行排序。而非比较排序是利用一些数据结构,给定特殊的

2021-05-28 17:49:02 718

原创 优先级队列(堆)

目录堆(heap)1、基本概念2、堆的创建堆的应用——优先级队列1、入队操作2.出队操作Top-K问题堆排序堆(heap)1、基本概念堆逻辑上是一棵完全二叉树堆物理上是保存在数组中满足任意结点的值都大于其子树中结点的值,叫做大堆,或者大根堆,或者最大堆反之,则是小堆,或者小根堆,或者最小堆堆的基本作用是,快速找集合中的最值2、堆的创建我们以创建大堆为例public static void adjustDown(int[]arr,int parent,int len){

2021-05-12 16:12:10 102

原创 类和对象

目录一、初步认识类和对象1、类2、实例化对象二、类的成员1、成员变量/字段/属性2、方法3、static关键字三、封装1、private实现封装和getter和setter方法四、构造方法1、基本语法2、this关键字五、代码块六、toString方法一、初步认识类和对象1、类class Person{ public String name; public String sex; public static int age; public void eat(){

2021-05-03 22:38:27 143

原创 认识异常

文章目录一、异常的背景1.初识异常二、处理异常1.基本语法2.捕获异常3.异常处理流程4.抛出异常三、关于 finally 的注意事项(坑)四、java的异常体系五、自定义异常类一、异常的背景1.初识异常 public class Test { public int num = 10; public static void main(String[] args) { System.out.println(num / 0);//这里会发生除0异常 int[

2021-05-01 16:18:33 88

原创 初窥Java

前言今天第一次接触到了Java,在之前我其实还学过一些C,但是兴趣不大,学习也就没有什么成果,后来有一个老师启发了我,让我产生了写代码的想法,于是我开始了学习Java。1.初窥Java有人说Java和C语言是完全不同的两种语言,不学C反而有助于学习Java,但我第一天接触下来发现并不是这么回事(也可能是我水平还不够),里面共通点是很多的。2.Java的main方法注意:1.一个java文件只能有一个public类,并且这个类的类名一定要和文件名相同2.可以有多个类但是只能有一个public

2021-04-02 18:05:04 152 2

空空如也

空空如也

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

TA关注的人

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