自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

海阔天空的博客

小白成长之路!

  • 博客(53)
  • 收藏
  • 关注

原创 数据结构a

数据结构

2023-02-12 17:20:37 444

原创 golang设计模式

golang

2023-02-12 17:15:38 321

原创 Cglib动态代理

Cglib动态代理简介实现方法实现细节简介CGLIB 通过继承方式实现代理。在 CGLIB 动态代理机制中 MethodInterceptor 接口和 Enhancer 类是核心。你需要自定义 MethodInterceptor 并重写 intercept 方法,intercept 用于拦截增强被代理类的方法。实现方法public interface MethodInterceptorextends Callback{ // 拦截被代理类中的方法 public Object in

2021-09-20 23:02:31 303

原创 Mybatis原理分析

Mybatis架构图创建会话工厂核心对象源码解析创建会话获取Mapper代理对象执行SQL语句架构图创建会话工厂//加载主配置文件,目的是为了构建SqlSessionFactory对象InputStream in = Resources.getResourceAsStream("SqlMapConfig.xml");//创建SqlSessionFactory对象SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(

2021-09-11 15:03:11 271

原创 SpringMVC

SpringMVC流程说明(重要):客户端(浏览器)发送请求,直接请求到 DispatcherServlet前端控制器。DispatcherServlet 根据请求信息调用 HandlerMapping,解析请求对应的 Handler,并返回HanderExecutionChain(包括Hander和拦截器)。解析到对应的 Handler(也就是我们平常说的 Controller 控制器)后,开始由 HandlerAdapter 适配器处理。HandlerAdapter 会根据 Handler

2021-09-10 14:13:10 104

原创 Redis中常见的3种缓存读写策略

缓存读写策略Cache Aside Pattern(旁路缓存模式)概述流程缺点Read/Write Through Pattern(读写穿透)概述与缓存旁路策略的不同流程缺点Write Behind Pattern(异步缓存写入)概述Cache Aside Pattern(旁路缓存模式)概述这是我们平时使用比较多的一个缓存读写模式,适合读请求比较多的场景。流程写:先更新数据库,然后删除缓存的数据读:先从cache中读取数据,存在的话直接返回。 不存在的话,从数据库读取数据,再将数据更新到缓存中

2021-09-05 11:32:07 1097 1

原创 布隆过滤器原理

简介布隆过滤器是一个非常神奇的数据结构,通过它我们可以非常方便地判断一个给定数据是否存在于海量数据中。结构布隆过滤器是一个 bit 向量或者说 bit 数组。如果我们要映射一个值到布隆过滤器中,需要经过如下两步:使用布隆过滤器中的哈希函数对元素值进行计算,得到哈希值(有几个哈希函数得到几个哈希值)。根据得到的哈希值,在位数组中把对应下标的值置为 1。如下图:映射"Hello"到布隆过滤器,首先有三个不同的哈希函数分别对"Hello"求值,映射到三个不同的位置:3,5,9。然后把对应位置下标置

2021-09-03 20:34:37 151

原创 对象创建过程

类加载检查虚拟机遇到一条 new 指令时,首先将去检查这个指令的参数是否能在常量池中定位到这个类的符号引用,并且检查这个符号引用代表的类是否已被加载过、解析和初始化过。如果没有,那必须先执行相应的类加载过程。分配内存在类加载检查通过后,接下来虚拟机将为新生对象分配内存。对象所需的内存大小在类加载完成后便可确定,为对象分配空间的任务等同于把一块确定大小的内存从 Java 堆中划分出来。分配方式有 “指针碰撞” 和 “空闲列表” 两种,选择哪种分配方式由 Java 堆是否规整决定,而 Java ...

2021-09-02 20:11:53 93

原创 设计模式-单例模式

单例模式简介实现步骤优缺点实现方式简介单例对象的类只能允许一个实例存在。许多时候整个系统只需要拥有一个的全局对象,这样有利于我们协调系统整体的行为,比如在某个服务器程序中,该服务器的配置信息存放在一个文件中,这些配置数据由一个单例对象统一读取,然后服务进程中的其他对象再通过这个单例对象获取这些配置信息。这种方式简化了在复杂环境下的配置管理。Singleton类,定义一个GetInstance操作,允许客户访问它的唯一实例。GetInstance是一个静态方法,主要负责创建唯一实例。实现步骤将该

2021-09-02 20:08:17 217

原创 工厂模式详述

工厂模式为什么使用工厂模式实现方式简单工厂工厂方法模式抽象工厂模式部分引用:https://www.cnblogs.com/wangenxian/p/10787785.html为什么使用工厂模式工厂模式是为了解耦:把对象的创建和使用的过程分开。就是Class A 想调用 Class B ,那么A只是调用B的方法,而至于B的实例化,就交给工厂类。工厂模式可以降低代码重复。如果创建对象B的过程都很复杂,需要一定的代码量,而且很多地方都要用到,那么就会有很多的重复代码。我们可以这些创建对象B的代码放到工

2021-08-31 14:19:19 204

原创 缓存穿透、击穿和雪崩

缓存穿透、击穿和雪崩缓存穿透解决方案缓存击穿解决方案缓存雪崩解决方案缓存穿透缓存穿透的概念很简单,用户想要查询一个数据,发现redis内存数据库没有,也就是缓存没有命中,于是向持久层数据库查询。发现也没有,于是本次查询失败。当用户很多的时候,缓存都没有命中(秒杀),于是都去请求了持久层数据库。这会给持久层数据库造成很大的压力,这时候就相当于出现了缓存穿透。 比如用一个不存在的用户id获取用户信息,不论缓存还是数据库都没有,若黑客利用此漏洞进行攻击可能压垮数据库。解决方案1.布隆过滤器:布隆过滤器是一

2021-08-30 21:27:42 105

原创 主从复制和哨兵模式详解

主从复制和哨兵模式主从复制简介作用简单结构环境配置连接测试复制原理哨兵模式概述作用配置哨兵配置文件sentimel.conf启动哨兵模式哨兵模式的规则优点缺点主从复制简介主从复制,是指将一台Redis服务器的数据,复制到其他的Redis服务器。前者称为主节点 (master/leader),后者称为从节(slave/follower)。数据的复制是单向的,只能由主节点到从节点。Master以写为主,Slave 以读为主。默认情况下,每台Redis服务器都是主节点。且一个主节点可以有多个从节点(或没有从

2021-08-30 18:35:31 435

原创 Java集合框架

Java集合框架

2021-08-28 23:57:55 282

原创 Mysql中的事务

Mysql中的事务简介事务的四大特性(ACID):并发事务带来的问题事务隔离级别简介事务是逻辑上的一组操作,要么都执行,要么都不执行。事务的四大特性(ACID):原子性(Atomicity):事务是最小的执行单位,不允许分割。事务的原子性确保动作要么全部完成,要么完全不起作用;一致性(Consistency): 执行事务后,数据库从一个正确的状态变化到另一个正确的状态;隔离性(Isolation):并发访问数据库时,一个用户的事务不被其他事务所干扰,各并发事务之间数据库是独立的;持久性(Du

2021-08-27 18:36:13 185

原创 synchronized原理及优化

synchronizedMonitor简介Java对象头Monitor结构synchronized对象锁简介使用synchronized锁升级Monitor简介Monitor 被翻译为监视器或管程,每个 Java 对象都可以关联一个 Monitor 对象,如果使用 synchronized 给对象上锁(重量级)之后,该对象头的Mark Word 中就被设置指向 Monitor 对象的指针。Java对象头以 32 位虚拟机为例普通对象数组对象Mark Word 结构,如下图红框内表示一个M

2021-08-25 23:01:05 439

原创 jdk1.7中hashMap死锁详解

死锁发生的条件在hashMap扩容时,且在多线程访问时可能发生死锁。分析生成一个hashMap的初始table。public static void main(String[] args) { // 测试 java 7 中哪些数字的 hash 结果相等 System.out.println("长度为16时,桶下标为1的key"); for (int i = 0; i < 64; i++) { if (hash(i) %

2021-08-24 17:46:32 1394

原创 字符串拼接和intern()方法分析

String拼接String基本特征源码分析字符串拼接原理分析intern()方法String基本特征String声明为final,不可被继承String实现了Serializable接口,表示字符串支持序列化,实现Comparable接口,可比较大小Jdk1.8使用final char value[ ] 存储,Jdk1.9使用final byte[ ] value,更加节省空间不可变性,一旦赋值便不可改变String的String Pool是一个固定大小的HashTable(数组加链表结构)

2021-08-22 21:42:51 171

原创 共享模型之无锁(CAS和valotile)

共享模型之无锁-CAS取款案例解决方式解决方式一解决方式二总结方式二---无锁CASCPU核心数取款案例public class TestAccount { public static void main(String[] args) { //初始化余额为10000 Account account = new AccountUnsafe(10000); //1000个线程同时运行 Account.demo(account); }

2021-08-21 23:11:13 219

原创 线程创建和常见方法

线程创建和常见方法线程简介创建方式创建方式一创建方式二创建方式三通用方式Lambda表达式的使用条件Thread 与 Runnable 的关系(源码分析)常用方法线程的状态重点说明join()方法线程简介现代操作系统调度的最小单元是线程,也叫轻量级进程在一个进程里可以创建多个线程,这些线程都拥有各自的计数器、堆栈和局部变量等属性,并且能够访问共享的内存变量一个线程在一个时刻一般只能运行在一个处理器核心上创建方式创建方式一实现 Runnable 接口public class Runnabl

2021-08-21 21:48:58 232

原创 Jdk1.7HashMap底层原理

简介基于哈希表的 Map 接口的实现HashMap是线程不安全的,在多线程下可能出现问题,而HashTable是线程安全的。HashMap 的实例有两个参数影响其性能:初始容量 和加载因子。将在下文介绍。源码分析Entry类型存储//用于存储Node节点,由上图所示static class Entry<K,V> implements Map.Entry<K,V> { final K key; //键 V value; //值

2021-08-20 18:25:51 136

原创 快速排序(Java)

快速排序(Java)package com.lx;import java.util.Arrays;/** * @author lx * @version 1.0 * @description: 快速排序 * @date 2021/8/20 17:29 */public class QuickSort1 { private static void quicksort(int[] nums,int begin,int end){ //当数组只剩一个元素或没有元素

2021-08-20 17:51:14 64

原创 平衡二叉树、B树、B+树和B*树知识点总结

平衡二叉树非叶子节点最多拥有两个子节点;非叶子节值大于左边子节点、小于右边子节点;树的左右两边的层级数相差不会大于1;没有值相等重复的节点平衡二叉树是基于二分法的策略提高数据的查找速度的二叉树的数据结构平衡二叉树是采用二分法思维把数据按规则组装成一个树形结构的数据,用这个树形结构的数据减少无关数据的检索,大大的提升了数据检索的速度B树描述B树时,需要指定它的阶数,M阶树表明一个节点最多有M-1个关键字,M个子节点也称B-树,它是一颗多路平衡查找树每个节点最多有m-1个关键字根节点

2021-08-19 22:28:38 248

原创 哈夫曼树和哈夫曼编码

概念介绍路径和路径长度在一棵树中,从一个结点往下可以达到的孩子或孙子结点之间的通路,称为路径。通路中分支的数目称为路径长度。若规定根结点的层数为1,则从根结点到第L层结点的路径长度为L-1。如下图,L为路径长度。结点的权若将树中结点赋给一个有着某种含义的数值,则这个数值称为该结点的权,如下图,W为权值。带权路径长度从根结点到该结点之间的路径长度与该结点的权的乘积。A的带权路径长度:L1 X W1 = 15B的带权路径长度:L2 X W2 = 40C的带权路径长度:L3 X W3

2021-08-19 11:10:03 225

原创 GC标记算法

标记-清除算法算法分为“标记”和“清除”两个阶段首先标记出所有需要回收的对象,在标记完成后,统一回收掉所有被标记的对象。或者,标记存活的对象,统一回收所有未被标记的对象标记过程就是对象是否属于垃圾的判定过程,主要是可达性分析算法图示如下:缺点:执行效率不稳定,如果Java堆中包含大量对象,而且其中大部分是需要被回收的,这时必须进行大量标记和清除的动作,导致标记和清除两个过程的执行效率都随对象数量增长而降低;内存空间的碎片化问题,标记、清除之后会产生大 量不连续的内存碎片,空间碎片太多可能会

2021-08-18 15:05:34 318

原创 HotSpot堆内存

Element ui中的时间组件:向后台传参:// 获取分页数据findPage: function (data) {let beginTime = nulllet endTime = null//获取时间框中的值if(this.filters.timeSlice!=null){beginTime = this.filters.timeSlice[0]endTime = this.filters.timeSlice[1]console.log(beginTime)consol

2021-08-17 22:29:10 167

原创 GC(垃圾收集)简介

方法区:各个线程共享的内存区域用于存储已被虚拟机加载 的类信息、常量、静态变量、即时编译器编译后的代码缓存等数据《Java虚拟机规范》中把 方法区描述为堆的一个逻辑部分,但是它却有一个别名叫作“非堆”(Non-Heap),目的是与Java堆区 分开来对于HotSpot虚拟机: 永久代是方法区的落地实现,即永久代用来存储方法区中需要存储的数据信息。(jdk1.8之前)jdk1.7之前,方法区也可称为永久代;jdk1.7,将永久代中的字符串常量池和静态变量从永久代中移出,放到Java堆中;jdk

2021-08-17 21:48:41 111

原创 方法区(永久代和元空间)

1. 各个线程共享的内存区域2. 用于存储已被虚拟机加载 的**类信息、常量、静态变量、即时编译器编译后的代码缓存**等数据3. 《Java虚拟机规范》中把 方法区描述为堆的一个逻辑部分,但是它却有一个别名叫作“非堆”(Non-Heap),目的是与Java堆区 分开来4. 对于HotSpot虚拟机: 永久代是方法区的落地实现,即永久代用来存储方法区中需要存储的数据信息。(jdk1.8之前) jdk1.7之前,方法区也可称为永久代; jdk1.7,将永久代中的...

2021-08-17 21:09:35 212

原创 堆排序详述

1、 堆排序简介堆是一个完全二叉树,堆的时间复杂度是O(nlogn),空间复杂度是O(1)。堆是一个不稳定的排序算法,即在两个相同值的数据在交换后相对位置可能发生改变。如下:堆分为大顶堆和小顶堆大顶堆:每个结点的值都大于其左孩子和右孩子结点的值小顶堆:每个结点的值都小于其左孩子和右孩子结点的值2、 堆的结构分析堆节点之间的关系父结点索引:(i-1)/2左孩子索引:2i+1右孩子索引:2i+2构造堆初始化堆的结构如下。将数组按从左到右,从上到下的顺序排列。构成大

2021-08-17 13:34:12 130

原创 JVM虚拟机栈

Java虚拟机栈结构栈帧结构1.局部变量表(Local Variables)2.操作数栈(Operand Stack)(或表达式栈)3.动态链接(Dynamic Linking)(或执行"运行时常量池"的方法引用)4.方法返回地址(Return Adress)(或方法正常退出或者异常退出的定义)5.一些附加信息局部变量表局部变量表存放了编译期可知的各种Java虚拟机基本数据类型(boolean、byte、char、short、int、 float、long、doubl

2021-08-16 17:53:17 98

原创 Java异常体系

1、Thorwable类(表示可抛出)是所有异常和错误的超类,两个直接子类为Error和Exception,分别表示错误和异常。 其中异常类Exception又分为运行时异常(RuntimeException)和非运行时异常, 这两种异常有很大的区别,也称之为不检查异常(Unchecked Exception)和检查异常(Checked Exception)。2、Error与Exception​ Error是程序无法处理的错误,它是由JVM产生和抛出的,比如OutOfMemoryError、.

2021-08-15 23:11:39 185

原创 初识JVM

JVM简单结构图Java文件编译成字节码文件,类加载器将字节码文件加载到JVM。JVM主要包括类加载器、运行时数据区、执行引擎和本地方法调用。下面是详细结构图:

2021-08-15 23:02:58 78

原创 easyexcel导出表格,后端Spring boot,前端Vue脚手架

引入依赖需要poi包的支持 <dependency> <groupId>com.alibaba</groupId> <artifactId>easyexcel</artifactId> <version>2.2.7</version> </dependency> <dependency&

2021-08-14 17:33:13 499

原创 Mybatis执行器源码浅析

MybatisJdbc简介Java Database Connectivity–Java数据库连接,是Java语言中用来规范用户程序如何来访问数据库的应用程序接口。它是面向关系型数据库的。Jdbc的执行步骤:普通方式:1、加载驱动2、获取数据库连接3、编写sql3、获取Statement对象4、执行sql,获取结果集5、关闭连接,释放资源public static void main(String[] args) throws ClassNotFoundException, SQLEx

2021-08-14 16:04:50 132

原创 反射的浅析

Java反射机制的核心是在程序运行时动态加载类并获取类的详细信息,从而操作类或对象的属性和方法。本质是JVM得到类对象之后,再通过类对象进行反编译,从而获取对象的各种信息。Java属于先编译再运行的语言,程序中对象的类型在编译期就确定下来了,而当程序在运行时可能需要动态加载某些类,这些类因为之前用不到,所以没有被加载到JVM。通过反射,可以在运行时动态地创建对象并调用其属性,不需要提前在编译期知道运行的对象是谁。反射有什么好处?1、在程序运行过程中动态的操作对象2、能降低耦合性,提高程序

2021-08-13 23:47:56 65

原创 Spring AOP原理浅析

AOP(面向切面编程)是一种编程思想。在实际开发中我们可以通过Spring AOP对业务进行增强,即在不改变原来业务基本架构和逻辑的基础上对某部分业务进行扩展。例如,我们可以通过Spring AOP对业务中的CRUD操作添加日志,记录一些细节,如记录进行查询操作的时间和ip地址等信息。Spring AOP底层是基于代理来实现的,Jdk动态代理和Cglib动态代理。动态代理在前面做过简要分析。这里主要介绍两者的不同点:如果目标对象实现了某一接口,则一般通过Jdk动态代理方式来生成代理对象。如果目标对象

2021-08-13 23:19:37 107

原创 为什么说重写equals方法要重写hashCode方法

首先查看Object超类中的equals方法和hashCode:(源码) public boolean equals(Object obj) { return (this == obj); }native表示这个方法是原生函数,也就是这个方法是用C/C++语言实现的。hashCode主要是根据一定的规则来生成和对象对应的哈希值。和哈希算法相关。public native int hashCode();== 号表示比较基本数据类型时比较值,比较引用类型时比较地址

2021-08-12 23:25:16 105

原创 类加载和创建对象时语句执行顺序

可以自己首先尝试分析结果,然后再看解析。public class Test5 { private static int k = 1; private static Test5 t1 = new Test5("t1"); private static Test5 t2 = new Test5("t2"); private static int i = print("i"); private static int n = 99; { pr.

2021-08-12 21:51:18 269

原创 Java中方法参数都是值传递

Java中的方法参数都是值传递。并没有传引用。如下:package com.lx;/** * @author liuxu * @version 1.0 * @description: * @date 2021/8/11 22:31 */public class Test3 { //基本类型 public static void swap(int a,int b){ int c = a; a = b; b = c;

2021-08-12 08:38:56 345

原创 装箱和拆箱,128陷阱

Java中每个基本类型都有一个包装类。例byte → Byteshort → Shortint → Integerlong→ Longfloat → Floatdouble → Doublechar → Characterboolean→ Boolean基本类型转换为包装类类型:装箱 //装箱 int a = 100; Integer a1 = Integer.valueOf(a); System.out.print.

2021-08-11 22:18:55 101

原创 代理模式解析,静态代理和动态代理

简单理解:我们在编写增删改查时,如果需要在不改变原有的类的结构的基础上,对这些数据库CRUD操作追加额外的日志记录功能。在项目研发中,通常使用的是spring框架中的aop设计模式或者拦截器。而他们的原理便是基于动态代理的思想。代理模式是如何实现的?以日志记录为例子。静态代理:代理模式中有三个基本角色-----真实角色,抽象角色,代理角色。抽象角色:增删改查的接口UserServicepublic interface UserService { void select()

2021-08-11 18:57:22 94

空空如也

空空如也

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

TA关注的人

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