自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

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

一.概述 本文以Mysql数据库为研究对象,因为Mysql支持多存储引擎,每种存储引擎支持不同的索引,因此Mysql支持多种索引类型,本文以BTree为说明,Mysql经常用到的索引类型就是BTree。 二.常见的查询算法和数据结构 为什么要讲这个呢?因为之所以要建立索引就是为了建立一种数据结构,...

2019-03-24 13:03:47 84 0

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

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

2019-03-22 13:23:50 507 0

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

贪心算法 贪心算法的定义: 在么一个阶段都选取当前阶段的最优选择,同时不考虑后续的决策影响。 贪心算法的要素: **·**贪心选择性质: 全局最优可以通过一系列的局部最优来求解 同时将问题通过一系列的局部最优得到了简化,同时进行求解。 **·**最优子结构: 原问题的最优解包含着子问题的最优解 这...

2019-03-22 12:57:21 732 0

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

什么是回溯法? 在程序设计中,有相当一类求一组解,或求全部解或求最优解的问题,例如读者熟悉的八皇后问题,不是根据某种特定的计算法则,而是利用试探和回溯的搜索技术求解。回溯法也是设计递归过程的一种重要方法,它的求解过程实质上是一个先序遍历一棵"状态树"的过程,只是这棵树不是遍历前...

2019-03-21 18:10:12 248 0

原创 递归算法思想详解

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

2019-03-21 11:47:50 134 0

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

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

2019-03-19 09:15:16 275 0

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

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

2019-03-18 22:06:33 773 0

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

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

2019-03-18 17:34:35 321 0

原创 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 输出: ...

2019-03-18 16:21:28 152 0

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

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

2019-03-18 15:11:20 572 0

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

排序算法说明 1.排序的定义:对一序列对象根据某个关键字排序 2.评价算法优劣的术语说明 稳定:如果a原本在b前面,而a=b,排序之后a仍然在b的前面; **不稳定:**如果a原本在b的前面,而a=b,排序之后a可能会出现在b的后面; **内排序:**所有排序操作都在内存中完成; 外排序...

2019-03-18 14:19:58 119 0

原创 C++内存管理详解

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

2019-03-18 11:17:12 31 0

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

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

2019-03-18 08:55:29 58 0

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

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

2019-03-15 14:48:21 36 0

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

一.类的生命周期 类的生命周期从类加载到虚拟机中内存,到卸载出内存为止。 二.类加载的过程 类加载的全过程:加载——验证——准备——解析——初始化 1.加载 类的加载阶段就是由类加载器负责根据类的全限定名来读取该类的二进制字节码文件到JVM中,并存储在方法区中,在堆区中生成该类jav...

2019-03-14 21:58:52 87 0

原创 HTTP和HTTPS通信原理

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

2019-03-12 18:30:19 345 0

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

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

2019-03-11 20:19:51 30 0

原创 理解HTTP协议

概述 在如今的互联网中,应用层的协议中重要的也是很容易理解的莫非Web的HTTP协议了,它叫做超文本传输协议(HyperText Transfer Protocol)。现在我将从HTTP协议的概念,特性,重要知识点和学习中常见的困惑问题来介绍HTTP协议。 一.理解什么是HTTP协议 1.HTTP...

2019-03-11 20:17:50 51 0

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

一.为什么要学习这些? Java GC(Garbage Collection垃圾回收机制)是Java不同C++/C的主要主要区别之一,作为Java开发者,随着GC机制的日益完善,不需要编写内存回收和垃圾清理的代码,不必担心内存溢出或者内存泄漏,这样大大降低了程序员开发时的难度,但是任何事物都是有...

2019-03-09 22:09:16 68 0

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

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

2019-03-08 11:47:52 783 0

原创 Java线程池原理及实现

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

2019-03-07 16:44:51 51 0

原创 深入学习TCP协议

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

2019-03-06 14:59:24 129 0

原创 认识Java中的StringBuilder和StringBuffer

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

2019-02-21 14:45:33 46 0

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

生活中的异常是指那些有异于常态,和正常情况不一样,有问题的状态,编程世界中的异常是指阻止当前方法或作用域继续执行的状态。比如,程序要打开一个不存的文件、网络连接中断、除零操作、操作数越界、装载一个不存在的类等情况。这些情况会使程序中断执行。这时异常处理机制就很重要了,它会以适当的方法让程序继续执行...

2019-02-21 13:11:44 2176 1

原创 Java中equals和==区别

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

2019-02-19 14:36:28 36 0

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

前面学习了面向对象的第一大特性,今天来看一下最重要的第二大特性,下面 由浅入深罗列继承学习中需要掌握的几点: 1.继承的概念 继承是类与类的一种关系,比如说,狗是一种动物,那么动物就是父类,狗就是子类,去继承别人的类是子类,被继承的类是父类,Java中的继承是单继承的,就像我们每个人都只有一...

2019-02-19 12:08:05 48 0

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

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

2019-02-18 12:01:25 58 0

原创 JAVA类和对象

大家都知道Java是面向对象的,那对象,面向对象,类,这三者到底有着怎样的意义和联系呢? 1.对象? 有句话说万物皆对象,只要是你看得见摸得着的东西都是对象。 2.面向对象和类? 从字面意思,简单意思就是我们人朝着对象看去,那再变换一下,就是我们人关注这对象,那对于计算机来讲,就是计算...

2019-02-12 12:03:19 54 0

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

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

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

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

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

2018-11-27 14:58:03 225 0

原创 进程和线程异同辨析

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

2018-11-26 22:48:10 59 0

原创 JAVA中的关键字

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

2018-11-22 23:48:35 135 0

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

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

2018-11-21 21:32:10 33 0

原创 栈和队列及JAVA实现

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

2018-11-21 21:05:41 722 0

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

一.基础的概念问题 ·我们最常用的两种数据结构就是数组和链表,各自的优缺点很明确,对于数组来说,搜索某个下标位置的元素很快,但进行插入和删除操作就很慢,链表在内存中是离散存储的,查找具体某个元素比较慢,但插入删除操作很快。但是有时需要对大量数据进行查找以及插入删除操作,这时就需要用到哈希表,是根据...

2018-11-21 13:04:22 678 0

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

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

2018-11-20 16:05:13 152 0

原创 数据结构——堆

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

2018-11-19 20:27:41 862 0

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