自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(44)
  • 资源 (1)
  • 收藏
  • 关注

原创 2021-04-07

Spring设计原理分析

2021-04-07 00:18:53 89

原创 深入分析ClassLoader工作机制

ClassLoader类结构分析findClass:获取到要加载类的字节码defineClass:用来将byte字节流解析成JVM能够识别的Class对象,有了这个方法,我们可以直接通过class文件实例化对象,如果直接调用这个方法生成的class对象还没有resolve,resolve将会在这个对象真正实例化时进行。loadClass:加载类resolveClass:调用defineClass方法生成类对象后,如果想让类在被加载到JVM中时就被链接(Link),可以调用resolveCla

2021-03-03 00:26:11 202

原创 线程总结

线程的概念: 线程是轻量级的进程,是一个进程内部的执行序列,一切进程至少都要一个执行线程。 进程与线程的区别: 1.线程是轻量级的进程,是一个进程内部的执行序列,一切进程至少都有一个执行线程。 2.进程是资源进程的基本单位,线程是程序执行的最小单位 3.线程共享进程数据,但也有自己的一部分数据: 线程id,一组寄存器,栈,error,信号屏蔽字,调度优先级注意: 线程有自己...

2018-08-10 20:23:25 175

原创 青蛙跳台阶问题

题目一:一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶,求该青蛙跳上一个n级台阶共有多少种跳法? 首先考虑2级台阶的跳法,显然只有一种跳法如果有2级台阶呢,也很简单,第一次跳一级或者第一次跳两级,有两种跳法再来考虑一般情况,我们把跳n级台阶的跳法看成是n的函数,即f(n) 当n > 2时,第一次跳的时候就有两种不同的选择: 一是第一次跳1级,这时跳法数目等于后面剩下的n ...

2018-07-11 11:23:30 246

原创 AVL树的旋转

···AVL树又称为高度平衡的二叉树。它能保持二叉树的高度平衡,尽量降低二叉树的高度,减少树的平均搜索长度。 ···AVL树有以下几条性质: ·····1.左子树和右子树的高度之差的绝对值不超过1 ·····2.树中的每个左子树和右子树都是AVL树 ·····3.每个节点都有一个平衡因子,任一节点的平衡因子是-1,1,0.(每个节点的平衡因子等于右子树的高度减去左子树的高度) ·...

2018-07-10 11:52:39 239

原创 多态

1.多态概念   如果有几个相似而不完全相同的对象,有时人们要求在向他们发出同一个消息时,他们的反应各不相同,分别执行不同的操作。这种情况就是多态现象。例如甲乙丙三个班都是高二年级,他们有基本相同的属性和行为,在同时听到上课铃响时,他们会分别走进三个教师,而不会走向同一个教室。   在C++中,所谓多态性是指:由继承而产生的相关的不同的类,其对象对同一消息会作出不同的相应。多态性是面向对象程序...

2018-05-18 16:39:30 1356 2

原创 继承体系下派生类的对象模型

1.单继承 在定义继承时,如果一个派生类只有一个基础类,则称为单继承。class A //这就是一个简单的单继承{public: int _a;};class B : public A{public: int _b;};2.多继承 多继承即一个子类可以有多个父类,它继承了多个父类的特性。多继承可以看作是单继承的扩展。所谓多继承是指派生类...

2018-05-17 10:28:45 199

原创 C++中继承总结

继承机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能。这样产生新的类,称派生类。继承呈现了面向对象程序设计的层次结构,体现了由简单到复杂的认知过程。 继承的格式为   class DerivedClassName:acess-lable BaseClassName   {    …..    };   DerivedCla

2018-05-09 19:16:13 176

原创 C++双向循环链表

#include<stdio.h>#include<iostream>#include<assert.h>#include<string.h>#include<stdlib.h>using namespace std;typedef int DataType;struct Node{ Node* _pNext; Node* _pPre; DataType _dat

2018-05-09 15:52:28 139

原创 C++动态顺序表

#include<string.h>#include <iostream>#include<assert.h>#include<stdio.h>using namespace std;typedef int DataType;class SeqList{public: SeqList(size_t capacity = 10) //构造 :_ar

2018-05-09 15:50:37 179

原创 C++日期类

主要实现+,-运算符的重载(计算n天后,n天前的日期),==及!=运算符重载

2018-05-06 22:42:30 207

原创 C++的内存管理方式

C语言内存管理方式在C++中可以继续使用,同时C++又提出了自己的内存管理方式:通过new和delete运算符进行动态内存管理。   举例来说明他们的使用:void test(){ int *p0 = new int; //申请一个int大小字节的空间 delete p0; //释放空间 int *p1 = new int(2); //申请

2018-04-23 16:50:40 265

原创 Linux下实现一个自己的shell

#include &lt;stdio.h&gt;#include &lt;stdlib.h&gt;#include &lt;sys/wait.h&gt;#include &lt;unistd.h&gt;#include &lt;string.h&gt;#include &lt;ctype.h&gt;void do_shell(int argc, char *argv[]){    pid_t pi...

2018-04-12 22:29:49 404

原创 C++基础总结(C与C++不同,缺省参数,重载,引用,命名空间)

学完了面向过程的C语言,现在开始学习面向对象的C++,先了解一下面向过程与面向对象的区别:  面向过程就是分析出解决问题的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个调用就行。    面向对象是把构成问题事物分解成各个对象,建立对象的目的,不是为了完成一个步骤,而是为了描述某个事物在整个解决问题的步骤中的行为。C与C++的不同:1.关键字的不同:  C99标准下C语言的关键字有32

2018-04-08 22:23:45 158

原创 开散列哈希

Common.h#pragma once// 使用素数表对齐做哈希表的容量,降低哈希冲突unsigned long GetNextPrime(unsigned long num);Common.c#include "Common.h"#define _PrimeSize 28unsigned long _PrimeList[_PrimeSize] ={ 53ul, 97ul, 1

2018-04-06 15:32:18 154

原创 闭散列哈希

先引入素数表,可以有效降低哈希冲突Common.h#pragma once// 使用素数表对齐做哈希表的容量,降低哈希冲突unsigned long GetNextPrime(unsigned long num);Common.c#include "Common.h"#define _PrimeSize 28unsigned long _PrimeList[_PrimeSize] ={

2018-04-06 15:27:40 165

转载 进程调度算法

在操作系统中存在多种调度算法,其中有的调度算法适用于作业调度,有的调度适用于进程调度,有的调度算法两者都适用。进程调度算法:在系统角度来说,公平性:每个进程(不论优先级)都会有机会被运行;较大的吞吐量。用户角度:及时性:响应速度快;较短的周转时间,不应当让用户等待时间过长。常见的调度算法:1.时间片轮转法:在分时系统中,都采用时间片轮回转法。简单轮回法:系统将所有就绪进程按FIFO规则排队,按一定...

2018-03-31 21:35:58 233

原创 使用代码模拟实现僵尸进程, 孤儿进程的场景

Z(zombie)—僵尸进程 · 僵尸进程是一个比较特殊的状态。当进程退出并且父进程没有读取到子进程退出的返回代码时就会产生僵尸进程。 · 僵尸进程会以终止状态保持在进程表中,并且会一直在等待父进程读取退出状态代码。 · 所以,只要子进程退出,父进程还在运行,但父进程没有读取子进程状态,子进程进入僵尸状态。 僵尸进程的危害 · 进程的退出状态必须被维持下去,因为他要告诉关心他的进程(父进程

2018-03-31 21:34:30 223

原创 在Linux下实现一个彩色进度条(详)

第一步:编写进度条的代码 输入命令行:vim pb.c编写代码:#include <stdio.h>#include <unistd.h>#include<string.h>int main(){ int i = 0; char bar[101]; const char *lable = "|/-\\"; for(i=0;i<=100;i++) {

2018-03-29 20:33:54 221

原创 简单vim的配置

这两天spacevim的插件有问题,所以我在网上找了一个简单的vim,安装过程很简单。支持的系统兼容 centos6.5 i686 和 x86_64, 兼容 centos7. vim版本 &gt;= 7.0 即可。折腾 git(1)直接 yum install git 后, 发现 HTTP request failed 的问题.原因是由于 git 版本态度(1.7.1), 需要升级到高版本.由于 ...

2018-03-29 12:57:00 229

原创 基数排序详解

基数排序法又称“桶子法”(bucketsort)或binsort,顾名思义,它是透过键值的部份资讯,将要排序的元素分配至某些“桶”中,藉以达到排序的作用,基数排序法是属于稳定性的排序,其时间复杂度为O(nlog(r)m),其中r为所采取的基数,而m为堆数,在某些时候,基数排序法的效率高于其它的比较性排序法。   下面以LSD(按从低位到高位i的方式)为例说明这种排序的原理。   1.先按最低位将数...

2018-03-27 22:17:17 808 1

原创 选择排序及其优化

普通选择排序及其优化算法

2018-03-26 15:42:48 144

原创 Linux新手入门

1.常见指令2.进入目录需要哪些权限, 在目录中执行增删查(cd, touch, ls, rm, mv等)改文件动作, 需要哪些权限.3.Linux下的重要目录4.重要命令.5.如何使用命令安装gcc/g++, gdb, vim

2018-03-24 11:10:37 208 1

原创 直接插入排序的C实现

用一张图来简单描述直接插入排序的过程:代码实现如下:#include&lt;stdio.h&gt;#include&lt;stdlib.h&gt;void Insertsort2(int arr[], int n){ int i, j; for (i = 1; i &lt; n; i++) { int tmp = arr[i]; if (arr[i] &lt; arr[i - 1]) { ...

2018-03-18 09:28:31 224

原创 二叉树线索化的C语言实现

什么是二叉线索化:   当用二叉链表作为二叉树的存储结构时,因为每个结点中只有指向其左、右儿子结点的指针,所以从任一结点出发只能直接找到该结点的左、右儿子。在一般情况下靠它无法直接找到该结点在某种遍历序下的前驱和后继结点。如果在每个结点中增加指向其前驱和后继结点的指针,将降低存储空间的效率。 先用一张图来说明怎样对二叉树进行线索化      root表示二叉树子树的根节点,prev是上一个访

2018-03-14 21:06:44 1498 1

原创 二叉搜索树的实现

二叉搜索树(BinarySortTree),又称二叉查找树、二叉排序树。它或者是一棵空树;或者是具有下列性质的二叉树: 1.若左子树不空,则左子树上所有结点的值均小于它的根结点的值; 2.若右子树不空,则右子树上所有结点的值均大于它的根结点的值; 3.左、右子树也分别为二叉排序树。若子树为空,查找不成功。 (本文对二叉搜索树的删除作详细解释) 代码实现: 头文件: BSTree.h#p

2018-03-10 20:20:26 140

原创 用C实现堆排序

堆排序(Heapsort)是指利用堆积树(堆)这种 数据结构所设计的一种 排序算法,它是选择排序的一种。可以利用 数组的特点快速定位指定索引的元素。堆分为大根堆和小根堆,是 完全二叉树。      本次堆排序利用了小根堆堆顶记录的 关键字最小这一特征,使得在当前无序区中选取最小关键字的记录变得简单。  用小根堆排序的基本思想:  ① 先将初始文件R[1..n]建成一个小根堆,此堆为初始的无序区

2018-03-10 10:56:01 316

原创 用C实现堆的基本操作

C语言实现堆

2018-03-10 10:44:47 302 1

原创 二叉树的基本操作

头文件: BStack.h#ifndef _BSTACK__H_#define _BSTACK__H_#include<assert.h>#include<stdlib.h>#include<stdio.h>#include<string.h>#include <ctype.h>#define MAX_SIZE 20typedef char* Datatype;//typedef

2018-03-08 21:52:18 136

原创 一个数组中只有两个数字是出现一次,其他所有数字都出现了两次,找出这个数字

#include&lt;stdio.h&gt;int main(){ int arr[] = { 1, 1, 2, 2, 3, 4, 5, 5 }; int i = 0; int j = 0; int flag = 0; for (i = 0; i &lt; sizeof(arr) / sizeof(arr[0]); i++) { flag = 0; for (j = 0; j &lt; si...

2018-02-10 11:35:38 506

原创 实现一个顺序表

头文件:ag.h#ifndef __ag_H__ #define __ag_H__ #include<stdio.h> #pragma warning(disable:4996)#define MAX_SIZE 10typedef int DataType;typedef struct SeqList{ DataType _arr[MAX_SIZE]; int _size

2017-12-04 21:31:36 354

转载 时间复杂度与空间复杂度详解

算法的时间复杂度和空间复杂度合称为算法的复杂度。1.时间复杂度(1)时间频度 一个算法执行所耗费的时间,从理论上是不能算出来的,必须上机运行测试才能知道。但我们不可能也没有必要对每个算法都上机测试,只需知道哪个算法花费的时间多,哪个算法花费的时间少就可以了。并且一个算法花费的时间与算法中语句的执行次数成正比例,哪个算法中语句执行次数多,它花费时间就多。一个算法中的语句执行次数称为语句频

2017-11-29 10:44:58 242

原创 可变参数列表求最大值与平均值

求最大值:#include<stdio.h>#include<Windows.h>#include<stdarg.h>#pragma warning(disable:4996)int Max(int n, ...){ va_list arg; int val = 0; int max = 0; int i = 0; va_start(arg, n);

2017-11-28 23:16:55 262

原创 sscanf与sprintf

看到sscanf与sprintf,大家一定会联想他们与scanf、printf的关系。 下面就介绍一下sscanf与sprintf函数: sscanf:int sscanf( const char *buffer, const char *format [, argument ] ... );sscanf与scanf类似,都是用于输入的,只是后者以键盘(stdin)为输

2017-11-27 15:34:51 327

原创 二进制文件的I/O

二进制文件的I/O使用的是fread, fwrite函数。 先来看函数参数:size_t fread( void *buffer, //Storage location for data. size_t size, //Item size in bytes. size_t count, //Maximum number of items to be read. F

2017-11-27 12:02:49 405

原创 动态内存函数

当我们需要需要内存时,通常的开辟方法开辟的空间大小是提前设定好的的,如果要使用的空间大小在程序运行时才能知道,就要选择动态内存开辟了。 动态内存函数有malloc, calloc, realloc, free。 前三个函数是开辟或者改变空间的函数,free是释放内存的函数。 如果内存使用完没有用free释放掉,就会出现内存泄漏问题。 内存泄漏是指这样一种场景:程序分配了一块内存,但已经不再持

2017-11-25 15:28:47 213

原创 自定义类型:结构体,枚举,联合

结构体(struct)是由一系列具有相同类型或不同类型的数据构成的数据集合,也叫结构。 先来声明一个结构体:struct tag{ member-list;}variable-list; 在声明结构的时候,可以不完全声明:struct { int a; int b; char c;}x;struct { int a; float b; c

2017-11-25 11:40:43 239

原创 简易计算器(利用函数指针数组)

#include<stdio.h>#include<windows.h>#pragma warning(disable:4996)int add(int a, int b){ return a + b;}int sub(int a, int b){ return a - b;}int mul(int a, int b){ return a * b;}int

2017-11-17 10:41:21 384

原创 指针与指针进阶

开始先来介绍一下什么是指针:  在计算机科学中,指针是编程语言中的一个对象,利用地址,它的值直接指向存在电脑存储器中另一个地方的值。由于通过地址能找到所需的变量单元,可以说,地址指向该变量单元。因此,将地址形象化的称为“指针”。意思是通过它能找到以它为地址的内存单元。   简单来说,指针就是变量,用来存放地址的变量。下面介绍指针数组与数组指针: 数组和指针有什么联系吗?    答案是:没有。

2017-11-16 23:43:08 321

原创 C语言中的宏

先来介绍一些预处理标识符: *__*LINE__:表示进行编译的当前文件当前所在的行号。 *__*FILE__:进行编译的源文件所在目录。 *__*DATE__ :表示当前文件被编译的日期。 *强调内容*TIME :⽂件被编译的时间,精确到秒。 使用 # ,把一个宏参数变成对应的字符串。 ##可以把位于它两边的符号合成一个符号。 这些预定义符号都是语言内置的,可以直接使用。

2017-10-22 21:45:55 315

Spring插件(含有mybatis插件)

spring的插件,包含spring的IOC,DI, AOP,Mybatis的插件

2019-04-03

空空如也

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

TA关注的人

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