自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 数据结构学习

数据结构是计算机存储、组织数据的方式;通常情况下,选好数据结构可以带来更高的运行或者执行效率。数据结构的优良直接影响着我们程序的性能;常用的数据结构有:数组(Array)、栈(Stack)、队列(Queue)、链表(Linked List)、树(Tree)、图(Graph)、堆(heap)、散列表(Hash)等。

2023-05-10 17:19:06 730 1

原创 Spring学习

3). Application比BeanFactory多点啥。1). 到底什么是BeanFactory。2). BeanFactory能干啥。

2023-03-20 10:06:42 393 1

原创 关于mysql学习

Mysql官方对索引的定义是:索引(index)是帮助mysql高效获取数据的数据结构(有序)。在数据库之外,数据库系统还维护着满足特定查找算法的数据结构,这些数据结构以某些方式引用(指向)数据,这样就可以在数据结构上实现高级算法的查找,这种数据结构就是索引。如下图所示:左边是数据库,一共有两列七条数据,最左边是数据记录的物理地址,为了加快数据的查找,可以维护一个右边所示的二叉树,每个节点包含索引值和一个指向对应数据记录的物理地址的指针,这样就可以用二叉查找快速定位到相应的数据。

2022-12-16 14:53:32 638

原创 SQL语句中的USING用法

今天在看同事写的sql时,看到同事用了USING(),一时间不知道这是个什么意思,为了不让同事看出来不是我个菜鸡(其实就是),就一顿百度,算是明白了它的意思。

2022-11-07 16:41:19 6198 1

原创 了解synchronized从偏向锁到重量级锁

在java代码块中,synchronized的使用无非有两个:1.通过对一个对象进行加锁来实现同步//代码 }2.通过对一个方法进行synchronized声明,进而对一个方法进行加锁实现同步//代码 }无论是对一个对象进行加锁,还是对一个方法进行加锁,实际上,都是对对象进行加锁。对于方式2,虚拟机会根据synchronized修饰的实例方法还是类方法,去取对应的实例对象或者Class对象进行加锁。

2022-10-28 16:49:50 447

原创 Spring中的bean是线程的安全的吗?

(多例bean):对于多例bean来说,因为每次getBean都会创建一个新的对象,线程之间不存在bean的共享问题,所以spring中。个无状态的bean,即多线程操作中不会对bean的成员变量进行查询以外的操作(不存在多个线程同时写这个成员变量的场景),那么这个。(单例bean):对于单例bean来说,所有的线程都是共享一个单例bean,因此存在线程安全问题,但是如果这个单例bean是一。在spring框架中,并没有提供bean的线程安全策略,所以,spring中的bean并不具备线程安全特性。

2022-09-21 10:39:08 590

原创 关于设计模式

设计模式是对大家在实际开发工作中写的各种代码进行高层次的抽象总结,其中最出名的当属Gang of Four (GoF) 的分类了,他们将设计模式分为23种经典的模式,根据用途我们又可以分为三大类,分别为创建型模式,结构型模式和行为型模式。

2022-09-19 23:25:51 200

原创 Spring bean的循环依赖问题

譬如,A对象依赖B对象,B对象依赖A对象//依赖B private B b;//依赖A private A a;}如果不考虑spring,循环依赖并不是问题,对象之间相互依赖是很正常的事情但是在Spring中循环依赖就是一个问题,在Spring中,一个对象并不是new出来这么简单,而是会经过一系列的Bean生命周期,就是因为bean的生命周期所有才会出现循环依赖问题。要想明白Spring的循环依赖问题,首先要知道Spring Bean的生命周期。

2022-09-06 17:19:06 394

转载 Spring bean的生命周期

返回非空:返回值是Object类型,这意味着我们可以返回任意类型的值,由于这个时候对象还未实例化,所有这个返回值可以用来代替原来本该生成目标对象的实例,也就是说,如果返回了非空,那么以后我们需要用到这个bean的时候,拿到的就是现在返回的对象了,也就不会去走实例化对象这步了。doCreateBean方法创建实例,用反射技术创建,这个没什么好说的,只是相当于new了一个对象出来而已,但需要注意的是,这个时候只是将对象实例化了,对象内的属性还未设置;可以肯定的是,它们都是 Aware 接口的实现类。

2022-09-06 10:52:45 242

原创 有关SQL优化学习

2). 性别(sex):0代表女,1代表男;数据库没有布尔类型,mysql推荐使用tinyint。1). 主键(id):primary key优先使用数值类型int,tinyint。1). 因为引擎在处理查询和连接时会逐个比较字符串中每一个字符;3). 字符会降低查询和连接的性能,并会增加存储开销;ps: 为了节省时间,下面的样例字段都用* 代替了。2). 而对于数字型而言只需要比较一次就够了;使用union all。

2022-09-02 16:23:53 146

原创 关于spring IoC 学习

在spring中,IoC容器是实现这种模式的载体,它可以在对象生成或初始化时直接将数据注入到对象中,也可以通过将对象引用注入到对象数据域中的方式来注入对方法调用的依赖。这种依赖注入是可以递归的,对象被逐层注入。BeanFactory接口定义了IoC容器最基本的形式,并且提供了IoC容器所应该遵守的最基本的服务契约,同时,这也是我们使用IoC容器所应遵守的最底层和最基本的编程规范,这些接口定义勾画出了IoC的基本轮廓。这种从具体对象手中,交出控制的做法,在解耦代码的同时提高了代码的可测试性。......

2022-08-30 17:13:48 229

原创 力扣算法学习笔记

当字符串数组的长度为0时,返回空字符串,当字符串数组为1时,返回当前字符串数组strs[0],指定一个公共前缀变量res,并赋值 字符串数组的第一个元素,遍历循环字符串数组,依次与res进行比较,两两找出公共前缀,最终结果就是最终前缀,如果在遍历中出现res为空,或者strs[i]为空,退出循环,直接返回res。输入: [“dog”,“racecar”,“car”]输出: ""解释: 输入不存在公共前缀。编写一个函数来查找字符串数组中的最长公共前缀。如果不存在公共前缀,返回空字符串 “”。...

2022-08-29 11:22:24 389

原创 RabbitMq学习

多个消费者绑定到一个队列,同一条消息只会被一个消费者处理通过设置prefetch来控制消费者预取的消息数量交换机的作用是什么?接收publisher发送的消息将消息按照规则路由到与之绑定的队列不能缓存消息,路由失败,消息丢失FanoutExchange的会将消息路由到每个绑定的队列声明队列、交换机、绑定关系的Bean是什么?

2022-08-22 17:16:46 546

原创 总结java面试题--持续更新ing

2.StringBuffer是线程安全的,StringBuilder是线程不安全的,所以在单线程环境下StringBuffer的效率低于StringBuilder。1.String底层是用final修饰的字符数组,不能够更改,如果尝试更改,会新生成一个字符串对象,StringBuffer和。1.首先,他们的数据结构不同,ArrayList底层是基于数组实现的,LinkedList底层是基于链表实现的;2.基于数据结构的不同,ArrayList更适合随机查找,LinkedList更适合删除和添加;......

2022-08-11 23:13:57 155

原创 Springboot自动装配

大概意思就是在spring完成标准的初始化过程后,实现BeanFactoryPostProcessor接口的对象可以用于定制beanfactory,所有的beanDefinition都会被加载,但此时还没有实例化,这个接口允许对一些bean定义做出属性上的改动。接下来聊一聊Spring的两种配置方式基于XML的配置和基于javaConfig类的配置方式,这对于理解Springboot的自动装配原理非常重要。可选的常量值有以下四种不自动装配,通过名称装配,通过类型装配,通过构造器装配。......

2022-07-27 23:21:22 473

原创 Mysql优化:如何避免回表查询?什么是索引覆盖(转)

聚簇索引(clusteredindex)普通索引(secondaryindex)InnoDB的聚簇索引和普通索引有什么区别?InnoDB的聚簇索引的叶子节点存储的行记录,因此InnoDB必要且仅有一个聚簇索引;如果表定义了PK,则PK就是聚簇索引如果表没有定义PK,则第一个notnullunique列是聚簇索引否则,InnoDB会创建一个隐藏的row-id作为聚簇索引ps所以PK查询速度快,直接定位到行记录InnoDB的普通索引的叶子节点存储主键值。举个例子,假设有表。...

2022-07-27 00:10:58 699

原创 SpringAop学习

AOP是一种思想,一种编写方式。编写一段代码在合适的时机找到切入点然后执行。不直接修改原来的代码,而是在源代码执行前后执行一段额外的代码。AOP之代理AOP是通过代理方式实现的,由代理对象持有原对象,在执行原对象目标方法的前后执行增强的方法。代理对象需要是原对象接口的实现或原对象的子类。代理方式分为静态代理和动态代理,区别在于代理对象生成方式不同。静态代理编译器增强,编写代理class,使用代理类替换原有类进行调用。动态代理运行期增强,内存中动态生成代理类,使用反射动态调用原对象方法。.........

2022-07-25 17:30:29 305 1

原创 关于redis

redis是支持事务的。举一个经典的例子转账。A向B汇款,那么A账户会扣钱B账户会加钱这两个步骤一定是在一个事务中的,要么都成功,要么都失败。redis事务是基于队列实现的,创建一个事务队列,然后将事务操作都放入到对列中,最后依次执行。#开启事务multi#添加命令setage10#执行事务exec#取消事务discardAOF。httpshttpshttpshttpshttpshttpshttpshttpshttps。...

2022-07-20 22:48:42 3006

原创 springCloud学习

单体架构:将业务的所有功能集中在一个项目中开发,打成一个包部署。单体架构的优缺点如下:优点:缺点:分布式架构:根据业务功能对系统做拆分,每个业务功能模块作为独立项目开发,称为一个服务。分布式架构的优缺点:优点:缺点:分布式架构虽然降低了服务耦合,但是服务拆分时也有很多问题需要思考:微服务的架构特征:因此,可以认为微服务是一种经过良好架构设计的分布式架构方案 。但方案该怎么落地?选用什么样的技术栈?全球的互联网公司都在积极尝试自己的微服务落地方案。其中在Java领域最引人注目的就是SpringCloud

2022-06-21 23:20:11 3849 1

原创 mybatis学习

mybatis是一款优秀的持久层框架,它支持定制化的SQL,存储过程以及高级映射(多表)。mybatis避免了几乎所有的JDBC代码和手动设置参数以及获取结果集。它对JDBC的操作数据库的过程进行封装,使开发者只关注SQL本身,而不需要花费精力去处理例如注册驱动,创建connection,创建statement,手动设置参数,结果集检索等JDBC繁杂的过程代码。MyBatis 可以使用简单的 XML 或注解来配置和映射原生类型、接口和 Java 的 POJO(Plain Old Java Objects,普

2022-06-13 22:59:06 854

原创 关于JWT

数据加密的基本过程,就是对原来为明文的文件或者数据按某种算法进行处理,使其成为不可读的一段代码。通常称为密文,通过这样的处理,来达到保护数据不被非法人窃取的目的。加密算法分为对称加密和非对称加密,其中对称加密算法的加密和解密的密钥相同,非对称加密算法的密钥不同,常见的 对称加密 算法主要有 、、 等,常见的非对称算法主要有 、 等.对称加密算法又称为共享密钥加密算法,在对称加密算法中,使用的密钥是同一个,发送和接收双方用这个密钥对数据进行加密和解密,这就要求双方事先都知道这个密钥。数据加密过程:在对称加密算

2022-06-07 16:32:24 1144

原创 并发编程-基础篇五-ThreadLocal

ThreadLocal主要是做数据隔离,填充的数据只属于当前线程,变量的数据对别的线程是相对隔离的,在多线程的情况下,防止自己的数据被别的线程修改。ThreadLocal在面试中也有很多面试官喜欢问,很多人认为数据是存在ThreadLocal中的,key是当前线程。首先这样是错误的,实际上java中线程共享机制,最重要的是Thread中的ThreadLocalMap,ThreadLocal并不重要,它只是一个”钩子“,数据实际上被存在ThreadLocalMap中,下面慢慢道来:ThreadLocal.s

2022-06-01 17:31:19 654

原创 解决java.io.FileNotFoundException: class path resource [xlsx/student_info_export.xlsx] cannot be opene

今天在学习excel导入导出时,遇到了一个问题: public void test() throws IOException { ClassPathResource resource = new ClassPathResource("xlsx/student_info_export.xlsx"); InputStream inputStream = resource.getInputStream(); System.out.println(inputSt

2022-05-31 15:00:07 1472

原创 java8新特性二-stream流

链式编程链式编程简单来说就是一个方法返回引用本身:public class demo { public static void main(String[] args) { Person person = new Person().setName("李四").setAge(18); System.out.println(person); }}class Person{ private String name; private int ag

2022-05-23 17:28:24 655

原创 java8新特性一-Lambda表达式

匿名内部类public class Demo3 { public static void main(String[] args) { new Thread(new Runnable() { @Override public void run() { System.out.println("xixi"); System.out.println("haha");

2022-05-20 15:27:46 425

原创 java基础进阶七-JDK动态代理

一个需求:给原有方法添加日志打印假设你刚进入一个项目组,项目中存在一个Calculator类,代表一个计算器,它可以进行加减乘除操作:public class Calculator { // 加 public int add(int a, int b) { int result = a + b; return result; } // 减 public int subtract(int a, int b) { int result = a - b; return resul

2022-05-19 16:55:01 867

原创 java基础进阶六-泛型

泛型,可以看做一种“模板代码”。什么是“模板代码”呢?以ArrayList为例。在JDK1.5引入泛型之前,ArrayList采取的方式是:在内部塞入一个Object[] array。public class ArrayList { private Object[] array; private int size; public void add(Object e) {...} public void remove(int index) {...} publi

2022-05-18 17:20:26 1729

原创 java基础进阶五-注解

注解注解,和反射一样,是Java中最重要却最容易被人遗忘的知识点。哪怕Spring、SpringMVC、SpringBoot等框架中充满了注解,我们还是选择性地忽视它。很多人不明白它是怎么起作用的,甚至有人把它和注释混淆…工作中也只是机械性地在Controller上加@RequestMapping。是的,我们太习以为常了,以至于觉得它理所应当就是如此。注解概述格式public @interface 注解名称{ 属性列表;}分类自定义注解:就是我们自己写的注解。如@UserLogJDK内

2022-05-18 16:18:01 137

原创 java基础进阶四-反射

JVM是如何构建一个实例的假设main方法中有以下代码:Person person = new Person();很多人会以为整个创建对象的过程是下面这样的:javac Person.javajava Person细致一点是这样的:图片上有一处错误,Class对象是在堆内存中的通过new创建实例和反射创建实例,都绕不开Class对象。类加载器ClassLoader类负责加载类,它的核心方法是loadClass(),传入需要加载的类名,它会帮你加载:protected Class&

2022-05-18 14:13:53 126

原创 java基础进阶三-super、static、final

初学编程时我们会接触super,而实际开发中我们经常会用到static、final,但很多人都不知道它们是什么、怎么用。今天我们一起来探讨一下。从一道题说起public class FuTest { public static void main(String[] args) { // 猜猜打印的内容 Zi zi = new Zi(); } static class Fu { int a = 10; publi

2022-05-18 10:53:43 106

原创 java基础进阶二-多态

多态多态从语法表面来看,就是子类对象可以赋值给父类引用,并通过引用,调用不同子类的方法。多态的实际用法分为:继承多态接口多态class Son extends Father { @Overrid public void smoke() { System.out.print("儿子抽烟"); }}class Daughter extends Father { @Overrid public void smoke() {

2022-05-18 10:23:27 99

原创 java基础进阶一-对象与this

什么是对象我的理解是,对象是多个相关数据的统一载体,比如一个人,有name、age等特征,而这些数据是属于一个个体的,如果用数组去存,表现力有所欠缺,无法表达“它们属于同一个个体”的含义。但我们知道,在java中对象是在堆空间中生成的,数据会在对空间中占据一定的内存开销,而方法只有一份。为什么方法只有一份因为多个个体,属性可能不同,比如我身高180,你身高150,我18岁,你30了。当我们都可以唱跳,rap,打篮球,这些动作(method)都是通用的,没必要和属性数据一样在堆空间各存一份,所以被抽取

2022-05-18 09:47:02 158

原创 Java中的断言assert

今天在学习AQS的时候,资料上使用到了assert,当时很懵,不知道这是什么意思,就网上一顿找,记录一下学习到的有关assert的知识。什么是assert关键字assert表示断言。java在执行的时候,默认是不启动断言检测的(这个时候所有的断言语句都将被忽略!),如果要开启断言检测,需要用开关 -enableassertions或-ea来开启。用法assert关键字的用法很简单,用两种用法:assert <boolean表达式>如果表达式为true,程序继续进行。如果为fal

2022-05-17 14:09:06 696

原创 关于AQS

AQS:AbstractQueuedSynchronizer抽象的队列式同步器,是除了java自带的synchronized关键字之外的锁机制。这个类在java.util.concurrent.locks包下。AQS原理AQS的核心思想是,如果被请求的共享资源空闲,则将当前请求资源的线程设置为有效的工作线程,并将共享资源设置为锁定状态,如果被请求的共享资源被占用,那么就需要一套线程阻塞等待以及被唤醒时锁分配的机制,这个机制AQS是通过用CLH(先进先出)队列锁实现的,将暂时获取不到锁的线程加入到队列中。

2022-05-17 11:17:26 87

原创 并发编程-基础篇四-synchronized

在 Java 中,关键字 synchronized可以保证在同一个时刻,只有一个线程可以执行某个方法或者某个代码块(主要是对方法或者代码块中存在共享数据的操作),同时我们还应该注意到synchronized另外一个重要的作用,synchronized可保证一个线程的变化(主要是共享数据的变化)被其他线程所看到(保证可见性,完全可以替代Volatile功能),这点确实也是很重要的。synchronized的三种应用方式修饰实例方法,进入同步代码之前要获得当前实例的锁修饰静态方法,进入同步代码之前要获得

2022-05-16 16:27:12 149

原创 管程模型与锁

先上一张图:前面的文章中已经学习了Thread、Runnable/Callable、FutureTask和ThreadPool相关的知识;现在线程基本讲完了,该轮到“锁”了。什么是锁?学习多线程是为了提供任务执行效率,但多线程会导致线程安全的问题。所谓的线程安全问题,可以理解为多个线程操作同意资源,数据不一致的问题。为什么加锁就能解决线程安全的问题呢?加锁的核心就是互斥,就是让线程之间相互排斥。又怎么实现线程的互斥呢?引入中间人即可。意,这是个非常简单且伟大的思想。在编程世界中,通过引入“

2022-05-16 09:59:09 556

原创 并发编程-基础篇三-volatile

一.简介volatile是java提供的一种轻量级的同步机制。java中包含两种同步机制:同步块(方法)和volatile变量,相当于synchronized,volatile更轻量级,因为它不会引起线程上下文的切换和调度。二.并发编程的3个基础概念1.原子性定义:一个操作或者多个操作,那么全部都执行且在执行的过程中不会被任何因素打扰,要么都失败。java中原子性操作包括:基本类型的读取和赋值,且赋值必须是值赋给变量,变量之间的相互赋值不是原子性操作。所有引用reference的赋值操作j

2022-05-13 10:28:55 158

原创 并发编程-基础篇二-CAS实现原理

CAS 是什么CAS 是英文单词 Compare And Swap 的缩写,翻译过来就是比较并替换。CAS机制中使用了3个基础操作数:内存地址V,旧的预期值A,要修改的新值B。更新一个变量时,只有当预期值与内存地址V中对应的值相同时,才能修改内存地址V 中的值为B。举个栗子:1.在内存地址V 中存储了一个值为10的变量2.线程A想要把变量的值+1,对于线程A来说,旧的预期值是A=10,要修改的新值为 B= 11;3.但在线程A执行之间,线程B抢先一步,将内存地址V中的值修改为11;4.这时

2022-05-12 16:49:03 280

原创 并发编程-基础篇一-java内存模型

基础概念原子性:一个操作或多个操作,要么全部执行并且执行的过程中不会被打断,要么都不执行。可见性:多个线程同时访问一个变量时,一个线程改变了这个变量的值,其他线程能立即看到修改的值。有序性:程序的执行顺序按照代码的先后顺序执行。Java 内存模型结构 (JMM)java堆和方法区是多个线程共享的数据区域,多个线程可以操作堆和方法区中的同一个数据,Java 内存模型的英文名称为 Java Memory Model(JMM),其并不像 JVM 内存结构一样真实存在,而是一个抽象的概念。从抽象的角度来

2022-05-12 15:38:15 115

原创 线程池基础

Executor接口:定义execute()线程池的初衷是屏蔽线程的创建,线程复用等特点,基于这个设计思想,JDK设计了Executor这个顶级接口:这个接口只有一个抽象方法。ExecutorService接口:引入线程池状态+FutureExecutor顶级接口就一个方法,过于单薄,ExecutorService继承Executor接口,引入了一些新的方法:ExecutorService比较与父类Executor的特点:1、引入了线程池的状态:要求子类必须实现诸如shutDown()、sh

2022-05-11 09:10:47 1080

空空如也

空空如也

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

TA关注的人

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