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

原创 分析数据库索引原理及其优化

一.概述本文以Mysql数据库为研究对象,因为Mysql支持多存储引擎,每种存储引擎支持不同的索引,因此Mysql支持多种索引类型,本文以BTree为说明,Mysql经常用到的索引类型就是BTree。二.常见的查询算法和数据结构为什么要讲这个呢?因为之所以要建立索引就是为了建立一种数据结构,在这之上应用一种高效的查询算法,加快查询速度。1.索引(Index)的本质是帮助Mysql高效获取...

2019-03-24 13:03:47 240

原创 动态规划总结及Leetcode经典题目解答

动态规划就是以一种新的角度对问题进行观察,将问题转变,能以递归或者递推的方式解决。为了达到最终的状态,需要依据之前的一个或者最优的几个结果,不管之前的状态是如何达到的。1.通过拆分问题,定义状态和状态之间的关系,从而使问题以递归的形式解决2.核心在于状态的定义和状态转移方程状态转移方程1.状态边界情况2.状态转移方程动态规划问题的求解:1.通过将问题进行转变,定义问题以及子问题2...

2019-03-22 13:23:50 876

原创 贪心算法总结及LeetCode经典题目解答

贪心算法贪心算法的定义:在么一个阶段都选取当前阶段的最优选择,同时不考虑后续的决策影响。贪心算法的要素:**·**贪心选择性质:全局最优可以通过一系列的局部最优来求解同时将问题通过一系列的局部最优得到了简化,同时进行求解。**·**最优子结构:原问题的最优解包含着子问题的最优解这意味着可以通过对子问题的求解构建规模更大的问题。LeetCode55跳跃游戏给定一个非负整数数组,...

2019-03-22 12:57:21 2536

原创 回溯算法详解及Leetcode经典例题解答

什么是回溯法?在程序设计中,有相当一类求一组解,或求全部解或求最优解的问题,例如读者熟悉的八皇后问题,不是根据某种特定的计算法则,而是利用试探和回溯的搜索技术求解。回溯法也是设计递归过程的一种重要方法,它的求解过程实质上是一个先序遍历一棵"状态树"的过程,只是这棵树不是遍历前预先建立的,而是隐含在遍历过程中。—《数据结构》(严蔚敏)首先,某种问题的解我们很难去找规律计算出来,没有公式可循,只...

2019-03-21 18:10:12 895

原创 递归算法思想详解

我相信很多人在做leetcode中的关于树的问题时会很惊讶别人用递归写出来的简洁高效的算法,但是如果自己写就很难实现,那么就赶紧来弄清楚递归到底是什么,怎么来实现呢?递归是什么?有人应该都会脱口而出递归就是自己调用自己。。。在知乎搜索的时候看到了一个特别完美的答案:递归:你打开面前这扇门,看到屋里面还有一扇门。你走过去,发现手中的钥匙还可以打开它,你推开门,发现里面还有一扇门,你继续打开它...

2019-03-21 11:47:50 773

原创 最大堆最小堆数组实现

数组实现最小堆假设堆中节点从下标0开始,那么从最后一个非叶子节点开始,从右向左,从下向上调整堆,每次比较父节点和他的左右两个子节点,若大于他们,则和较小的子节点交换。代码实现public class Test{ //堆调整 public static void initHeap(int []arry,int i,int len){ int child,temp; while(2*...

2019-03-19 09:15:16 761

原创 找出数组中每一个元素右边第一个大于它的数

解题思路:整体思路有点像映射的关系,如果存在对应元素的比它第一个大的数,就在一个数组对应位置存在这个大值,具体思路如下:利用栈,从左到右依次压入数组中元素的索引,每次判断待压入的下一个元素是否大于占栈顶索引对应的元素,若大于,就将元素存到一个新的数组res中,将栈顶索引出栈,对应位置就是栈中刚刚出栈的索引,若小于就压入栈中。最后判断一下剩余的元素,没有大于它的就在res索引位置置-1.代码实...

2019-03-18 22:06:33 1943

原创 循环有序数组的二分查找

问题:请实现以下函数int indexOf(int [] array ,int key) ,给定一个循环有序的数组,请在这个数组中找到指定元素,找到的话返回下标,没找到返回-1。:解决:首先,使用二分查找找到数组的 “临界点”,临界点满足两个情况:array[left] < array[mid]array[left] <= array[mid]只有确定分界点,确定了key的范...

2019-03-18 17:34:35 881

原创 Leetcode215数组中的第k大的数

在未排序的数组中找到第 k 个最大的元素。请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。示例 1:输入: [3,2,1,5,6,4] 和 k = 2输出: 5示例 2:输入: [3,2,3,1,2,4,5,5,6] 和 k = 4输出: 4说明:你可以假设 k 总是有效的,且 1 ≤ k ≤ 数组的长度。解题思路利用快速排序的思想,在第一次交...

2019-03-18 16:21:28 391

原创 二分查找算法及其优化

二分查找是一种非常高效的算法,又称折半查找,下面用递归和非递归实现二分查找的思想有序序列,每次取序列的中间元素和目标元素进行对比,每次缩小一半的查找范围,这样直到找到为止。二分查找图示说明:(图片来自百度)使用递归实现public static int recursionBinarySearch(int[] arr,int key,int low,int high){ if(k...

2019-03-18 15:11:20 1851

原创 经典七大排序算法逐一攻破

排序算法说明1.排序的定义:对一序列对象根据某个关键字排序2.评价算法优劣的术语说明稳定:如果a原本在b前面,而a=b,排序之后a仍然在b的前面;**不稳定:**如果a原本在b的前面,而a=b,排序之后a可能会出现在b的后面;**内排序:**所有排序操作都在内存中完成; 外排序:由于数据太大,因此把数据放在磁盘中,而排序通过磁盘和内存的数据传输才能进行;时间复杂度: 一个算法执行所耗费...

2019-03-18 14:19:58 410 1

原创 C++内存管理详解

一.C中的内存管理方式在堆上创建空间malloc申请空间需要自行free释放,还可以用calloc,realloc来申请,都要free进行释放,否则容易造成内存泄漏。在栈上创建空间编译器会自动在栈上动态开辟内存,用_alloc来开辟,并自主进行维护。二.c++中的内存管理2.1内存分配方式在c++中内存分为五个区,栈,堆,自由存储区,全局/静态存储区,常量存储区栈:存储局部变量,函...

2019-03-18 11:17:12 169

原创 JavaI/O流重要方法及代码示例

再复习一下I/O流中类的继承关系一.字节流1.输入流:FileInputStream2.输出流:FileOutputStream示例代码import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOExcept...

2019-03-18 08:55:29 200

原创 面向对象三大特性——多态

Java中的多态就是对象的多态,可以分为两种类型:引用多态和方法多态一.引用多态父类的引用可以指向本类对象父类的引用可以指向子类的对象让我们用代码来解释,先创建一个父类Animal和子类Dog,在主函数中书写如下但是我们不能把子类的引用直接指向父类的对象,如下:为什么不能呢?用通俗点的话来解释,我们可以说狗是一种动物,但不能说动物是一种狗,这样就颠倒了属性的从属关系,当父类引用指向子...

2019-03-15 14:48:21 142

原创 Java虚拟机类的加载机制

一.类的生命周期类的生命周期从类加载到虚拟机中内存,到卸载出内存为止。二.类加载的过程类加载的全过程:加载——验证——准备——解析——初始化1.加载类的加载阶段就是由类加载器负责根据类的全限定名来读取该类的二进制字节码文件到JVM中,并存储在方法区中,在堆区中生成该类java.lang.Class对象,作为方法区这个类的各种数据访问的入口。链接阶段:链接阶段要做的是将加载到JVM中的...

2019-03-14 21:58:52 150

原创 HTTP和HTTPS通信原理

一.HTTP通信原理直接用一张图完美的解释客户端输入URL回车,DNS解析域名得到服务器的IP地址,服务器在80端口监听客户端请求,端口通过TCP/IP协议(可以通过Socket实现)建立连接。HTTP属于TCP/IP模型中的运用层协议,所以通信的过程其实是对应数据的入栈和出栈。二.HTTPS实现原理1.client向server发送请求https://baidu.com,然后连接到se...

2019-03-12 18:30:19 1203

原创 全面学习JVM内存管理及GC机制(二)

一.虚拟机中的GC过程1.1为什么要分代回收?在一开始的时候,JVM的GC采用的就是标记-清除-压缩的算法进行回收内存,但是当分配的对象很多,对象的列表变大,扫描和移动的时间很长,反而内存回收会特别慢。然而,经过对java应用的分析,发现大部分对象的存活时间较短,下面的图可以看出java对象在内存中存活时间的统计:从上表中可以看出,存活时间长的对象只占一小部分,所以对堆中采取分代管理内存和分...

2019-03-11 20:19:51 120

原创 理解HTTP协议

概述在如今的互联网中,应用层的协议中重要的也是很容易理解的莫非Web的HTTP协议了,它叫做超文本传输协议(HyperText Transfer Protocol)。现在我将从HTTP协议的概念,特性,重要知识点和学习中常见的困惑问题来介绍HTTP协议。一.理解什么是HTTP协议1.HTTP协议是用于从万维网服务器传送超文本到本地浏览器的传送协议。2.HTTP协议是基于TCP/IP通信协议...

2019-03-11 20:17:50 398

原创 全面学习JVM内存管理及GC机制(一)

一.为什么要学习这些?Java GC(Garbage Collection垃圾回收机制)是Java不同C++/C的主要主要区别之一,作为Java开发者,随着GC机制的日益完善,不需要编写内存回收和垃圾清理的代码,不必担心内存溢出或者内存泄漏,这样大大降低了程序员开发时的难度,但是任何事物都是有利有弊的,虽然不必开发人员显示的分配内存和回收垃圾,但是会出现以下几点问题:1.会不知不觉浪费了很多内...

2019-03-09 22:09:16 317

原创 Java实现线程同步的五种方法

一.使用synchronized关键字由于每个java对象都有一个内置锁,用synchronized修饰方法或者代码块时,内置锁会保护整个方法或代码块,要想执行这个方法或者代码块必须获得其内置锁,运行时会加上内置锁,当运行结束时,内置锁会打开。由于同步是一种高开销的工作,所以尽量减少同步的内容,只需同步代码块就可以。1.修饰方法public class Test implements Run...

2019-03-08 11:47:52 4457

原创 Java线程池原理及实现

一.为什么要用线程池?在我们完成一个需要多个线程并发进行的任务时,我们可能会觉得那就多创建几个线程就好了,就像前面的多线程小球,一个线程负责一个小球的运动,这样实现起来会简单些,但是当线程完成一个任务时,就要销毁它,这样不断的创建销毁线程会造成很大的内存开销,其实执行任务只需要很短的时间,但创建和销毁他们会花费很大的时间,这样就降低了系统的效率,所以我们需要一个线程池,需要线程的时候就创建,但执...

2019-03-07 16:44:51 232

原创 深入学习TCP协议

一.什么是TCP协议?TCP(Transmission Control Protocol 传输控制协议)是一种面向连接(连接导向)的、可靠的、 基于IP的传输层协议。在OSI模型中,TCP协议工作在自顶向下的第四层——传输层。二.TCP头部协议格式首先源端口号和目的端口号,各占16位,用于区分主机不同的进程,而IP地址用来区分不同的主机,源端口号,源主机IP地址,目的端口号,目的主机IP...

2019-03-06 14:59:24 419

原创 认识Java中的StringBuilder和StringBuffer

在Java中,除了可以使用 String 类来存储字符串,还可以使用 StringBuilder 类或 StringBuffer 类存储字符串,那么它们之间有什么区别呢?String 类具有是不可变性。如运行结果从运行结果中我们可以看到,程序运行时会额外创建一个对象,保存“helloworld”。当频繁操作字符串时,就会额外产生很多临时变量。使用StringBuilder 或 St...

2019-02-21 14:45:33 102

原创 Java异常处理和异常抛出

生活中的异常是指那些有异于常态,和正常情况不一样,有问题的状态,编程世界中的异常是指阻止当前方法或作用域继续执行的状态。比如,程序要打开一个不存的文件、网络连接中断、除零操作、操作数越界、装载一个不存在的类等情况。这些情况会使程序中断执行。这时异常处理机制就很重要了,它会以适当的方法让程序继续执行或者退出,并且能够保存用户的当前操作或者进行数据回滚,最后再把占用的资源释放掉。一.Java异常体系...

2019-02-21 13:11:44 9023 3

原创 Java中equals和==区别

Java中最主要三块内存及其存储的数据类型栈——线程私有的,用来存放局部变量(对象引用,和基本数据类型)堆——程序共享的,对象实例(常量池也在堆中——常量池中存储带final的基础类型或String类型并且用常量表达式初始化的常量)非堆——存储类变量(Class对象)总结一下—:值类型存储在栈中吗,引用类型变量在栈中存放的是引用类型变量的地址,而对象实例存储在堆中总结equals和=...

2019-02-19 14:36:28 418

原创 面向对象三大特性——继承

前面学习了面向对象的第一大特性,今天来看一下最重要的第二大特性,下面由浅入深罗列继承学习中需要掌握的几点:1.继承的概念继承是类与类的一种关系,比如说,狗是一种动物,那么动物就是父类,狗就是子类,去继承别人的类是子类,被继承的类是父类,Java中的继承是单继承的,就像我们每个人都只有一个亲爸。2.继承的好处生活中,假如你有一个亿万富翁的爹,那你继承了他的遗产,就可以少走很多弯路,那再计算...

2019-02-19 12:08:05 109

原创 面向对象的三大特性——封装

前面我们理解了什么是面向对象,今天来学习下面向对象有哪三大特性?当开始写Java代码变量没有用到任何修饰符的时候,可以在同包下的其他程序访问,但这样并不安全,当你想隐藏类的某些信息的时候,就要用到封装。1.封装的概念封装是将类的某些信息隐藏在类的内部,不允许其他程序直接访问,需要通过类提供的get和set方法来实现对隐藏信息的访问和操作。2.使用封装的好处a.只能通过规定的方法访问数据,...

2019-02-18 12:01:25 577

原创 JAVA类和对象

大家都知道Java是面向对象的,那对象,面向对象,类,这三者到底有着怎样的意义和联系呢?1.对象?有句话说万物皆对象,只要是你看得见摸得着的东西都是对象。2.面向对象和类?从字面意思,简单意思就是我们人朝着对象看去,那再变换一下,就是我们人关注这对象,那对于计算机来讲,就是计算机关注着具体事物的信息。好比生活中一个场景:高考毕业之后我最兴奋的是可以去手机店买手机啦!到了手机店,我和售货员...

2019-02-12 12:03:19 153

原创 基于UDP实现手机和电脑PC端消息通信

一.首先要先了解一下UDP套接字的网络通信TCP和UDP都是传输层的两个协议,最近在学习安卓,想要实现手机和电脑的通信,TCP虽然安全性能好,但是实现起来比较麻烦,在自己想要初步实现一个简易的通信,可以从UDP先实现,两者去区别会在后面完善,这里就先以UDP为主。我们先来看一下UDP的包头从上图可以看到,UDP包头结构简单,是需要知道源端口号和目标端口号,看起来就是很天真,总结起来有以下几...

2019-01-25 13:36:03 1787 1

原创 JAVA多线程实现弹球(最后改进为单线程)

前面我们讲了进程和线程的区别联系以及如何使创建使用线程,那这此就用线程来实现一个简单的弹球运动吧一.首先来用多线程实现先来理一下思路:我们要实现的是用多个线程来实现多个小球 的运动,也就是当我点击一下界面的时候就创建一个线程就来控制这个小球的运动。首先我们要设计一个简单的界面来实现小球运动;然后我们要创建一个小球类,实现画小球,小球运动以及小球之间的碰撞方法,最重要的一点是用这个小球类继承Th...

2018-11-27 14:58:03 863

原创 进程和线程异同辨析

一.进程和线程一个执行中的程序就是进程,进程就是一个被动程序被执行之后实体,现在的操作系统都有多个任务,一个进程去完成一个任务。进程cpu分配资源的基本单位,一个进程中会有多个顺序执行流,这时就需要线程来负责执行每一个执行流,进程中至少包含一个线程,进行中的线程共享进程被cpu分配的资源,因此说线程是cpu执行的基本单位。每个线程都拥有属于自己的独立寄存器以及栈,每个线程和进程中的其他线程共享进...

2018-11-26 22:48:10 195

原创 JAVA中的关键字

一.基础概念要弄懂关键字,字面意思关键!它是JAVA语言预先定义好的,有特别意义的一种标识符。当你在JAVA编辑器中写入了关键字时,它会变颜色,关键字表示一种数据类型或者表示程序的结构,不能用作变量名,方法名,类名,参数名,包名。二.JAVA中有哪些关键字?都代表着什么呢?JAVA中一共有50个关键字,下面都一一介绍一下分类:访问控制 :private protected ...

2018-11-22 23:48:35 487

原创 用两个栈实现队列以及用两个队列实现栈(面试热题)

上一篇博客我讲到了栈和队列的实现,那今天就来实现一个两个具体的问题。一.用两个栈实现队列的解题思路首先来想一下栈是后进先出的,队列是先进先出的,那要用两个栈来实现队列的尾插入和头删除怎么做呢?·先来看一下如何实现队列的尾插入,可以先用任意一个空的栈来存插入的数据,有数据就一直向同一个栈加,另一个栈空着,后面删除操作会用到。·再来看一下队列的删除,由于队列要从队首删除,但是第一个数据放在了...

2018-11-21 21:32:10 125

原创 栈和队列及JAVA实现

一.栈(LIFO)和队列(FIFO)也是经常使用的数据结构,我们经常用到的递归,实现时就是用栈保存相关的调用函数以及变量,线程在实现时也用栈来保存一些函数调用以及变量。栈其实是一种受限制的线性表,它对存储数据的规则是只能从一端进入数据,删除数据的时候也只能删除栈顶的数据,就是大家俗知的后进先出。队列和栈的最大不同就是队列是先进先出。二.栈和队列的性质栈:栈是只能进行一端插入删除操作的特殊线性...

2018-11-21 21:05:41 1911

原创 Hash表的实现——拉链法

一.基础的概念问题·我们最常用的两种数据结构就是数组和链表,各自的优缺点很明确,对于数组来说,搜索某个下标位置的元素很快,但进行插入和删除操作就很慢,链表在内存中是离散存储的,查找具体某个元素比较慢,但插入删除操作很快。但是有时需要对大量数据进行查找以及插入删除操作,这时就需要用到哈希表,是根据关键码值(Key value)而直接进行访问的数据结构。·Hash我们百度一下英文意思就是把其弄乱,...

2018-11-21 13:04:22 3512

原创 JAVA动态数组实现(顺序表)

从我开始接触各种编程语言,最常用最简单的数据结构就是数组啦!但是我们用着用着就会发现它的局限性,在使用过程中它的长度是不变的,就会有时限制我们的需求。那就会想到怎么让它可变呢?变得灵活呢?JAVA中已经有一个封装好的可以直接使用的API——ArrayList,就是一种动态数组,但是下面我们要自己用数组实现一个动态数组,直接满足我们的需求。一.在实现之前,先给大家做些准备工作1.要怎么实现动态数...

2018-11-20 16:05:13 584

原创 数据结构——堆

1.容易蒙圈的概念问题一般我在学习一个新的东西的时候都会在脑子里有一大堆问题!那么到底堆是什么?是一种什么样的数据结构呢?用堆可以来干什么呢?让我来自问自答哈:堆其实说白了就是一种二叉树这类的数据结构,哪种?堆就是一种基于完全二叉树的连结构(完全二叉树就是除了最底层,其它层都必须填满,最后一层可以从左到右填满);平时生活中,我们有时会说一堆人,一堆某某东西,其实数据结构里的堆也和生活中的类似,...

2018-11-19 20:27:41 8418

空空如也

空空如也

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

TA关注的人

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