自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 树(二叉平衡树、红黑树、B+树)

二叉平衡树(AVL)各个左右子树长度之差不超过1 插入节点之后,如果出现不平衡,那么首先要找到最小不平衡子树 RR,插入E后,最小不平衡子树是CDE,不平衡出现在C的右节点、D的右节点,所以称为RR,左转即可RR,插入E后,最小不平衡子树是BDE,不平衡出现在B的左节点、D的左节点,所以称为LL,右转即可LR,插入F后,最小不平衡子树是ABCDEF,不平衡节点出现在A的左节点、B的右节点,所以称为LR 根据小到大原则,从子树B开始处理,不平衡节点出现在B的右节点,那么左转 然后处理A

2021-04-10 14:10:14 6

原创 MVCC多版本并发控制(Multi Version Concurrency Control)

1、快照读和当前读快照读:读取快照数据,有可能读取到历史版本数据,不加锁的select就是快照读 当前读:加锁的select、

2021-04-08 13:38:37 14

原创 事务隔离级别

不考虑隔离级别出现的问题:脏读:一个事务读取到另一个事务未提交的的数据 不可重复读:一个事务内读取同一条数据前后不一致 幻读:一个事务读取时,另一个事务添加了数据,造成前一个事务读取到新的数据、总数不一致(幻读针对的是一整批数据,不可重复读是针对一条数据)四种隔离级别读未提交,出现脏读、不可重复读、幻读 读已提交,避免脏读,出现不可重复读、幻读(只要提交了就能读到) 可重复读,避免脏读、不可重复读,出现幻读(MySQL默认) 串行化,避免脏读、不可重复读、幻读图来自:https:/

2021-04-07 11:18:36 7

原创 单点登录

dd

2021-04-06 21:21:54 11

原创 面试题:数据库MySQL

存储引擎MyISAM和InnoDB区别

2021-03-17 22:45:19 41 1

原创 面试题:操作系统

什么是操作系统?本质是一个运行在计算机上的软件程序,管理计算机硬件与软件资源的程序 屏蔽硬件的复杂性,提供接口使用计算机硬件 OS内核是核心部分,负责内存管理、硬件设备管理、文件系统管理、应用程序管理等什么是系统调用用户态:用户态运行的进程或可以直接读取用户程序的数据 系统态:简答理解为系统态运行的进程几乎可以访问计算机的任何资源,不受限制 我们的程序基本都在用户态运行,当需要使用OS提供的系统态下的功能时,通过系统调用去使用 调用功能有:设备管理,完成设备启动、请求、释放 文件管理

2021-03-16 16:23:50 16

原创 面试题:网络

为什么TCP连接需要最后一次握手?如果使用两次握手连接,假设这种场景:客户端发送了第一个请求连接并且没有丢失,只是因为在网络结点中滞留的时间太长了。后续客户端太久没有收到服务器ACK,于是重新发送请求连接SYN,然后服务器正确收到第二次连接请求并回馈ACK,于是第二次请求连接成功。试想,后续第一次请求到达了服务器,服务器反馈ACK,客户端收到了,那么就会重复连接,造成浪费。 如果直接采用三次握手,那么就算是第一次连接请求发送到服务器,服务返回ACK,那么客户端收到ACK之后,不会发出ACK了,因为客户

2021-03-15 22:09:33 22

原创 MyBatis笔记(七):插件

1、四大对象1.1、四大对象StatementHandler:处理sql语句预编译,设置参数等相关工作 ParameterHandler:处理传入参数集 ResultHandler:处理结果集 Executor:它是一个执行器,真正进行java与数据库交互的对象1.2、四大对象创建要点每个创建出来的对象不是直接返回的,而是interceptorChain.pluginAll(parameterHandler); 获取到所有的Interceptor(拦截器)(插件需要实现的接口); 调

2021-03-10 12:01:29 6

原创 MyBatis笔记(六):工作原理

运行原理图分层示意图一、创建SQLSessionFactoryConfiguration封装了所有配置文件的详细信息 总结:把配置文件的信息解析并保存在Configuration对象中,返回包含了Configuration的DefaultSqlSession对象。二、返回SqlSession类返回SqlSession的实现类DefaultSqlSession对象。他里面包含了Executor和Configuration Executor会在这一步被创建三、返回Mapper

2021-03-08 23:27:16 19 1

原创 MyBatis笔记(五):代码生成器

在pom文件中添加插件<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apach

2021-03-08 21:51:58 17

原创 MyBatis笔记(四):缓存

一、简介MyBatis系统中默认定义了两级缓存,一级缓存和二级缓存。 一级缓存是SqlSession级别的缓存,也称为本地缓存),默认开启 二级缓存是基于namespace级别的缓存,需要手动开启和配置 为了提高扩展性, MyBatis定义了缓存接口Cache,可以通过实现Cache接口来自定义二级缓存二、一级缓存一级缓存(local cache),即本地缓存,作用域默认为sqlSession。 当 Session flush 或 close 后,该Session 中的所有 Cache 将

2021-03-08 18:23:14 13

原创 MyBatis笔记(三):动态sql

一、简述动态SQL是MyBatis强大特性之一。极大的简化我们拼装SQL的操作。 动态SQL元素和使用 JSTL 或其他类似基于 XML 的文本处理器相似。 MyBatis采用功能强大的基于 OGNL 的表达式来简化操作二、if判断根据传入的参数,决定是否将该参数拼接到sql中 举例,查询员工,传入的参数不为空则查询时作为条件查询 DynamicSQLMapper.javaDynamicSQLMapper.xml,在<if>标签中,test参数的值为判断表达式,根据传入的

2021-03-08 16:47:20 11 1

原创 MyBatis笔记(二):映射文件

1、增删改查修改Mapper接口,增加方法修改EmployeeMapper.xml文件测试增删改中允许定义为Integer、Long、Boolean、void等返回类型 不同的session,对是否需要手动提交请求有不同要求sqlSessionFactory.openSession();===》手动提交 sqlSessionFactory.openSession(true);===》自动提交2、获取主键2.1、获取自增主键在操作标签中使用useGeneratedKeys

2021-03-05 15:03:35 20

原创 MyBatis笔记(一):基本概念、配置文件

1、介绍1.1、MyBatis是什么MyBatis 是支持定制化 SQL、存储过程以及高级映射的优秀的持久层框架。 MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。 MyBatis 可以使用简单的XML或注解用于配置和原始映射,将接口和Java的POJO( Plain Old Java Objects,普通的Java对象)映射成数据库中的记录1.2、MyBatis历史原是Apache的一个开源项目iBatis, 2010年6月这个项目由Apache Softw

2021-03-02 16:03:33 12

原创 算法:二分搜索算法笔记

一、普通二分搜索算法/** * 普通二分搜索 * @param nums * @param target * @return */ int binarySearch(int[] nums, int target) { int left = 0; int right = nums.length - 1; while(left <= right) { int mid =

2021-02-28 22:31:15 26 1

原创 算法:BFS(广度优先搜索)算法笔记

一、BFS算法BFS问题的本质就是,在“一幅图”中找到从起点到终点的最近距离。比如两个单词,将一个替换字幕后变成另一个单词,需要的最小替换次数。 问题的框架:int BFS(Node start, Node target) { Queue<Node> q; Set<Node> visited;//避免走回头路 q.offer(start);//入队 visited.add(start); int step = 0;//记录步

2021-02-28 21:42:50 33

原创 算法:回溯算法笔记

一、回溯算法回溯问题,实际上就是一个决策树的遍历过程,需要思考以下问题:

2021-02-28 20:41:19 22

原创 算法:动态规划笔记

一、动态规划问题动态规划问题的核心,其实就是穷举,列举出所有的情况,并选择最优答案。 动态规划问题的穷举会存在“重叠子问题”,如果暴力破解,会有很多重复计算,造成效率低下。 动态规划问题一般都具有“最优子结构”,即通过子问题的最值得到最终问题的最值,要求每个子问题之间必须相互独立。 动态规划三要素:重叠子问题、最优子结构、状态转移方程 思考以下几点:问题的base case(最简单情况,初值)是什么? 问题的状态? 做什么“选择”使得“状态”改变? 如何定义dp数组/函数来表示出“状态”

2021-02-28 13:25:32 29

原创 JVM系列(十九):类的加载器

类的加载器详解类加载器时JVM执行类加载机制的前提 ClassLoader是Java的核心组件,所有的Class都是由ClassLoader进行加载 ClassLoader通过各种方式将二进制数据流读入JVM内部,转为为一个java.lang.Class对象实例 ClassLoader在整个装载阶段中,只能影响到类的加载,链接和初始化由JVM负责。 代码是否能运行,由执行引擎决定1、概述1.1、相关面试题1.2、类的加载分类(不是加载器分类)显式加载vs隐式加载 (加载的

2021-01-30 15:40:00 17

原创 JVM系列(十八):类的加载过程

1、概述Java中数据类型分为基本数据类型和引用数据类型基本数据类型由JVM预先定义好 引用数据类型需要根据类(包含类、接口、枚举等)来进行加载从Class文件到内存中的类需要经过三大阶段: 加载-链接-初始化 分成五个小阶段:加载-验证-准备-解析-初始化 如果直到类被卸载,分为七个小阶段:加载-验证-准备-解析-初始化-使用-卸载使用过程2、过程一:加载阶段2.1、加载完成的操作加载的理解加载就是将Java类的字节码文件加载到机器内存中,并在内存中构建出Jav.

2021-01-30 15:15:31 22

原创 JVM系列(十七):字节码指令集

1、概述属于基本的执行指令 由操作码(1个字节)和操作数组成1.1、执行模型执行模型如下伪代码1.2、字节码和数据类型大多数指令都包含了操作所对应的数据类型信息,比如iload从局部变量表中加载int数据到操作数栈 各个数据类型简写有的指令看不出操作数类型,如arraylength指令,但是它只能操作数组类型对象 有的指令与操作数无关,如goto byte、char、short、boolean等类型,并没有指令去支持,编译在运行时,以四个字节为一个单位,所以会将以上数据类型

2021-01-30 14:58:31 28

原创 JVM系列(十六):Class文件结构

1、概述1.1、字节码文件跨平台性1.1.1、Java语言:跨平台的语言(一次编译到处运行)无须多次编译 由于Python、PHP等强大的解释器(天生就与平台无关),这个优势不再那么吸引人 跨平台已经几乎是是语言的必备选项1.1.2、Java虚拟机:跨语言的平台Java虚拟机和Java语言没有绑定,仅和“Class”文件有关联 任何语言,只要编译为正确的class文件,就可以在Java虚拟机上执行 所有JVM都要遵守Java虚拟机规范1.1.3、Java源码需要编译为符合JV

2021-01-30 14:21:50 28

原创 JVM系列(十五):垃圾回收器

1、GC分类与性能指标1.1、GC分类1.1.1按线程分类串行垃圾回收器:同一时间段内仅允许一个CPU用于执行垃圾回收操作,此时工作线程被暂停,直到垃圾收集工作结束。默认应用于Client模式,在并发能力强的CPU上。 并行垃圾回收器:运用多个CPU同时执行垃圾回收,提升应用吞吐量,同样是STW制。1.1.2、按工作模式分类并发式垃圾回收器:与应用线程交替工作,减少应用程序STW 独占式垃圾回收器:一旦运行就启动STW,直到垃圾回收完毕1.1.3、按碎片处理方式分压缩式垃圾回

2021-01-29 17:51:43 42

原创 JVM系列(十四):垃圾回收相关概念

1、System.gc()1.1、System.gc()的理解默认情况下,调用System.gc()和Runtime.getRuntime.gc()会显式触发Full GC,同时对老年代和新生代进行回收(其实调用System.gc(),底层也是调用Runtime.getRuntime.gc()实现GC)System.gc()附带免责声明,即无法保证进行垃圾回收,只是通知垃圾回收器,具体做不做还得看回收器 一般来说不手动触发,直接用自动化GC。在特殊情况下,比如正在编写性能基准,可以在运行时调

2021-01-29 14:11:51 20 1

原创 JVM系列(十三):垃圾回收相关算法

1、标记阶段1.1、垃圾标记阶段堆中存放着对象实例,垃圾回收之前,首先要区分内存中哪些存活、哪些死亡,标记为死亡的才垃圾回收,释放内存。 如何标记死亡对象?当一个对象不再被任何存活的对象引用时,宣布死亡 有两种方式:引用计数算法和可达性分析算法1.2、引用计数算法1.2.1、介绍引用计数算法为每个对象保存一个整型的引用计数器属性,用于记录对象被引用的情况 被引用,则计数器+1;引用失效,则-1 优点:实现简单、垃圾对象便于识别、判定效率高、回收没有延迟性(随时可以回收) 缺点:

2021-01-28 22:31:43 22

原创 JVM系列(十二):垃圾回收概述

1、垃圾1.1、关于垃圾收集的三个经典问题哪些内存要回收 什么时候回收 怎么回收1.2、垃圾指运行程序中没有任何指针指向的对象 如果不回收,那么会一直保留到应用程序结束1.3、为什么要GC如果不进行垃圾回收,那么内存会被消耗完 在进行GC的时候,JVM可以进行碎片整理,将所占用的堆内存移到堆的一端 没有GC,程序不能正常进行,有了GC又有STW,所以要不断对GC进行优化2、早期垃圾回收早期c/c++,垃圾要手动回收,使用new申请,delete手动释放 开发人员不便,如

2021-01-27 17:28:09 21 1

原创 JVM系列(十一):String Table

1、String1.1、基本特性String s = “hello”; String s = new String(“hello”) String类声明为final,不可继承 实现了Serializable接口,支持序列化;支持Comparable接口,可以比较大小 JDK8及以前内部定义final char[] value存储字符串,JDK9及以后使用byte[]。根据编码方式不一样,存储时加上编码标记,UTF-8的使用两个byte存储,为了保持一致,StringBuffer和StringB

2021-01-27 17:10:10 26

原创 JVM系列(十):执行引擎

1、执行引擎概述1.1、介绍执行引擎是Java虚拟机核心的组成部分之一 虚拟机相对于“物理机”,物理机的执行引擎建立在处理器、缓存、指令集和操作系统层面上;虚拟机的执行引擎由软件自行实现,因此能执行不被硬件直接支持的指令集 执行引擎的任务就是将字节码指令解释、编译为对应平台的机器指令1.2、执行引擎工作过程执行引擎在执行过程中执行的指令是什么完全依赖于PC寄存器 执行引擎执行完一条指令操作,PC寄存器马上更新下一条要执行的指令 方法在执行过程中,执行引擎可能会通过栈帧局部变量表

2021-01-25 15:34:27 19

原创 JVM系列(九):直接内存

1、概述不是虚拟机运行时数据区的一部分,也不是Java虚拟机规范中定义的内存区域 直接内存时在Java堆外,直接向操作系统申请的内存区域 来源于NIO(New IO / Non-Blocking IO),通过堆中的DirecyByteBuffer实例操作Native内存(本地内存) 速度较快,快于Java堆,读写性能较高读写频繁可以考虑 Java允许Java程序使用直接内存,用于数据缓冲区也会导致OutOfMemoryError,大小不会受到-Xmx(堆)控制,但是系统内存有限,超过OS内存

2021-01-25 11:14:46 16

原创 JVM系列(八):对象的实例化内存布局和访问定位

1、对象的实例化1.1、创建对象的方式:(6种)New,最常见的方式变形1:单例模式,使用Xxx类的一个静态方法调用构造器 变形2:工厂模式,XxxBuilder/XxxFactory的静态方法Class的newInstance(),反射方式,只能调用无参构造器,且权限是public,jdk1.9以后不建议使用了 Constructor的newInstance(Xxx),反射方式,能调用有参、无参构造器,不限权限 使用clone(),不调用构造器,当前类需要实现Cloneable接口,

2021-01-25 10:37:26 21

原创 JVM系列(七):方法区(元空间)

1、栈、堆、方法区交互关系1.1、线程共享线程共享:堆、元空间 线程私有:栈(虚拟机栈、本地方法栈)、程序计数器1.2、各区域存储 类字节码存储在方法区(也就是存类啦),实例化对象存储在Java堆,对象引用存储在栈中。 2、理解方法区尽管方法区在逻辑上属于堆,但是方法区可以看做一块独立于Java堆的内存空间。 方法区与Java堆一样,属于线程共享区域 方法区在JVM启动时创建,和堆一样可以物理内存不连续 方法区大小和堆一样,可以固定或拓展 方法区大小决定保存..

2021-01-24 21:48:20 61

原创 JVM系列(六):堆

1、概述一个JVM实例对应一个进程,一个实例中仅有一个方法区和一个堆,实例中的线程各有Java栈、程序计数器、本地方法栈,线程共享方法区和堆。1.1、相关概念一个JVM实例只存在一个堆内存,堆是Java内存管理的核心; Java堆在JVM启动时创建,大小确定,是最大一块内存(大小可以调节); 堆内存在物理上可以不连续,但是逻辑上连续; 所有线程共享Java堆,也可为每个线程划分私有缓冲区(Thread Local Allocation Buffer,TLAB); Java虚拟机规范描述

2021-01-23 22:18:23 18

原创 JVM系列(五):本地方法接口和本地方法栈

1、本地方法接口1.1、本地方法一个Native Method就是Java调用非Java代码的接口,使用native关键字修饰和abstract抽象方法不同,抽象方法是没有方法体,本地方法是有方法体,只不过不是Java语言实现。1.2、为什么使用本地方法与Java以外的环境进行交互,这是主要原因; 与OS交流,实现与底层系统的交互,有些方法直接用C语言; Sun的解释器由C语言实现,使得它能像普通的C语言一样与外部交互; 现在很少使用本地方法了,因为Java足够强大、完善了

2021-01-23 14:22:11 30

原创 JVM系列(四):虚拟机栈

1、概述及其定义1.1、概述Java的指令根据栈来设计,因为不同平台CPU架构不一样,所以不能设计为基于寄存器。 基于栈的优点:跨平台、指令集小、编译器容易实现; 基于栈的缺点:性能下降、实现同样功能需要更多指令(指令集小、功能单一) 栈:运行时的单位,程序如何执行、如何处理数据(方法); 堆:存储时的单位,解决数据的存储问题,数据放在哪里(对象)1.2、Java虚拟机栈早期称Java栈; 每个线程创建时都创建一个栈,内部保存的单位是栈帧,对应一次次方法调用; 生命周期与线程一

2021-01-23 11:45:16 23

原创 JVM系列(三):程序计数器(PC寄存器)

1、运行时数据区红色部分(方法区、堆),每个进程一份; 灰色部分(程序计数器、本地方法栈、虚拟机栈),每个线程一份,线程间共享堆、堆外内存2、程序计数器作用:通过改变这个计数器的值来选取下一条需要执行的字节码指令,可以把它看做当前线程正在执行的字节码的行号指示器。也就是说,程序计数器里面记录的是当前线程正在执行的那一条字节码执行的地址。如果当前线程正在执行的是一个本地方法,那么此时程序计数器为空. 空间小,速度最快的存储区域 线程私有(每个线程都有),生命周期与线程一致 任何时刻某一线

2021-01-23 09:56:37 13

原创 JVM系列(二):类加载子系统

1、类的加载过程与类加载器分为三个阶段,分别是加载、链接、初始化。1.1、加载Loading加载阶段,需要完成以下三件事通过类全名获取二进制字节流(class文件) 将字节流中的静态存储结构转化为方法区中的运行时数据结构 在内存中生成一个代表这个类的java.lang.Class对象,作为方法区中该类的数据访问的入口加载.class文件的方式:本地系统、网络(web)、Zip压缩包(Jar,war格式)、运行时生成(动态代理技术)、其他文件生成(JSP)、专有数据库提取(少见)、加

2021-01-23 09:28:41 22

原创 JVM系列(一):JVM概述

1、JVM整体结构图2、JVM生命周期虚拟机启动:通过引导类加载器创建初始类来完成,初始类由虚拟机指定 虚拟机运行:实际上执行的是JAVA虚拟机进程 虚拟机退出:程序正常结束;程序异常终止;OS出现错误;线程调用System类的exit方法、Runtime的halt方法;3、JIT即时编译器和解释器不同,解释器是解释一行执行一行,JIT是将常用的代码解释(解释时要暂停运行)后存入缓存,JIT代码多了启动慢,且缓存不足。所以解释器响应时间快,JIT没有那么快响应,但是响应后执行快。4、

2021-01-22 16:02:48 15

原创 Java IO流关闭模板

1、为什么需要模板来关闭IO流?InputStream input = null;try{ input = new FileInputStream("c:\\data\\input-text.txt"); int data = input.read(); while(data != -1) { //do something with data... doSomethingWithData(data); data = input.

2021-01-22 14:39:57 37 2

原创 JMM笔记

1、Java内存模型基础1.1、并发编程的两个关键问题1.1.1、线程之间如何通信两种通信机制,共享内存和消息传递,Java内存模型中使用共享内存1.1.2、线程之间如何同步共享内存通信机制中,线程同步是显式的,程序员要显式指定 消息传递通信机制中,线程同步是隐式的,消息的发送必须在消息的接受之前1.2、Java内存模型抽象结构线程A和B要通信的话,需要以下两个步骤线程A将本地内存中更新过的共享变量刷新到主存中 线程B到主存中读取线程A刷新到主存中的变量经过这两个步骤,实质上

2021-01-21 11:36:06 23

原创 红黑树笔记

1、红黑树1.1、介绍红黑树(Red-Black Tree,RBT)是一个自平衡树二叉树,不是绝对的平衡,不一定要求左右子树高度之差是1以内 有N个节点的红黑树,高度最多只有2log(N+1)1.2、规则每一个节点只能是红色,或者黑色,二选一 树的根节点是黑色的 如果节点是红色的,那么这个节点的子节点一定是黑色的 从一个节点到该节点下的null节点(就是叶子节点的子节点)的每条路径下,必须包含相同数目的黑色节点1.3、红黑树的操作Recoler,重新标记树的颜色 Rotatio

2021-01-18 14:24:07 33 1

空空如也

空空如也

空空如也

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

TA关注的人 TA的粉丝

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