自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Redis知识点&面试题总结

热衷学习,热衷生活!😄沉淀、分享、成长,让自己和他人都能有所收获!😄一、简单的介绍一下Redis简单的说Redis就是一个使用C语言开发的一个数据库,不过与传统数据库不同的是Redis的数据是存在内存中的,它是内存数据库,所以读写速度非常快,所以Redis被广泛应用于缓存方向。另外,Redis除了做缓存之外,也还经常用于做分布式锁,甚至是消息队列。Redis提供了多种数据类型来支持不同的业务场景。Redis还支持事务、持久化、Lua脚本、多种集群方案。二、Redis持久化机制Redis是一.

2022-05-06 18:58:42 601 1

原创 InnoDB存储引擎对MVCC的实现

热衷学习,热衷生活!😄沉淀、分享、成长,让自己和他人都能有所收获!😄一、一致性非锁定读对于一致性非锁定度的实现,通常的方式是加一个版本号或者时间戳,在更新数据的时候版本号+1或者更新时间戳。查询时,将当前可见的版本号与对应记录的版本号做对比,如果记录的版本号小于可见版本,则表示该记录可见。在InnoDB存储引擎中,多版本控制就是对一致性非锁定读的实现。如果读取的行正在执行delete或者update操作,这时候读取操作不会去等待行释放锁,而是会去读取行的一个快照数据,对于这种读取历史数据的方式,.

2022-05-02 15:44:31 398

原创 MySQL事务隔离级别详解

一、什么是事务?事务是逻辑上的一组操作,要么全执行,要么全不执行。事务最经典栗子也经常被拿出来的栗子就是银行转账了。比如小明要给小红转账1000元,这个转账会涉及到两个关键操作:将小明的余额减1000元,将小红的余额减1000元。万一这两个操作之间突然出现错误,导致小明余额减少但是小红余额没有增加,这种情况是肯定不允许的。事务就是保证这两个关键操作要么都成功,要么都不成功。二、事务的特性(ACID)**原子性:**事务最小的执行单位,不允许分割。事务的原子性确保动作要么全部执行,要么全部不执行。

2022-04-28 20:47:11 35306 5

原创 MySQL三大日志(binlog,redolog,undolog)详解

热衷学习,热衷生活!😄沉淀、分享、成长,让自己和他人都能有所收获!😄一、MySQL日志MySQL日志主要包括错误日志、查询日志、慢查询日志、事务日志、二进制日志几大类。其中比较重要的就是二进制日志binlog(归档日志)、事务日志redo log(重做日志)和undo log(回滚日志)。日志关系如下图:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qyhy0V48-1650892680081)(https://qtspace.cn/contentimg/55..

2022-04-25 21:19:24 2925 1

原创 MySQL索引详解

热衷学习,热衷生活!😄沉淀、分享、成长,让自己和他人都能有所收获!😄一、什么是索引?索引有什么作用?索引是一种用于快速查询和检索数据的数据接口。常用的索引数据结构有:B树、B+树、Hash表。索引的作用就相当于目录的作用。比如:我们在查字典的时候如果没有目录,我们就只能一页一页去查找字,速度很慢,如果有目录,我们只需要查找字所在的页数,然后直接翻到那一页就可以了。索引的优点缺点优点索引可以让我们更快的检索出我们需要查找的数据,这也是创建索引的最主要的原因。可以通过创建唯一索引,保证数据.

2022-04-17 19:09:53 1389

原创 Mybatis手撸(二)创建简单的映射器代理工厂

热衷学习,热衷生活!😄沉淀、分享、成长,让自己和他人都能有所收获!😄一、前言我们在使用Mybatis的时候,都会有这样子的一个疑问:“为什么Mybatis只需定义一个接口,不用写实现类就能使用XML中或者注解中的SQL语句完成对数据库的CRUD呢?”。看过Mybatis源码之后才知道原来Mybatis使用了Mapper接口代理类,把所有的数据库操作都交给了代理类处理。二、Binding模块这个Mapper接口代理类在Binding模块,核心类是org.apache.ibatis.binding.

2022-04-11 22:02:38 716

原创 Mybatis手撸(一)Mybatis简介和整体架构

热衷学习,热衷生活!😄沉淀、分享、成长,让自己和他人都能有所收获!😄一、Mybatis简介MyBatis 官方文档Mybatis是一款旨在帮助开发人员屏蔽底层重复性的JDBC代码的持久层框架,支持通过配置文件或者注解将ResultSet映射成Java对象。相对于其它ORM框架,Mybatis更为轻量级,支持定制化SQL和动态SQL,方便优化查询性能,同时包含了良好的缓存机制。二、Mybatis整体架构Mybatis整体架构如下图:接口层SqlSession接口层定义了暴露给应用程序调.

2022-04-11 22:01:51 766

原创 Java线程池实现原理详解

热衷学习,热衷生活!😄沉淀、分享、成长,让自己和他人都能有所收获!😄一、为什么要使用线程池?线程池提供了一种限制和管理资源(线程、任务)的方式。这里借用《Java 并发编程的艺术》提到的来说一下使用线程池的好处:降低资源消耗:通过重复利用已创建的线程降低线程创建和销毁造成的消耗。提高响应速度:当任务到达时,任务可以不需要等待创建线程就能立即执行。提高线程的可管理性:线程是稀缺资源,如果无线的创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一的分配,调优和监控。二、.

2022-04-10 22:03:37 2786

原创 Thread状态流转、方法使用、原理分析

沉淀、分享、成长,让自己和他人都能有所收获!😄一、Thread状态Java的线程状态描述在Thread类里面的枚举类State中,包路径为java.lang.Thread.State,总共包含以下六种状态:NEW、RUNNABLE、BLOCKED、WAITING、TIMED_WAITING、TERMINATEDpublic enum State { // 尚未启动的线程的线程状态 NEW, // 可运行线程的线程状态,是可运行的线程 // 这个状态在Jav.

2022-04-04 19:07:30 520 1

原创 ThreadLocal底层实现原理详解

一、ThreadLocal简介ThreadLocal顾名思义可以根据字面意思理解成线程本地变量。也就是说如果定义了一个ThreadLocal,每个线程都可以在这个ThreadLocal中读写,这个读写是线程隔离的,线程之前不会有影响。每个Thread都维护自己的一个ThreadLocalMap,所以是线程隔离的。/* ThreadLocal values pertaining to this thread. This map is maintained * by the ThreadLocal cl

2022-04-02 08:54:35 1292 1

原创 Java锁(三):Semaphore共享锁详解

一、基于AQS实现的锁AQS(AbstractQueuedSynchronizer) 是Java并发包JUC中非常重要的一个类,大部分锁都是基于AQS实现的,主要实现的类如下:ReentrantLock:可重入锁,独占锁,实现了公平锁和非公平锁,这个是上篇内容介绍的类,也是最常用类,通常会和synchronized作比较。ReentrantReadWriteLock:读写锁,可共享也可独占锁,读是共享锁,写是独占锁,也实现了公平锁和非公平锁。Semaphore:信号锁,共享锁,也实现了公

2022-03-29 21:48:31 2437

原创 Java锁(二):AbstractQueuedSynchronizer、ReentrantLock详解

一、AbstractQueuedSynchronizer简介AQS(AbstractQueuedSynchronizer)是并发容器JUC(java.util.concurrent)下locks包内的一个抽象类,是一个同步器,是用来构建锁或者其他同步组件的基础框架,内部维护了一个成员变量state表示同步状态,state=0表示线程未获取到锁,state > 0表示获取到锁,state > 1表示重入锁的数量,被 volatile修饰保证了可见性,通过CAS操作对其修改,内置维护了FIFO队列

2022-03-28 13:21:43 505

原创 Java锁(一):volatile、synchronized详解

一、锁的基础知识锁的类型锁从客观上分为悲观锁和乐观锁。乐观锁:乐观锁是一种乐观思想,认为写少读多,遇到并发写的可能性比较低,读数据的时候认为别人不会修改,所以读的时候不会上锁,但是在写的时候会判断一下在此期间有没有别人去更新这个数据,采取的是先读取当前版本号,然后加锁操作,写完的时候读取最新版本号做记录的版本号做比较一样则成功,如果失败则重复读-比较-写的操作。Java中的乐观锁基本都是通过CAS操作实现的,java.util.concurrent.atomic包下的原子变量。CAS(compare

2022-03-26 14:16:32 2317

原创 JVM-GC垃圾回收机制

学习JVM垃圾回收机制主要学习以下几点:哪些内存需要回收(判断对象可以回收)、什么时候回收(GC什么时候执行)、怎么回收(垃圾回收算法、垃圾回收器)、垃圾回收过程。JVM GC回收哪些区域内的垃圾?JVM GC只回收堆区和方法区内的对象,不回收虚拟机栈内的数据,栈内数据在超出作用域后会被JVM自动释放掉。因为JVM GC回收堆区的对象,所以先了解学习一下堆内存的结构图:堆内存分为年轻代(Young Generation)、老年代(Old Generation),年轻代和老年代所占空间比例默认是1:2

2022-03-22 22:01:53 637

原创 六大设计模式原则-依赖倒置原则

一、依赖倒置原则定义依赖倒置原则:抽象不应该依赖于实现,实现应该依赖于抽象,也就是说我们应该面对抽象(接口)编程,而不应该面对实现编程。二、依赖倒置原则描述依赖倒置原则要求我们在程序代码中传递参数或在关联关系时,尽量引用高层次类抽象类(接口类),而不应该引用具体的实现类,即使用抽象类或者接口进行变量类型声明、参数类型声明、方法返回结果声明。在引用抽象层之后,系统将得到很好的灵活性,抽象类无需改变,只需新增新的实现类即可,也满足了开闭原则。三、依赖倒置原则示例场景现有一个抽奖策略的设计,在不使用设

2022-03-20 17:12:45 701

原创 JVM-类加载详解

一、JVM类加载过程JVM类加载过程如下图:JVM类加载过程分为:加载 、链接 、初始化 、使用 、卸载 这五个阶段,其中链接阶段又包括: 验证 、 准备 、 解析 。加载 :通过类的完全限定名,查找此类的二进制字节码文件,通过该字节码文件创建Class对象。链接 :包含 验证 、 准备 、 解析 三个阶段:验证 :确保Class文件复合虚拟机规定的Class文件格式,包含文件格式验证、元数据验证、字节码验证、引用符号验证。准备 :为类的静态变量分配内存并设置初始化值,注:这里不包含fi

2022-03-19 20:10:41 7723

原创 六大设计模式原则-接口隔离原则

一、接口隔离原则定义接口隔离原则定义如下:接口隔离原则(Interface Segregation Principle, ISP):使用多个专门的接口,而不使用单一的总接口,即客户端不应该依赖那些它不需要的接口。二、接口隔离原则描述根绝接口隔离原则,当一个接口太大时,我们需要将它分割成一些细小的接口,使用该接口的客户端只需知道与之相关的方法即可。每一个接口应该承担一种相对独立的角色,不干不该干的事情,干该干的事请。这里的"接口"往往有两种不同的定义:一种是指一个类型所具有的方法特征的集合,仅仅是一种

2022-03-17 21:03:09 7344

原创 六大设计模式原则-迪米特法则

一、迪米特法则定义迪米特法则又最少知识原则,其定义如下:迪米特法则(Law of Demeter, LoD):一个软件实体应当尽可能少的与其他实体发生相互作用。二、迪米特法则描述如果一个系统满足迪米特法则,那么当其中一个软件实体发生变化时,就会尽量少的影响其他软件实体,扩展会相对容易,这是对软件实体之间通信的限制,迪米特法则要求限制软件实体之间通信的宽度和深度。迪米特法则可以降低系统的耦合度,使类与类之间保持松耦合状态。迪米特法则还有几种定义形式,包括:不要和"陌生人"说话、只与你的直接朋友通信等

2022-03-16 23:25:56 10063 2

原创 JVM-内存模型详解

一、JDK1.6、JDK1.7、JDK1.8内存模型演变JDK1.6、JDK1.7、JDK1.8内存模型演变规程如下图:从上图我们可以看出这些版本的JVM内存模型主要有以下差异:JDK1.6:有永久代,静态变量存放在永久代(方法区)。JDK1.7:有永久代,但是已经把字符串常量池、静态变量存放到堆中,逐渐减少永久代的使用。JDK1.8:无永久代,运行时常量池、类常量池都保存到元数据区,也就是常说的元空间。但字符串常量池仍存在堆中。二、JVM运行时内存区域概述JVM在运行时Java程序时,

2022-03-16 23:25:15 892

原创 六大设计模式原则-里式替换原则

一、里氏替换原则定义里氏替换原则是实现开闭原则的重要方式之一,定义如下:里氏替换原则(Liskov Substitution Principle,LSP):继承必须确保超类所拥有的性质在子类中必须仍然成立。里氏替换原则讲述了有关继承的一些原则,定义了什么时候该用继承,什么时候不该用继承。里氏替换原则是继承复用的基础,反应了父类和子类之间的关系,是对开闭原则的补充,是对实现抽象化的具体步骤的规范。二、里氏替换原则的作用里氏替换原则的作用主要如下:里氏替换原则是实现开闭原则的重要方式之一。克服了

2022-03-15 22:46:01 454

原创 六大设计模式原则-开闭原则

一、开闭原则定义开闭原则是面向对象的可复用设计的第一块基石,是最重要的面向对象设计原则。定义如下:开闭原则(Open-Closed Principle, OCP):一个软件实体应当对扩展开放,对修改关闭。即软件实体应尽量在不修改原有代码的情况下进行扩展。在开闭原则的定义中,这个软件实体可以是一个软件模块、一个由多个类组成的局部结构或者一个独立的类。二、开闭原则描述任何系统都需要面临一个很重要的问题,就是它们的需求会随着时间的推移而发生变化。当软件系统需要面对新的需求时,我们应该尽量保证系统的设计架

2022-03-14 23:27:29 3238

原创 六大设计模式原则-单一职责原则

一、单一职责原则定义单一职责原则是面向对象五个基本原则(SOLID)之一,也是最简单的面向对象设计原则,用于控制类的颗粒大小。单一职责定义如下:单一职责原则(SRP:Single responsibility principle):一个类只负责一个功能领域中的相应职责,也可以定义为:一个类应该只有一个发生变化的原因。二、单一职责原则描述单一职责原则告诉我们:一个类不能太"累",在一个系统中,如果一个类(大到模块,小到方法)承担的职责越多,那么它被复用的可能性就越小,而且耦合度很高,如果当其中一个职责

2022-03-09 22:44:21 1288

原创 String类解析

一 String描述public final class String implements java.io.Serializable, Comparable<String>, CharSequence { private final char value[]; ...}String是一个用final声明的常量类,不能被任何类继承,底层是由char[]数组实现,这个数组也是final,一旦String对象被创建,包含这个对象中的字符序序列是不可被改变的,改类后续的所有方

2022-03-08 20:26:59 673

原创 Collections工具类使用、源码分析

Collcetions 工具类java.util.Collections 是java集合框架中的一个工具类,主要用于Collectiont提供的通用算法,比如:排序(sort)、二分查找(binarySearch)、洗牌(shuffle)、旋转(rotate)1. Collections.sort 排序方法使用,代码测试List<String> list = new ArrayList<String>();list.add("7");list.add("4");l

2022-03-01 20:27:56 621

原创 Jdk8-HashMap

一、HashMap插入HashMap插入的流程主要包括:计算下标、何时扩容、何时链表转红黑树等,具体如下:首先对key进行hash值的扰动,获取一个新的hash值。(key == null) ? 0 : h = key.hashCode() ^ (h >>> 16)判断tab是否为null或者长度为0,如果是则进行扩容操作。if ((tab == table) == null || (n = tab.length == 0)) n = (tab = resize())

2022-02-28 12:32:59 598

原创 双端队列ArrayDeque、LinkedList

双端队列ArrayDeque、LinkedList一、前言Stack栈:先进后出Queue队列:先进先出在Java里有一个Stack类,但是这个类已经不推荐使用了,而Queue是一个接口,当我们需要使用栈和队列时,推荐使用更加高效的ArrayDeque该类实现Deque接口,次选使用LinkedList。二、总体介绍要讲栈和队列,首先要讲Deque接口。Deque的含义是"double ended queue",即双端队列,既可以当栈使用,也可以当队列使用。下表列出Deque和Queue相对应

2022-02-26 18:59:18 835

原创 ArrayList和LinkedList

Java中ArrayList和LinkedList的区别两者数据结构不同,ArrayList是基于数组实现、LinkedList是基于双向链表实现。从获取、删除、插入、内存开销这几个点来说明两者的区别。1、 获取:ArrayList的获取比LinkedList获取相比非常快,因为ArrayList的get方法的时间复杂度为O(1),而LinkList的为O(n)。ArrayList的get方法源码:public E get(int index) { rangeCheck(index);

2022-02-26 14:28:16 964

原创 HashCode & HashMap扰动函数、初始化容量、负载因子、扩容元素拆分

HashCode & HashMap扰动函数、初始化容量、负载因子、扩容元素拆分1.HashCode为什么用31作为乘数?String.class的hashCode方法如下:public int hashCode() { int h = hash; if (h == 0 && value.lengt > 0) { char[] val = value; for (int i = 0; i < value.length;

2022-02-22 21:33:42 786

原创 JDK中ArrayList的实现

JDK中ArrayList的实现ArrayList底层是一个Object数组,通过维护这个数组结构来改变ArrayList的结构。transient Object[] elementData;ArrayList实现比较简单,就是对数组进行操作,ArrayList定义了以下常量和实例变量。private final static int DEFAULT_CAPACITY = 10;//默认容量private final static Object[] EMPTY_ELEMENTDATA = {};

2021-12-23 11:29:28 141

空空如也

空空如也

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

TA关注的人

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