自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 HashMap之扩容&rehash详解

HashMap扩容

2023-10-19 19:41:21 875

原创 数组(二)排序(冒泡插入选择快速)

排序介绍排序对任何程序员来说都不模式,在很多编程语音中提供了很多编程函数,如java中Arrays.sort()等。排序算法有很多,本章节着重讲解集中常见的排序算法,如冒泡排序、插入排序、选择排序、快速排序。其他还有很多排序算法,有兴趣也可以自行了解。分析排序算法排序算法有很多,那么哪种算法比较好,什么情况下该用哪种算法,该怎么界定呢?我们可以从算法的执行效率、内存消耗两个维度来分析。执行效率执行效率一般从时间复杂度和算法比较交换移动的次数来观察。一般分析算法的复杂度,需要计算算法平均的时间复杂

2022-03-29 11:30:29 146

原创 数组(一)基础介绍

在每种编程语音中,都存在数组这种数据结构。它不仅是编程语音中的一种数据结构,也是最基础的一种数据结构。例如java中的ArrayList,底层的数据结构便是数组。

2022-03-20 15:13:26 992

原创 Spring Bean生命周期源码解析

介绍目前大部分的 Java 互联网项目,都是用 Spring作为基础框架,管理bean,融合其他框架。Spring Bean生命周期和我们日常开发密不可分,我们虽然可能不太了解原理,但每天都会用,且作为面试的重点、重灾区,让我们一探究竟。我们众知的Spring Bean生命周期包含实例化、填充属性、初始化,这也是狭义上的Bean生命周期。由于Spring Bean生命周期源内容较多,本文以较粗的粒度剖析源码,从spring启动到bean创建完成的过程,其他细节内容后期专门讲解。源码解析容器启动与包

2021-05-07 17:43:09 295

原创 Spring与Mybatis整合源码解析

介绍目前大部分的 Java 互联网项目,都是用 Spring MVC + Spring + MyBatis 搭建平台的。使用 Spring IoC 可以有效的管理各类的 Java 资源,达到即插即拔的功能;通过 Spring AOP 框架,数据库事务可以委托给 Spring 管理,消除很大一部分的事务代码,配合 MyBatis 的高灵活、可配置、可优化 SQL 等特性,完全可以构建高性能的大型网站。在 Spring 环境中使用 MyBatis 也更加简单,节省了不少代码,甚至可以不用 SqlSessio

2021-03-23 11:19:35 240 1

原创 Mybatis系列之运行过程源码解析

介绍MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。上述是Mybatis官网介绍,个人认为Mybatis是个持久层框架,通过我们配置的XML或注解,先解析文件后通过jdbc访问数据库返回我们想要的数据。简

2021-03-22 10:36:18 136

原创 java集合之ArrayList

介绍ArrayList是我们日常开发中最常用的集合类。继承自 AbstractList,实现了 List 接口。底层基于数组实现容量大小动态变化。允许 null 的存在。同时还实现了 RandomAccess、Cloneable、Serializable 接口,所以ArrayList 是支持快速访问、复制、序列化的。属性 //默认容量大小 private static final int DEFAULT_CAPACITY = 10; //空数组 private static f

2021-03-17 15:38:44 105

原创 reids之底层数据结构

底层数据结构redis常用的数据结构:String、hash、list、set、zet,每个数据结构底层见下图:

2021-03-12 09:41:12 130

原创 并发编程之CountDownLatch源码解析

简介CountDownLatch允许一个或多个线程等待其它线程的操作执行完毕后再执行后续的操作。是通过一个计数器来实现的,计数器的初始值是线程的数量。每当一个线程执行完毕后,计数器的值就-1,当计数器的值为0时,表示所有线程都执行完毕,然后等待的线程就可恢复工作。CountDownLatch的通常用法和Thread.join()有点类似,等待其它线程都完成后再执行主任务。简单使用public class CountDownLatchTest { public static void main

2021-03-05 11:41:21 193 2

原创 并发编程之ReentrantLock--Condition

介绍Condition是条件锁的意思,是指在获取锁之后发现当前业务场景自己无法处理,而需要等待某个条件的出现才可以继续处理时使用的一种锁。最常见的生产者消费者模式,生产的元素都被消费完,则需要阻塞消费者,不可继续消费直到生产者生产新的后唤醒消费者;或者生产者生产过快,容器已满,则需要阻塞生产者,直到消费者消费一定数量才唤醒生产者。Condition是一个接口,其定义如下public interface Condition { //阻塞当前线程,等待同一个Condition对象上的signal()/

2021-02-26 16:58:27 155

原创 并发编程之线程状态

线程状态Java语言定义了6种线程状态,在任意一个时间点中,一个线程只能有且只有其中的一种状态,并且可以通过特定的方法在不同状态之间转换。这6种状态分别是:1、新建(New):创建后尚未启动的线程处于这种状态。2、运行(Runnable):包括线程状态中的Running 和Ready,也就是处于此状态的线程有可能正在执行,也有可能正在等待着操作系统为它分配执行时间。3、无限期等待(Waiting ):处于这种状态的线程不会被分配处理器执行时间,它们要等待被其他线程显式唤醒。4、限期等待(Timed

2021-02-25 20:42:30 1548

原创 JVM系列之垃圾回收器(二)

Garbage First 收集器初始标记(Initial Marking): 标记GC Roots能够关联的对象,并且修改TAMS的值,需要暂停⽤户线程并发标记(Concurrent Marking): 从GC Roots进⾏可达性分析,找出存活的对象,与⽤户线程并发执⾏最终标记(Final Marking): 修正在并发标记阶段因为⽤户程序的并发执⾏导致变动的数据,需暂停⽤户线程筛选回收(Live Data Counting and Evacuation):对各个Region的回收价值和成本进

2021-02-23 16:07:31 218

原创 JVM系列之垃圾回收器(一)

经典垃圾收集器按代分新生代:Serial,ParNew,Parallel Scavenge老年代: Serial Old,CMS,Parallel Old不分代:G1,ZGC按并行/并发分并行收集器:Serial, Serial Old ,ParNew ,Parallel Scavenge, Parallel Old并发收集器:CMS, G1, ZGC并行(Parallel):描述的是多条垃圾收集器线程之间的关系,说明同⼀时间有多条这样的线程在协同⼯作,通常默认此时⽤户线程是处于等待状态。

2021-02-23 15:44:23 208

原创 JVM系列之垃圾回收基础

什么是垃圾对象JVM执行时是基于栈的字节码执行引擎,某方法执行时,虚拟机栈会创建一个栈帧,栈帧中存在局部变量表、操作数栈、方法出口等区域。方法执行过程中,基本数据类型存放在栈帧中,但引用类型在栈帧中存放的是一个引用,具体对象时存放在堆中,如Object o = new Object(),就有一个引用o指向堆中的对象。方法执行完成后,栈中的对象随着栈帧运行结束而被回收,⽽在此过程中在堆中创建的对象不会被回收,从而形成“垃圾”。再看下JVM数据共享逻辑图,可以看出指向堆中一共有几块区域,线程私有的程序计数

2021-02-23 11:07:38 258 1

原创 JVM系列之类加载机制

介绍JVM类加载过程分为五个部分:加载-连接-初始化-使用-卸载,其中“连接”阶段包括:“校验”、“准备”、“解析”。加载加载过程负责查找和导入class文件1、通过一个类的全限定名来获取定义此类的二进制字节流2、将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构3、在内存中生成一个代表这个类的java.lang. Class对象,作为方法区这个类的各种数据的访问入口。问题:ClassLoader.load() 与Class.forName()区别?相同点:都可以动态加载类

2021-02-19 15:04:12 281

原创 JVM系列之双亲委派模型

双亲委派模型JVM提供了3种类加载器:•启动类加载器(Bootstrap ClassLoader):负责加载 JAVA_HOME\lib 目录中的,或通过-Xbootclasspath参数指定路径中的,且被虚拟机认可(按文件名识别,如rt.jar)的类。•扩展类加载器(Extension ClassLoader):负责加载 JAVA_HOME\lib\ext 目录中的,或通过java.ext.dirs系统变量指定路径中的类库。•应用程序类加载器(Application ClassLoader):负

2021-02-10 10:36:14 355

原创 JVM系列之ClassLoader

类加载器介绍类加载器负责加载JAVA类的字节码到JAVA虚拟机中,可理解成JVM和字节码代码的桥梁,可以根据指定的类名(如java.lang.Object)来装载class文件的内容到Runtime data area 中的 method area( 方法区域)。从JVM的角度讲,主要有两种类型加载器:启动类加载器和所有其它的类加载器。启动类加载器是JVM实现的一部分,使用C++语言实现,其它类加载器都由java语言实现,独立于虚拟机外部,并且全部继承抽象类java.lang.ClassLoader。

2021-02-10 10:28:16 402 2

原创 JVM系列之运行时数据区与内存异常演示

JVM概述JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。引入Java语言虚拟机后,Java语言在不同平台上运行时不需要重新编译。Java语言使用Java虚拟机屏蔽了与具体平台相关的信息,使得Java语言编译程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。众所周知,java是跨平台语音,重点就在这,是通过JVM实现跨平台的,

2021-02-09 16:19:51 441 1

原创 Spring系列之@Autowired源码解析

11

2021-02-03 19:32:00 1352 2

原创 并发编程之ThreadLocal源码解析与内存泄露

ThreadLocal简介多线程访问同一个共享变量的时候容易出现并发问题,特别是多个线程对一个变量进行写入的时候,为了保证线程安全,一般使用者在访问共享变量的时候需要进行额外的同步措施才能保证线程安全性。ThreadLocal是除了加锁这种同步方式之外的一种保证一种规避多线程访问出现线程不安全的方法,当我们在创建一个变量后,如果每个线程对其进行访问的时候访问的都是线程自己的变量这样就不会存在线程不安全问题。ThreadLocal提供线程本地变量,每个线程拥有本地变量的副本,各个线程之间的变量互不干扰。T

2021-02-01 16:51:45 720

原创 并发编程之ConcurrentHashMap源码解析(二)

扩容解析addCount操作容器大小后扩容private final void addCount(long x, int check) { ...省略count加减逻辑,详细见上一章节 if (check >= 0) { Node<K,V>[] tab, nt; int n, sc; //sizeCtl 0.75 * 数组长度 且table不为null 且 table长度小于最大值 while

2021-01-28 15:03:11 426

原创 并发编程之ConcurrentHashMap源码解析(一)

ConcurrentHashMap简介ConcurrentHashMap是java中并发安全的HashMap,HashMap是我们最常使用的容器,但HashMap是不安全的。在多线程情况下,需使用ConcurrentHashMap。ConcurrentHashMap在jdk1.7底层使用Segment实现分段锁,ConcurrentHashMap底层是Segment数组,而每个Segment对象下面是个小型的HashMap。Segment对象继承ReentrantLock,操作时通过ReentrantLo

2021-01-28 10:25:34 845 4

原创 并发编程之synchronized原理

synchronized是Java中的关键字,是一种同步锁。保证同一时刻最多只有1个线程执行 被Synchronized修饰的方法 / 代码。它修饰的对象有以下几种:  1. 修饰一个代码块,被修饰的代码块称为同步语句块,其作用的范围是大括号{}括起来的代码,作用的对象是调用这个代码块的对象;  2. 修饰一个方法,被修饰的方法称为同步方法,其作用的范围是整个方法,作用的对象是调用这个方法的对象;  3. 修改一个静态的方法,其作用的范围是整个静态方法,作用的对象是这个类的所有对象;  4. 修

2021-01-26 16:27:30 317

原创 并发编程之ReentrantLock AQS原理

简单介绍ReentrantLock是一个可重入且独占式的锁,它具有与使用synchronized监视器锁相同的基本行为和语义,但与synchronized关键字相比,它更灵活、更强大,增加了轮询、超时、中断等高级功能。ReentrantLock,顾名思义,它是支持可重入锁的锁,是一种递归无阻塞的同步机制。除此之外,该锁还支持获取锁时的公平和非公平选择。ReentrantLock底层基于AQS实现锁机制。ReentrantLock中存在抽象类Sync,有两个实现类FairSync公平锁和NonfairS

2021-01-22 10:14:13 797

原创 Spring系列之生命周期回调

生命周期回调方法Spring在容器初始化bean之后(完成依赖注入后)和销毁前都提供了回调的方法,我们称之为生命周期的回调方法。Spring中提供了三种方式来完成生命周期的回调。官网解释直接看Spring的官网,在 Combining Lifecycle Mechanisms处有关于生命周期回调的介绍,具体如下图:从Spring2.5开始,有三个控制bean生命周期行为的选项:1、InitializingBean和DisposableBean回调接口2、自定义init()和destroy()方

2021-01-19 16:20:26 1080

原创 Spring系列之BeanDefinition

什么是BeanDefinition官网解释直接看Spring的官网,在 Bean Overview处有关于BeanDefinition的介绍,具体如下图:翻译下大体意思为:springioc容器管理一个或多个bean。这些bean是使用提供给容器的配置元数据创建的。在容器本身中,这些bean定义表示为BeanDefinition对象,其中包含以下元数据:1、包限定类名:通常是所定义bean的实际实现类。2、Bean行为配置元素,它说明Bean在容器中的行为(范围、生命周期回调等)。3、对be

2021-01-19 10:57:08 748

原创 并发编程之线程池源码解读

线程池简介使用线程池可以很好地提高性能,线程池在系统启动时即创建大量空闲的线程,程序将一个任务传给线程池,线程池就会启动一条线程来执行这个任务,执行结束以后,该线程并不会死亡,而是再次返回线程池中成为空闲状态,等待执行下一个任务。jdk1.5后新增Executors和ThreadPoolExecutor类,是Java提供的用于管理线程池的类。三种常见的线程池详解创建线程池 //可缓存线程池 ExecutorService newCachedThreadPool = Execu

2021-01-15 16:10:39 694

原创 Spring系列之手写自定义的@Enable*注解

神奇的@Enable*注解在我们日常开发普通的spring-framework项目过程中@Enable用的不是很多,但在SpringBoot开发过程,我们经常会遇到@Enable开始的好多注解,比如@EnableWebMvc、@EnableEurekaServer、@EnableAsync、@EnableScheduling等,今天我们就来分析下这些注解到底是如何工作的,并写手自定的@Enable注解。@Enable*实现的原理以@EnableWebMvc为例,先看其源码@Retention(Ret

2021-01-15 11:05:32 793

原创 Spring系列之@Import

Spring系列之@Import@Import简介@Import表示用来导入配置类或者一些需要前置加载的类.。@Import支持 三种方式1.带有@Configuration的配置类(4.2 版本之前只可以导入配置类, 4.2版本之后 也可以导入 普通类)2.ImportSelector 的实现3.ImportBeanDefinitionRegistrar 的实现导入@Configuration的配置类1、代码结构见上图,RootConfig和OtherConfig在两个目录中//Com

2021-01-13 11:34:17 513

原创 Spring系列之常用注解

Spring系列之常用注解注解好处1、XML配置起来有时候冗长,此时注解可能是更好的选择,简化了XML配置;2、注解相对于XML的另一个好处是类型安全的,XML只能在运行期才能发现问题,注解在开发阶段则可以发现问题。常见注解用于创建bean对象:此类注解主要注解在类上。@Component 把普通类注入到容器中,表示注解的类交给Spring管理,需要Spring为这个类创建bean,等同于XML文件中配置,属性:value 用于指定bean的id,当不写时,默认值为类名的驼峰命令由此注解衍生

2021-01-12 17:42:16 322

空空如也

空空如也

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

TA关注的人

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