自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Java NIO

Java NIOJava NIO:Non-blocking IO,非阻塞IO。例如:当线程从通道读取数据到缓冲区时,线程还是可以进行其他事情 Java NIO: Channels and Buffers,基于通道和缓冲区 Java IO是基于字节流和字符流操作;Java NIO是基于通道和缓存区,数据总是从通道读取到缓冲区,或者从缓存区写入到通道中IO NIO 面向流,单向 面向缓冲区,双向 阻塞 非阻塞 无 选择器 面向流:直接是数据流动,数据单向流动;面

2021-04-20 20:46:03 826

原创 Java IO笔记

File对象操作文件和目录 传入绝对路径或者相对路径//读取文件File f = new File("C:\\Windows\\notepad.exe");//读取目录下文件和目录File f = new File("C:\\Windows");File[] fs1 = f.listFiles();boolean mkdir():创建当前File对象表示的目录; boolean mkdirs():创建当前File对象表示的目录,并在必要时将不存在的父目录也创建出来; boole

2021-04-17 22:42:22 285

原创 SQL语句笔记

Inner join内连接连接两个表,属性相等的就连接在一起 select * from 表1 inner join 表2 on 表1属性 = 表2属性 上面语句等同于:select * from 表1 ,表2 where 表1属性 = 表2属性left join左连接左表返回所有的行,右边返回匹配的行 select * from 左表 left join 右表 on 左表属性 = 右表属性right join右连接右表返回所有的行,左边返回匹...

2021-04-15 13:48:47 323

原创 Spring常用注解

声明bean的注解@Component:组件,没有明确的角色 @Service:在业务逻辑层使用(service层) @Repository:在数据访问层使用(dao层) @Controller:在展现层使用,控制器的声明(C) @RestController 注解相当于@Controller+@ResponseBody@Bean的属性支持@Scope设置Spring容器如何新建Bean实例(方法上,得有@Bean),其设置类型包括:Singleton (单例,一个Spring容器中只.

2021-04-13 18:02:03 128

原创 排序算法

冒泡排序像泡泡一样,不断把小的数字挪到前面 稳定,时间复杂度为O(),空间复杂度为O(1) public static int[] bubbleSort(int[] nums) { for (int i = 0; i < nums.length; i++) { //开始冒泡,从后面把最小的冒上来 for (int j = nums.length-1; j > i ; j--) { if

2021-04-12 20:10:32 122

原创 布隆过滤器

定义本质上布隆过滤器是一种数据结构,比较巧妙的概率型数据结构(probabilistic data structure),特点是高效地插入和查询,可以用来告诉你“某样东西一定不存在或者可能存在”。 相比于传统的 List、Set、Map 等数据结构,它更高效、占用空间更少,但是缺点是其返回的结果是概率性的,而不是确切的 仅支持插入和查找,不支持删除布隆过滤器数据结构布隆过滤器是一个 bit 向量或者说 bit 数组,第一行是存储的数据,第二行是下标如果我们要映射一个值到布隆过滤器中,我.

2021-04-12 17:30:23 117

原创 面试题:Redis

Redis优点<key, value>内存,速度快 异步保存到磁盘 保存多种数据结构(5种),单个value限制1GRedis数据类型String,最基本的类型,可以是任何数据,甚至图片、序列化对象等,最大存储512M List,<key, list>,list是一个有序可重复集合,底层是双向链表 Set,<key, set>,set是一个无序不重复集合,底层是value为空的hash表,就是只有key Sorted Set,<key, zset

2021-04-12 16:54:25 160

原创 树(二叉平衡树、红黑树、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 340

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

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

2021-04-08 13:38:37 315

原创 事务隔离级别

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

2021-04-07 11:18:36 82

原创 单点登录

dd

2021-04-06 21:21:54 89

原创 面试题:数据库MySQL

存储引擎MyISAM和InnoDB区别

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

原创 面试题:操作系统

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

2021-03-16 16:23:50 139

原创 面试题:网络

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

2021-03-15 22:09:33 168

原创 MyBatis笔记(七):插件

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

2021-03-10 12:01:29 156

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

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

2021-03-08 23:27:16 153 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 116

原创 MyBatis笔记(四):缓存

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

2021-03-08 18:23:14 196

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

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

2021-03-08 16:47:20 1231 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 355

原创 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 180

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

一、普通二分搜索算法/** * 普通二分搜索 * @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 115 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 225

原创 算法:回溯算法笔记

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

2021-02-28 20:41:19 235

原创 算法:动态规划笔记

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

2021-02-28 13:25:32 104

原创 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 360

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

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

2021-01-30 15:15:31 210

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

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

2021-01-30 14:58:31 812

原创 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 311 1

原创 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 272

原创 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 101 1

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

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

2021-01-28 22:31:43 98

原创 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 108 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 157

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

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

2021-01-25 15:34:27 346

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

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

2021-01-25 11:14:46 183

原创 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 159

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

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

2021-01-24 21:48:20 1829

原创 JVM系列(六):堆

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

2021-01-23 22:18:23 199

原创 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 261

空空如也

空空如也

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

TA关注的人

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