自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 ArrayList和LinkedList的区别

*ArrayList:**基于动态数组,连续内存存储,适合下标访问(随机访问)因为里面存的元素的类型是一致的,所以内存长度是固定的,所以很快就能找到具体位置的元素,扩容机制:因为数组长度固定,超出长度存数据时需要新建数组,然后将老数组的数据拷贝到新数组,如果不是尾部插入数据还会设计到元素的移动(往后复制一份,插入新元素),使用尾插法并指定初始容量可以极大提升性能、甚至超过linkedlist(需要创建大量的node对象)所以在不同的情况下,需要选择不同的List集合做业务。

2023-05-15 23:37:35 91

原创 ==和equals

String已经重写了equals方法,如下实际上是比较两个字符串中每一个字符的内容。字符串s1这种方式来定义字符串,实际上是在堆中的常量池里定义的,111是在常量池里的。== 对比的是栈中的值,基本数据类型是变量值,引用类型是堆中内存对象的值。equals()方法String已经重写了,所以无论怎么比较都是true。equals:object中默认也是采用== 进行比较,通常会重写。通过=号复制,赋值的就是引用地址。通过new的是在存的内存地址。

2023-05-15 22:57:39 76

原创 Spring依赖注入(二)注入

如果有@autowired、@inject、@value注解就会被spring认为是一个注入点,进行注入。jdk1.7的反射是无法直接获取方法的参数名字的,1.8也需要一定的编译配置才行。中,会根据该依赖描述从BeanFactory中找出对应的唯一的一个Bean对象。如果还是筛选出多个,就看其中有没有上面有@primary注解的,如果有直接返回。再看这些属性是不是泛型如果是泛型,看看和真正的泛型是不是匹配。然后,根据不同的类型进行不同的处理,直接看else就行了。第二个基于字节码本地变量表分析。

2022-10-12 15:41:33 249

原创 Spring依赖注入(一) 注入点

寻找注入点

2022-09-06 20:35:03 259

原创 bean的销毁过程

但是我们在定义一个Bean时,如果这个Bean实现了DisposableBean接口,或者实现了AutoCloseable接口,或者在BeanDefinition中指定了destroyMethodName,那么这个Bean都属于“DisposableBean”,这些Bean在容器关闭时都要调用相应的销毁方法。在销毁时,Spring会找出实现了DisposableBean接口的Bean。Bean销毁是发送在Spring容器关闭过程中的。

2022-09-02 14:06:33 436

原创 bean生命周期-流程图

流程图

2022-09-01 20:15:42 101

原创 Bean的生命周期-getbean

getbean

2022-09-01 20:09:37 225

原创 Bean的生命周期-合并beandefinition,beanfactory的处理

通过扫描得到所有BeanDefinition之后,就可以根据BeanDefinition创建Bean对象了,但是在Spring中支持父子BeanDefinition,和Java父子类类似,但是完全不是一回事。而在根据child来生成Bean对象之前,需要进行BeanDefinition的合并,得到完整的child的BeanDefinition。合并BeanDefinition的过程中,不是修改原有的两个,而是会生成第三个RootBeanDefinition,因为可能是其他的父亲。

2022-08-23 16:16:25 120

原创 Bean的生命周期-扫描Scan

扫描流程-源码-总结

2022-08-17 18:17:59 156

原创 Spring核心概念

spring核心概念,核心关键词

2022-08-16 11:42:28 88 1

原创 Spring原理机制概述

Bean的生命周期底层原理依赖注入底层原理初始化底层原理推断构造方法底层原理 AOP底层原理1. Spring事务底层原理

2022-08-16 11:34:25 232

转载 Java内存模型JMM

我们常说的JVM内存模式指的是JVM的内存分区;而Java内存模式是一种虚拟机规范。 Java虚拟机规范中定义了Java内存模型(Java Memory Model,JMM),用于屏蔽掉各种硬件和操作系统的内存访问差异,以实现让Java程序在各种平台下都能达到一致的并发效果,JMM规范了Java虚拟机与计算机内存是如何协同工作的:规定了一个线程如何和何时可以看到由其他线程修改过后的共享变量的值,以及在必须时如何同步的访问共享变量。 硬件内存架构 ...

2021-02-12 10:49:40 141 1

转载 执行引擎、JIT、逃逸分析

Java是半编译半解释型语言编译型语言:程序在执行之前需要一个专门的编译过程,把程序编译成 为机器语言的文件,运行时不需要重新翻译,直接使用编译的结果就行了。解释型语言:程序不需要编译,程序在运行时才翻译成机器语言,每执 行一次都要翻译一次。 两种解释器的底层实现 字节码解释器 做的事情是:java字节码->c++代码->硬编码 原理: 通过while(true) 或者 for 将读取的字节码进行一个个编译 源码: CASE(_new): { u2 index =

2020-12-03 16:43:58 141

转载 探索那讲不清的字符串

字符串常量池常量池 class文件中的:Constsnt pool 硬盘上运行时常量池:InstanceKlass的一个属性,方法区字符串常量池:String Pool —>底层StringTable—>底层HashTable 堆区 Key的生成方式 通过String的内容+长度生成hash值将hash值转为key hashValue = hash_string(name, len);index = hash_to_index(hashValue); // Pick hashin

2020-11-30 15:36:11 98

转载 内存池与JVM内存模型

基础 class文件 硬盘上的.class文件 class content 类加载器将硬盘上的.class文件读入内存中的那一块内存区域 Class对象 在java世界里,一切皆对象。从某种意义上来说,java有两种对象:实例对象和Class对象。每个类的运行时的类型信息就是用Class对象表示的。它包含了与类有关的信息。其实我们的实例对象就通过Class对象来创建的。Java使用Class对象执行其RTTI(运行时类型识别,Run-Time Type Identification),多态是基

2020-11-30 15:15:19 107

转载 字节码文件解析

基础知识进制 十进制转二进制 方法为:十进制数除2取余法,即十进制数除2,余数为权位上的数,得到的商值继续除2,依此步骤继续向下运算直到商为0为止。 二进制转十进制 方法为:把二进制数按权展开、相加即得十进制数。 二进制转八进制 方法为:3位二进制数按权展开相加得到1位八进制数。(注意事项,3位二进制转成八进制是从右到左开始转换,不足时补0)。 八进制转成二进制 方法为:八进制数通过除2取余法,得到二进制数,对每个八进制为3个二进制,不足时在最左边补零。 二进制转十六进制 方法为:与二

2020-11-30 15:02:16 300

转载 类加载器子系统与SPI

类加载JVM中有两种类型的类加载器,由C++编写的及由Java编写的。除了启动类加载器(Bootstrap Class Loader)是由C++编写的,其他都是由Java编写的。由Java编写的类加载器都继承自类java.lang.ClassLoader。 启动类加载器 因为启动类加载器是由C++编写的,通过Java程序去查看显示的是null 因此,启动类加载器无法被Java程序调用 启动类加载器不像其他类加载器有实体,它是没有实体的,JVM将C++处理类加载的一套逻辑定义为启动类加载器 查看启动

2020-11-30 14:28:36 110

转载 JVM底层之类加载

一.klass模型 klass模型类的继承结构 普通的Java类在JVM中对应的是instanceKlass类的实例 2.1 InstanceMirrorKlass:用于表示java.lang.Class,Java代码中获取到的Class对象,实际上就是这个C++类的实例,存...

2020-11-30 13:40:32 67

转载 锁模块之事务并发访问产生的问题以及事务隔离机制 InnoDB支持事务

锁模块之数据库事务的四大特性数据库事务的四大特性和程序事务的四大特性基本相同⑴ 原子性(Atomicity)原子性,这个是最简单的。说的是一个事务内所有操...

2020-07-29 23:49:05 127

转载 MySQL中的读锁和写锁

MySql锁(数据库都是悲观锁,java、redis、zookeeper会有乐观锁)锁的概念MySQL中的锁MyISAM锁      MyISAM共享读锁      MyISAM独占写锁   &...

2020-07-29 13:58:52 5986

转载 为什么b+tree更适合作为索引?

mysql的B+树索引 查找使用了二分查找,redis 跳表也使用了二分查找法,kafka查询消息日志也使用了二分查找法,二分查找法时间复杂度O(logn);参考:redis的索引底层的 跳表原理 实现 聊聊Mysql索引和redis跳表 ---redis的跳表原理 时间复杂度O(logn)(阿里)参考:kafka如何实现...

2020-07-28 14:26:50 292

转载 BTree和B+Tree

B+树索引是B+树在数据库中的一种实现,是最常见也是数据库中使用最为频繁的一种索引。B+树中的B代表平衡(balance),而不是二叉(binary),因为B+树是从最早的平衡二叉树演化而来的。在讲B+树之前必须先了解二叉查找树、平衡二叉树(AVLTree)和平衡多路查找树(B-Tree),B+树即由这些树逐步优化而来。二叉查找树二叉树具有以下性质:左子树的键值小于根的键值,右子树的键值大于根的键值。 如下图所示就是一棵二叉查找树,  对该二叉树的节点进行查找发现深度为1的

2020-07-28 14:10:40 108

原创 关于子线程的异常捕获 - UncaughtExceptionHandler

一、为什么需要Thread.UncaughtExceptionHandler1.主线程可以轻松找到异常,但是子线程不行。/** * 子线程异常问题 * * @author xuehw * @date 2020-03-05 */public class ExceptionInChildThread implements Runnable { public static vo...

2020-03-05 11:23:46 404

原创 关于线程的属性

一、线程的属性二、线程的ID运行上面的main方法,我们发现了问题,为什么一个ID是1,另一个应该是2,确变成了12。源码中我们可以看到,线程ID,是自增的,初始值为0,且为前缀递增,所以第一个线程的ID不是0,而是1。degug发现有很多个线程,这就证明除了我们写的主子线程之外,JVM还帮我们创建了一些线程。二、 线程的名字1.源码中线程默认的名字2.修改线程名字如果...

2020-03-04 15:19:37 1001

转载 Thread和Object类中的重要方法

原文地址:多线程核心(1):Thread和Object类中的重要方法1 方法概览 类 方法名 简介 Thread sleep相关   join 等待其他线程执行完毕 yield相关 放弃已经获取到的CPU资源 currentThread ...

2020-03-03 22:37:07 149

原创 线程的六种状态

一、线程状态初始(NEW):新创建了一个线程对象,但还没有调用start()方法。运行(RUNNABLE):Java线程中将就绪(ready)和运行中(running)两种状态笼统的称为“运行”。线程对象创建后,其他线程(比如main线程)调用了该对象的start()方法。该状态的线程位于可运行线程池中,等待被线程调度选中,获取CPU的使用权,此时处于就绪状态(ready)。就绪...

2020-03-03 20:45:47 175 1

原创 如何正确停止线程

一、原理介绍使用interrupt来通知,并不是强制中断,换句话说也就是不能强制停止线程,没有停止线程的权力。二、几种情况1.在普通情况下如何停止线程第一:使用interrupt()方法作为中断语句。第二:在线程自身实现代码中进行判断,Thread.currentThread().isInterrupted()。两者结合起来,结束线程。2.在线程被阻塞时如何停止线程当线程被阻塞...

2020-03-03 16:09:52 222

原创 启动线程的正确方式

关于start()1.调用start方法的顺序并不能决定线程执行的顺序当调用start方法时,其实就是向JVM请求执行此新线程,何时能够运行并不是由start方法调用顺序决定的,而是由线程调度器决定的。2.start方法会让两个线程同时运行第一个主线程 =======》创建线程执行start()方法。第二个子线程 =======》就绪状态 ——》执行状态——》运行状态。3.不能两...

2020-03-03 15:02:10 293

原创 如何实现多线程

oracle官网文档两种实现方式一、实现Runnable接口和继承Thread类。二、为什么实现Runnable接口更好。1.从代码架构角度,实现解耦,将业务逻辑实现和创建线程进行解耦。2.新建线程的损耗(直接传入Runnable实现类,性能更好)。3.JAVA不支持双继承,影响代码可扩展性。三、两种方法的本质对比方法一(实现Runnable):最终调用target.run();...

2020-03-03 14:34:06 328

转载 CAP原则概述

简介:讲解分布式核心知识CAP理论CAP定理:指的是在一个分布式系统中,Consistency(一致性)、 Availability(可用性)、Partition tolerance(分区容错性),三者不可同时获得。一致性(C):在分布式系统中的所有数据备份,在同一时刻是否同样的值。(所有节点在同一时间的数据完全一致,越多节点,数据同步越耗时)可用性(A):负载过大后,集群整体是否还能...

2020-02-03 14:52:47 1565

原创 springcloud和dubbo区别

1、dubbo: zookeeper + dubbo + springmvc/springboot 官方地址:http://dubbo.apache.org/#!/?lang=zh-cn 配套 通信方式:rpc 注册中心:zookeper/redis 配置中心:diamond 2、springcloud: 全家桶+轻松嵌入第三方组件(Netflix 奈飞) ...

2020-02-01 23:16:26 125

原创 微服务相关基础知识

微服务相关基础知识一、微服务和传统单体应用有什么区别1.单体应用:开发速度慢启动时间长依赖庞大等等2.微服务:易开发,易理解,易维护独立的部署和启动等等缺点:分布式系统,存在着分布式事务的问题多个服务管理起来比较麻烦二、微服务基础的一些基础概念1.网关:网关是任何微服务架构的重要组成部分。有了它我们可以在一个独立的模块上方便的处理一些非业务逻辑,可以让微服务本身专...

2020-01-31 22:42:38 241

空空如也

空空如也

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

TA关注的人

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