自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 虚拟机类加载机制你真得了解吗?

在.java代码被编译成.class文件即字节码文件以后,在Class文件中描述的各类信息,最终都需要被加载到虚拟机当中才能运行和使用。Java虚拟机把描述类的数据从Class文件加载到内存中,并对数据进行校验,转换解析和初始化,最终形成可以被虚拟机直接使用的数据的过程,称为虚拟机类加载机制。在Java语言里面,类型的加载和、链接和初始化过程都是在程序运行期间完成的。类加载机制分为如下的三...

2020-05-07 21:39:30 332

原创 菜谱记录~

一,炒菜类一.抄土豆丝步骤:适量油,烧至中热,放入花椒,干辣椒,炒香待其快变色时,放入切好的土豆丝翻炒,需要加入调料,食用盐,鸡精,十三香。快抄好的时候放入些许醋。制作完成.备注:单独土豆丝可抄,和西红柿搭配也可以抄。二.雪山飞胡(白菜+西葫芦)步骤:适量油,烧至中热,放入蒜瓣和葱花,炒香待其快变色时放入西葫芦炒,小炒一下,放入白菜,翻炒,需要加入食用盐,鸡精,十三香,醋...

2020-02-15 23:13:32 483 1

原创 第③章 垃圾收集器与内存分配策略2

上一篇博客中对于垃圾收集的一些算法做了简单的介绍,那么这篇博客就主要说一下虚拟机的具体垃圾回收器都有哪些,分别是收集那些区域的,怎么搭配的,使用的哪些算法,有哪些优缺点。在开始介绍垃圾收集器之前说几点概念。一.基本概念1.枚举根节点,虚拟机不需要遍历整个方法区和与执行上下文去寻找GC ROOTS,而是在OopMap的这个数据结构中存储的就是对象的引用关系。直接通过这个数据结构可以...

2019-12-14 20:20:20 273

原创 第③章 垃圾收集器与内存分配策略1

这一节的主要内容讲的就是垃圾回收相关的内容,主要的有回收哪些内容?怎么回收?有哪些算法?1.jvm都会收集哪些区域呢?a)主要关注的是堆和方法区,因为在栈的内存随着函数的调用栈帧的开辟会被自动回收,所以不需要垃圾回收器来特别的关注。2.这么回收呢?a)首先判定哪些对象是存活的,对于非存活对象进行一系列的回收算法。下面都是详细为绕这个点讲的。3.如何判定对象是存活的呢?答:...

2019-11-27 00:56:13 224

原创 第2章 Java内存区域与内存溢出异常

简单来说这里说的就是JVM的内存区域。怎么理解JVM的内存区域呢?答:因为JVM就是一个进程,既然是进程所有就有自己虚拟地址空间,只是他和普通的进程不一样,JVM需要做的事情是执行java代码,所以说他的虚拟地址空间划分和管理就是有自己独特的个性。但是总的来说他还是虚拟地址空间,尽管不一样但是也还是很类似的。对JVM内存有了大致的认识以后接下来就可以详细来看看他其中都划分了哪些的区...

2019-11-23 23:25:45 197

原创 第②章一个简单得servlet容器

本章的主要内容是:第一个描述的是最基本的web容器,但是他只能处理静态的请求,不能处理servlet代码,即动态的网页。所以这一章就给出了最基础版本的可以处理静态和动态的servlet容器。下面给出主要的代码1.PrimitiveServlet这里首先给出对应的servlet的代码。这里的servlet代码实现了Servlet接口注意:所有的自定义的servlet类都必须实现jav...

2019-11-18 01:13:30 193

原创 单例模式

创建型的模式主要关注的点是:怎么样去创建对象。它的特点就是将对象的创建和使用进行分离。这样的话可以降低耦合度,使用者不需要关注对象的创建细节,对象的创建由相关的工厂来完成,就像我们去商场购买商品时,不需要知道商品是怎么生产出来一样,因为它们由专门的厂商生产。创建型模式分为以下几种。单例(Singleton)模式:某个类只能生成一个实例,该类提供了一个全局访问点供外部获取该实例,其拓展...

2019-11-17 19:53:26 157

原创 设计模式7大原则

为什么要遵守七大原则:在软件开发中,为了提高软件系统的可维护性和可复用性,增加软件的可扩展性和灵活性,程序员要尽量根据 7 条原则来开发程序,从而提高软件开发效率、节约软件开发成本和维护成本。我们将在下面的几节中依次来介绍这 7 条原则,本节首先介绍开闭原则。1.开闭原则开闭原则的核心思想:软件实现应该对扩展开放,对修改关闭,其含义是说一个软件应该通过扩展来实现变化,而不是通过修...

2019-11-17 18:59:12 219

原创 设计模式中类之间的关系

一.依赖关系在代码中一般是:某个类的方法通过局部变量,方法的参数,静态方法的调用来访问另外一个类中的的一些方法来完成自己当前方法的一些职责的这种情况就是依赖关系。带箭头的虚线来表示,箭头所指的类是被依赖的类。二.关联关系在代码中一般是:将一个类的对象作为另外一个类的成员变量来实现关联关系。当然可以是双向的关联关系,也可以是单向的关联关系。单向关联关系:用一个带箭头的实线表示...

2019-11-16 22:34:20 767

原创 第①章-一个简单的web服务器

主要内容:本节的主要内容介绍了http请求和响应报文,并且编写了一个简单的http服务器的例子,来说明java是如何创建web服务的。这个例子使用了三个类来实现分别是: HttpServer:主要用来接收浏览器的请求,并且创建Request对象和Response对象来进行请求资源的提取和对应返回给浏览器对应的数据。 Request:主要用来提取请求报文中数据,提取uri ...

2019-11-10 20:35:22 317 1

原创 博客新地址

博客新地址:http://www.lishuaii.top,以后博客会在这里更新。。最近域名没有备案,先用ip访问吧。。http://39.105.189.109/

2018-03-08 09:35:01 725

原创 shell编程2

一.正则表达式概念:规定一些特殊语法表示字符类、数量限定符和位置关系,然后用这些特殊语法和普通字符一起表示一个模式,这就是正则表达式(Regular Expression)。例如email地址的正则表达式可以写成[a-zA-Z0-9.-]+@[a-zA-Z0-9.-]+.[a-zA-Z0-9_.-]+,IP地址的正则表达式可以写成[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,

2018-02-19 19:22:37 321

原创 shell编程1

一.shell的简单介绍Shell的作用是解释执行用户的命令,用户输入一条命令,Shell就解释执行一条,这种方式称为交互式(Interactive),Shell还有一种执行命令的方式称为批处理(Batch),用户事先写一个Shell脚本(Script),其中有很多条命令,让Shell一次把这些命令执行完,而不必一条一条地敲命令。Shell脚本和编程语言很相似,也有变量和流程控制语句,但S

2018-02-19 11:51:49 395

原创 线程-线程同步

1.线程同步同步即协同步调,按预定的先后次序运行。线程同步,指一个线程发出某一功能调用时,在没有得到结果之前,该调用不返回。同时其它线程为保证数据一致性,不能调用该功能。举个例子:内存中100字节,线程T1欲填入全1, 线程T2欲填入全0。但如果T1执行了50个字节失去cpu,T2执行,会将T1写过的内容覆盖。当T1再次获得cpu继续从失去cpu的位置向后写入1,当执行结束

2018-02-17 15:57:11 303

原创 线程-线程属性

首先承上启下一下一线程属性概念性问题:linux下线程的属性是可以根据实际项目需要,进行设置,之前我们讨论的线程都是采用线程的默认属性,默认属性已经可以解决绝大多数开发时遇到的问题。如我们对程序的性能提出更高的要求那么需要设置线程属性,比如可以通过设置线程栈的大小来降低内存的使用,增加最大线程个数。typedef struct{int etachstate; /

2018-02-16 14:30:28 481

原创 线程-线程控制原语

1.pthread_self函数获取线程ID。其作用对应进程中getpid() 函数。pthread_t pthread_self(void); 返回值:成功:0; 失败:无!线程ID:pthread_t类型,本质:在Linux下为无符号整数(%lu),其他系统中可能是结构体实现线程ID是进程内部,识别标志。(两个进程间,线程ID允许相同)注意:不应使用全局变量 pthre

2018-02-16 11:15:47 504

原创 git学习--分支管理

严格的来说HEAD不是指向提交,而是指向master,master才是指向分支的,所以HEAD指向的就是当前的分支。每当我们commit一次的时候提交就会向前走一步,git把这些提交串成一条时间线,这个时间线就是一个分支。分支的作用:举个例子,假如当前有一个文件readme.txt,我们新创建了一个分支dev,然后切换到这个分支工作对readme.txt进行修改,然后提交,这个提交是提

2018-02-11 19:40:12 364

原创 git学习-修改删除

1.当你对于文件进行了修改还没有进行git add 和git commit的时候,发现了一个错误,这个时候你可以撤销修改命令:git checkout -- file,丢弃对工作区的修改,演示如下:2.当你修改文件后,还添加到暂存区了命令:git reset HEAD readme.txt这个命令可以把暂存区的修改退回到工作区,当我们同HEAD时表示最新的版本

2018-02-11 16:01:01 279

原创 git学习笔记--版本回退

铺垫:我已经成功给版本库里面添加并且上传了一个文件readme,txt一.gitstatus当我们成功的添加并且提交了一个readme.txt文件以后,我们对文件继续进行了修改。修改完成以后我们使用git status命令查看结果(git status可以让我们时刻掌握仓库当前的状态)上面的显示告诉我们,readme.txt被修改了,但是还没有准备提交我刚才修改的文件。虽然

2018-02-11 15:29:28 370

原创 信号--信号集操作函数简单介绍

当你看到这里的时候一定对于信号有了一定的了解,但是还是做一点简单的铺垫比较好。1.每个进程收到的信号都是由内核发送,内核处理的。2.内核通过读取未决信号集来判断信号是否应该被处理,信号屏蔽字(mask)可以影响未决信号集。3.Linux内核的进程控制块PCB是一个结构体,task_struct,除了包含进程id,状态,工作目录,用户id,组id,文件描述符表,还包含了信号相关的信息

2018-02-11 12:48:01 537

原创 进程间通信(IPC)-mmap基本概念

想了解的mmap的前提需要知道存储映射I/O:解释:存储映射I/O (Memory-mapped I/O) 使一个磁盘文件与存储空间中的一个缓冲区相映射。于是当从缓冲区中取数据,就相当于读文件中的相应字节。于此类似,将数据存入缓冲区,则相应的字节就自动写入文件。这样,就可在不适用read和write函数的情况下,使用地址(指针)完成I/O操作。使用这种方法,首先应通知内核,将一个指定文件映射到存储...

2018-02-10 14:24:15 1135

原创 红黑树RB-tree

AVL之外,另外一个颇具历史并且被广泛运用的平衡二叉搜索树是RB-tree(红黑树),所谓的红黑树其实也是一个二叉搜索树,但是他对二叉搜索树的每个结点是必须满足如下规则的。1.每个结点不是红色就是黑色2.根节点为黑色3.如果结点为红色,其子节点必须为黑色(即不能有两个连续的红色结点,黑色结点可以连续)4.任意结点至NULL(树尾端)的任何路径,所含的黑色结点数必须相同。如下图就

2018-02-09 19:45:11 475

原创 刷题 2-4

题目一:矩覆盖形题目描述:我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?解法:列举找规律,最后发现其实是斐波那契数列非递归int rectCover(int number){ if (number == 0) return 0; if (number == 1) return 1; i

2018-02-04 21:41:19 279

原创 AVLBinTree(二叉平衡树)

由于二叉搜索树的不平衡性会导致搜索的效率降低(比如单支情况),所以在将二叉搜索树升级改造成为了二叉平衡树。AVL树是一个“加上了额外平衡条件”的二叉搜索树,其平衡为为了保持整个树的深度为O(logN),直观上的最佳平衡状态是每个节点的左右子树的高度相同,但是这个条件过于严苛,所以AVL树退而求次之,它的要求就是任何节点 的左右子树高度相差最多1,虽然这是一个比较弱的条件,但是足够保持树的平衡了

2018-02-04 00:25:20 416

原创 构造函数语意学---Default Constructor的构造操作

此篇博客的主要内容:默认构造函数什么时候被编译器创造出来,并且做了哪些事。1.首先默认构造函数在需要的时候会被创建出来,这里的需要有两种解释1.编译器的需要,2.程序的需要,当然编译器如果需要的话那么编译器就会自己合成默认构造函数,但是如果程序需要的话那就是程序员的事情了,编译器才不会去帮程序员合成默认构造函数呢。下面举个例子来说明被程序需要的默认构造函数class Foo{pub

2018-02-01 21:24:23 466

原创 二叉搜索树

此篇博客主要讲一下二叉搜索树的一下基本操作的实现,关于概念性的问题就不啰嗦了1.首先给出搜索树结点的定义templatestruct BSTNode//树的结点{ BSTNode *_pLeft; BSTNode *_pRight; K _data; V _value; BSTNode(const K &data, const V &value) :_data(data

2018-01-29 18:48:27 302

原创 计数排序和基数排序()

这两种排序方法是不需要比较的排序方法。下面我来一个一个介绍1.基数排序基本算法:遍历一遍原数组,将其每个元素出现的次数用一个足够容纳其范围的数组来标记,即统计每个元素出现了多少次,然后在遍历这个标记数组来还原原数组,这样就拍好序了下面给出算法代码:void CoutSort(int arr[], int size){ //统计最大最小的元素 int Maxdata = arr

2018-01-26 21:09:48 389

原创 归并排序---递归&&非递归

首先简单的介绍一下归并算法的核心思想将我们将一组数据分成若干个组,即分到每组数据为1个元素的情况下就不用分了,然后在分别比较每两组数据元素的大小,将其合并为一组数据再去和其他同等级别的组的数据元素取比较,然后合并到临时的空间中然后在复制给原空间,依此类推,直到最后全部合并完毕,数组就成为一组有序序列了。下面举个例子1.归并排序的递归写法上述图示其实已经很明白了,下面给出算法结合

2018-01-26 01:23:54 521

原创 简单的Makefile

一.首先来简单的介绍一下什么是makefilemakefile简单来说就是管理我们的源文件的,方便我们去编译。举个例子假如我们写了一个项目里面有add.c mul.c sub.c div.c test.c head.h的话,假如要自己去编译这个文件的话,我们需要这样写gcc test.c sub.c div.c mul.c sub.c  -o app(注意:因为头文件和.c文件在一个文件夹

2018-01-23 09:42:31 425

原创 快速排序

首先快速排序有三种方式下面我来一一介绍1.最基本的方式,基准值法算法描述:取第一个或最后一个元素为基准值(我在这里取第一个元素),然后定义两个标记left和right分别指向数组的起始位置和最后一个位置,然后right从后往前走找到小于基准值的时候停下来,left开始往后走,找到大于基准值的元素的停下来,然后交换arr[left]和array[right]的值,重复上述步骤直到left>=

2018-01-21 15:15:47 467

原创 条款25:考虑写出一个不抛出异常的swap函数

首先本篇博客的主要思想是:系统自带的swap函数有时候不能满足我们的需求,所以在一些情况下我们就需要自己去写swap函数。此条款的主要内容就是告诉你该如何去写你要的swap函数,下面开始正文来好好地介绍一下此条款的内容1.首先来看一下库里面给的swap函数的原型可以看出来标准程序库提供的swap函数是这样的实现的,通过拷贝和赋值来实现。可以看出来他也没有提供异常安全,所以在我们自己

2018-01-20 15:34:04 276

原创 条款24:若所有参数需要类型转换,请为此采用no-member函数

本条款的核心内容是:如果一个函数的所有参数(包括this指针所指的那个隐喻的参数)需要进行类型转换的时候,那么这个函数必须是非成员函数。当然这句话只是内含真理,并不是说就是真理,因为在加入模版编程的时候,就会又有一些新争议,新解法,以及令人惊讶的一些设计。这些将形成了条款46下面我来详细介绍本条款:

2018-01-19 13:28:53 481

原创 排序--插入排序&&希尔排序

一.插入排序1.直接插入排序简单说明:是一种稳定的排序算法(稳定就是说两个数的大小一样的话不会交换位置),时间复杂度为O(N^2)插入排序的时间复杂度分析。在最坏情况下,数组完全逆序,插入第2个元素时要考察前1个元素,插入第3个元素时,要考虑前2个元素,……,插入第N个元素,要考虑前 N - 1 个元素。因此,最坏情况下的比较次数是 1 + 2 + 3 + ... +

2018-01-12 15:31:37 421

原创 哈夫曼树的实现

在这里关于什么是哈夫曼树就不多说了,自己去查阅相关的资料书籍,下面来说说如何实现哈夫曼树。首先语言描述一下实现的步骤:假设这里给出得到数组元素为5,3,1,7  1.在当前数组中找出最小的两个数各自为一个结点生成如下:

2018-01-10 11:17:05 2732 1

原创 大小堆&&堆排序&&堆的应用

一.首先说一下堆的概念吧这里就不按照标准的概念来说了,就说说我理解的堆。堆就是一个数组中的元素,参考着完全二叉树的这种数据结构存储在数组中,这样就是一个堆。注意:这里是参考,实际的存储还是在数组中,只不过数组中的存储顺序满足完全二叉树而已。说到堆离不开大小堆,下面继续介绍大小堆的概念。1.最小堆:因为数组中的元素是参考完全二叉树的存储顺序存储的,所以小堆就是每一个双亲结点的值都

2018-01-09 16:05:23 1190 1

原创 青蛙跳台阶&&变态跳台阶

题目一:一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法。解题思路:1.首先可以把它当成一个找规律的问题,然后总结出规律的方程式就可以了。因为题目限制只有两种跳法,所以这里规律就比较好总结 1阶:1种 2阶:2种 3阶:3种 4阶:5种 5阶:8种 …………………. f(n)=f(n-1)+f(n-2), 这个规律怎么得出来的呢?举个例子,假如

2017-12-27 13:25:52 609

原创 斐波那契数列

问题描述:大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项。n<=39 解题方法: 1.非递归,利用迭代 算法实现如下:int Fibonacci(int n){ int a = 1; int b = 1; int c = 0; if (1 == n || 2 == n) return 1; if (n

2017-12-24 21:45:22 344

原创 找出旋转数组的最小的元素

问题描述:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。 NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。函数接口:int minNumberInRotateArray(vectorint> rotat

2017-12-23 13:03:28 433

原创 线索化二叉树&&线索化后的二叉树遍历

能看到线索化二叉树这块的对于一些概念性的问题肯定就有了一定的了解,这里就不多说了,下面直接上正餐因为线索话的话,当左子树为为空的时候我们需要让其指向其前驱元素,当右子数为空的时候我们需要让其指向其后继的元素,这样就把整个二叉树线索化起来了,因为我们就需要标记一下左右子树是否被线索花,在这里我们用枚举来作为标记enum//用来标记是否线索化,LINK表示有左右子树没有被线索化,THREAD表

2017-12-09 13:28:36 636 1

原创 两个栈实现队列

问题描述:用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。函数接口:void push(int node) int pop()解题方法:首先对于实现队列push的方法只需要将元素放入stack1中就可以了,对于队列pop的方法,首先判断stack2是否为空,如果为空直接将stack1中的所有元素全部弹出栈并且压入stack2中

2017-12-07 22:11:05 265

空空如也

空空如也

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

TA关注的人

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