自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 数据结构相关

二叉查找树的特点就是左子树的节点值比父亲节点小,而右子树的节点值比父亲节点大平衡二叉树是基于二分法的策略提高数据的查找速度的二叉树的数据结构特点:(1)非叶子节点最多拥有两个子节点;(2)非叶子节值大于左边子节点、小于右边子节点;(3)树的左右两边的层级数相差不会大于1;(4)没有值相等重复的节点;B树(B-tree)B树和平衡二叉树稍有不同的是B树属于多叉树又名平衡多路查找树(查找路径不只两个),数据库索引技术里大量使用者B树和B+树的数据结构规则:(1)排序方式:所有节点关键字是按递

2021-10-24 18:38:16 216

原创 mysql索引相关

索引的基本原理索引用来快速地寻找那些具有特定值的记录。如果没有索引,一般来说执行查询时遍历整表。索引的原理:就是把无序的数据变成有序的查询把创建了索引的列的内容进行排序对排序结果生成倒排表在倒排表内容上拼上数据地址链在查询的时候,先拿到倒排表内容,再取出数据地址链,从而拿到具体数据mysql聚簇和非聚簇索引的区别都是B+树的数据结构聚簇索引:将数据存储与索引放到了一块、并且是按照一定的顺序组织的,找到索引也就找到了数据,数据的物理存放顺序与索引顺序是一致的,即:只要索引是相邻的,那么对

2021-10-24 18:37:31 120

原创 简述 Mybatis 的插件运行原理,如何编写一个插件。

简述 Mybatis 的插件运行原理,如何编写一个插件。答: Mybatis 只支持针对 ParameterHandler、ResultSetHandler、StatementHandler、Executor 这4种接口的插件,Mybatis使用JDK的动态代理,为需要拦截的接口生成代理对象以实现接口方法拦截功能, 每当执行这 4 种接口对象的方法时,就会进入拦截方法,具体就是 InvocationHandler 的invoke() 方法, 拦截那些你指定需要拦截的方法。编写插件: 实现 Mybati

2021-10-12 18:48:47 345

原创 MyBatis 与Hibernate 有哪些不同?

MyBatis 与Hibernate 有哪些不同?SQL 和 ORM 的争论,永远都不会终止开发速度的对比:Hibernate的真正掌握要比Mybatis难些。Mybatis框架相对简单很容易上手,但也相对简陋些。比起两者的开发速度,不仅仅要考虑到两者的特性及性能,更要根据项目需求去考虑究竟哪一个更适合项目开发,比如:一个项目中用到的复杂查询基本没有,就是简单的增删改查,这样选择hibernate效率就很快了,因为基本的sql语句已经被封装好了,根本不需要你去写sql语句,这就节省了大量的时间,但是对

2021-10-12 18:48:12 103

原创 #{}和${}的区别是什么?

#{}和${}的区别是什么?#{}是预编译处理、是占位符, KaTeX parse error: Expected 'EOF', got '#' at position 27: …接符。Mybatis 在处理#̲{}时,会将 sql 中的#{…{}时, 就是把${}替换成变量的值,调用 Statement 来赋值;#{} 的变量替换是在DBMS 中、变量替换后,#{} 对应的变量自动加上单引号的变量替换是在DBMS外、变量替换后,{} 的变量替换是在 DBMS 外、变量替换后,的变量替换是在DBMS

2021-10-12 18:47:41 126

原创 mybatis的优缺点

mybatis的优缺点优点:1、基于SQL语句编程,相当灵活,不会对应用程序或者数据库的现有设计造成任何影响,SQL 写在XML 里,解除 sql 与程序代码的耦合,便于统一管理;提供XML标签,支持编写动态 SQL 语句, 并可重用。2、与JDBC相比,减少了50%以上的代码量,消除了JDBC大量冗余的代码,不需要手动开关连接;3、很好的与各种数据库兼容( 因为 MyBatis 使用 JDBC 来连接数据库,所以只要JDBC 支持的数据库MyBatis 都支持)。4、能够与 Spring 很好的

2021-10-12 18:47:15 542

原创 Spring Boot

Spring Boot 自动配置原理?@Import + @Configuration + Spring spi自动配置类由各个starter提供,使用@Configuration + @Bean定义配置类,放到METAINF/spring.factories下使用Spring spi扫描META-INF/spring.factories下的配置类使用@Import导入自动配置类如何理解 Spring Boot 中的 Starter使用spring+springmvc使用,如果需要引入mybat

2021-10-12 18:32:26 109

原创 Spring MVC的主要组件?

Spring MVC的主要组件?Handler:也就是处理器。它直接应对着MVC中的C也就是Controller层,它的具体表现形式有很多,可以是类,也可以是方法。在Controller层中@RequestMapping标注的所有方法都可以看成是一个Handler,只要可以实际处理请求就可以是Handler1、HandlerMappinginitHandlerMappings(context),处理器映射器,根据用户请求的资源uri来查找Handler的。在SpringMVC中会有很多请求,每个请

2021-10-12 18:31:29 126

原创 SpringMVC 工作流程

SpringMVC 工作流程1)用户发送请求至前端控制器 DispatcherServlet。2)DispatcherServlet 收到请求调用 HandlerMapping 处理器映射器。3)处理器映射器找到具体的处理器(可以根据xml配置、注解进行查找),生成处理器及处理器拦截器(如果有则生成)一并返回给 DispatcherServlet。4)DispatcherServlet 调用 HandlerAdapter 处理器适配器。5)HandlerAdapter 经过适配调用具体的处理器(

2021-10-12 18:30:17 109

原创 Spring Boot、Spring MVC 和 Spring 有什么区别

Spring Boot、Spring MVC 和 Spring 有什么区别spring是一个IOC容器,用来管理Bean,使用依赖注入实现控制反转,可以很方便的整合各种框架,提供AOP机制弥补OOP的代码重复问题、更方便将不同类不同方法中的共同处理抽取成切面、自动注入给方法执行,比如日志、异常等springmvc是spring对web框架的一个解决方案,提供了一个总的前端控制器Servlet,用来接收请求,然后定义了一套路由策略(url到handle的映射)及适配执行handle,将handle结果使用

2021-10-12 18:29:44 162

原创 spring 事务相关

事务特征(ACID)⑴ 原子性(Atomicity):强调事务的不可分割  原子性是指事务包含的所有操作要么全部成功,要么全部失败回滚,这和前面两篇博客介绍事务的功能是一样的概念,因此事务的操作如果成功就必须要完全应用到数据库,如果操作失败则不能对数据库有任何影响。⑵ 一致性(Consistency):事务的执行的前后数据的完整性保持一致  一致性是指事务必须使数据库从一个一致性状态变换到另一个一致性状态,也就是说一个事务执行之前和执行之后都必须处于一致性状态。  拿转账来说,假设用户A和用户B两

2021-10-12 18:29:16 103

原创 Spring 框架中都用到了哪些设计模式?

Spring 框架中都用到了哪些设计模式?简单工厂:由一个工厂类根据传入的参数,动态决定应该创建哪一个产品类。Spring中的BeanFactory就是简单工厂模式的体现,根据传入一个唯一的标识来获得Bean对象,但是否是在传入参数后创建还是传入参数前创建这个要根据具体情况来定。工厂方法:实现了FactoryBean接口的bean是一类叫做factory的bean。其特点是,spring会在使用getBean()调用获得该bean时,会自动调用该bean的getObject()方法,所以返回的不是f

2021-10-09 16:41:12 128

原创 Spring支持的几种bean的作用域

Spring支持的几种bean的作用域singleton:默认,每个容器中只有一个bean的实例,单例的模式由BeanFactory自身来维护。该对象的生命周期是与Spring IOC容器一致的(但在第一次被注入时才会创建)。prototype:为每一个bean请求提供一个实例。在每次注入时都会创建一个新的对象request:bean被定义为在每个HTTP请求中创建一个单例对象,也就是说在单个请求中都会复用这一个单例对象。session:与request范围类似,确保每个session中有一个bea

2021-10-09 16:26:44 118

原创 Spring Bean的生命周期

Spring Bean的生命周期1、spring会扫描指定包(@ComponentScan(“包路径”))下面的标有注解的类,解析类得到BeanDefinition对象。Spring是根据beanDefinition来创建Spring bean的。2、实例化bean得到一个对象(如果有多个构造方法,则要判断是有哪个构造方法)3、对对象中的加了@Autowired注解的属性进行属性填充4、回调Aware方法,比如BeanNameAware,BeanFactoryAware5、调用BeanPostPr

2021-10-09 16:25:44 116

原创 BeanFactory和ApplicationContext有什么区别?

BeanFactory和ApplicationContext有什么区别?ApplicationContext是BeanFactory的子接口ApplicationContext提供了更完整的功能:①继承MessageSource,因此支持国际化。②统一的资源文件访问方式。③提供在监听器中注册bean的事件。④同时加载多个配置文件。⑤载入多个(有继承关系)上下文,使得每一个上下文都专注于一个特定的层次,比如应用的web层。BeanFactroy采用的是延迟加载形式来注入Bean的,即只有在使用

2021-10-09 16:25:01 90

原创 spring概述

spring是什么?轻量级的开源的J2EE框架。它是一个容器框架,用来装javabean(java对象),中间层框架(万能胶)可以起一个连接作用,比如说把Struts和hibernate粘合在一起运用,可以让我们的企业开发更快、更简洁Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架–从大小与开销两方面而言Spring都是轻量级的。–通过控制反转(IoC)的技术达到松耦合的目的–提供了面向切面编程的丰富支持,允许通过分离应用的业务逻辑与系统级服务进行内聚性的开发–包含并管

2021-10-09 16:24:07 150

原创 线程池相关

为什么用线程池?解释下线程池参数?1、降低资源消耗;提高线程利用率,降低创建和销毁的消耗。2.提高响应速度;任务来了,直接有线程可用可执行,而不是先创建线程,在执行。3.提高线程的可管理性;线程是稀缺资源,使用线程池可以统一分配调优监控。线程池的构造函数有7个参数,分别是corePoolSize、maximumPoolSize、keepAliveTime、unit、workQueue、threadFactory、handler。下面会对这7个参数一一解释。一、corePoolSize 线程池核心线

2021-10-04 13:57:16 116

原创 并发、并行、串行的区别

并发、并行、串行的区别串行在时间上不可能发生重叠,前一个任务没搞定,下一个任务就只能等着并行在时间上是重叠的,两个任务在同一时刻互不干扰的同时执行并发允许两个任务彼此干扰。同一时间点、只有一个任务执行,交替执行。...

2021-10-03 14:07:27 124

原创 并发的三大特性

并发的三大特性原子性原子性:即一个操作或者多个操作中cpu不可以在中途暂停然后再调度,即不能被中断操作,要么全部执行完成,要么就都不执行。比如从账户A向账户B转1000元,那么必然包括2个操作:从账户A减去1000元,往账户B加上1000元。2个操作必须全部完成。private long i = 0;public void calc(){i++;}1:将i从主存读到工作内存中的副本中2:+1的运算3:将结果写入工作内存4:将工作内存的值刷回主存(什么时候刷入由操作系统决定,不确定的)Jav

2021-10-03 14:06:46 480

原创 ThreadLocal

ThreadLocal就是提供给每个线程操作变量的工具类,做到了线程之间的变量隔离目的。ThreadLocal类用来设置线程私有变量,本身不储存值,主要提供自身引用和操作ThreadLocalMap属性值的方法,使用ThreadLocal会通过ThreadLocal的引用定位到到堆中Thread的类ThreadLocalMap里散列表里的值 从而达到线程私有。ThreadLocal的原理和使用每个Thread对象都有一个ThreadLocalMap类型的成员变量threadLocals,它存储本线程中

2021-10-03 12:37:04 202

原创 守护线程的理解

守护线程:为所有非守护线程提供服务的线程;任何一个守护线程都是整个JVM中所有非守护线程的保姆;守护线程类似于整个进程的一个默默无闻的小喽啰;它的生死无关重要,它却依赖整个进程而运行;哪天其他线程结束了,没有要执行了,程序就结束了,理都没理守护线程,就把它中断了;注意:由于守护线程的终止是自身无法控制的,因此千万不要把IO、File等重要操作逻辑分配给它;因为它不靠谱。守护线程的作用是什么?举例,GC垃圾回收线程:就是一个经典的守护线程,当我们的线程中不再有任何运行的Thread,程序就不会再产生垃

2021-10-03 12:36:22 234

原创 Thread和Runnable的区别

Thread和Runnable的区别Thread实现了Runnable接口并进行了扩展,而Thread和Runnable的实质是实现的关系,没有可比性。无论使用Runnable还是Thread,都会new Thread,然后执行run方法。用法上,如果有复杂的线程操作需求,那就选择继承Thread,如果只是简单的执行一个任务,那就实现Runnable。为什么实现runnable接口的方式实现线程?首先,我们从代码的架构考虑,实际上,Runnable 里只有一个 run() 方法,它定义了需要执行的内容

2021-09-30 21:38:46 149

原创 线程安全的理解

线程安全的理解不是线程安全、应该是内存安全,堆是共享内存,可以被所有线程访问当多个线程访问一个对象时,如果不用进行额外的同步控制或其他协调操作,调用这个对象的行为都可以获得正确的结果,我们就说这个对象是线程安全的。(当多个线程访问某个方法时,不管你通过怎样的调用方式或者说这些线程如何交替的执行,我们在主程序中不需要去做任何的同步,这个类的结果行为都是我们设想的正确行为,那么我们就可以说这个类时线程安全的。如果一段代码可以保证多个线程访问的时候正确操作共享数据,那么它是线程安全的)堆是进程和线程共有的

2021-09-30 20:13:08 134

原创 线程的生命周期

线程的生命周期Java线程具有五种状态:新建、就绪、运行、阻塞、死亡新建状态(New):当线程对象对创建后,即进入了新建状态,如:Thread t = new MyThread();就绪状态(Runnable):线程对象对创建后,其他线程调用了该对象的start()方法(t.start();),线程即进入就绪状态。该状态的线程位于可运行线程池中,等待获取CPU的使用权。处于就绪状态的线程,只是说明此线程已经做好了准备,随时等待CPU调度执行,并不是说执行了t.start()此线程立即就会执行;运行状

2021-09-30 15:13:19 107

原创 GC如何判断对象可以被回收

GC如何判断对象可以被回收引用计数法:每个对象有一个引用计数属性,新增一个引用时计数加1,引用释放时计数减1,计数为0时可以回收。可达性分析法:从GC Roots开始向下搜索,搜索所走过的路径称为引用链,当一个对象到GC Roots没有任何引用链相连时,则证明对象是不可用的,那么虚拟机就判断是可回收对象。引用计数法,可能会出现A引用了B,B引用了A,这时候就算他们都不再使用了,但因为相互引用,计数器=1,永远无法被回收。GC Roots的对象有:虚拟机栈(栈帧中的本地变量表)中引用的对象本地方法

2021-09-28 19:30:53 170

原创 Java异常

java中的所有异常都来自顶级父类ThrowableThrowable:有两个重要的子类:Exception(异常)和Error(错误),两者都包含了大量的异常处理类。1、Error(错误):是程序中无法处理的错误,表示运行应用程序中出现了严重的错误。此类错误一般表示代码运行时JVM出现问题。通常有Virtual MachineError(虚拟机运行错误)、NoClassDefFoundError(类定义错误)等。比如说当jvm耗完可用内存时,将出现OutOfMemoryError。此类错误发生时,JV

2021-09-28 19:29:57 146

原创 java类加载器

java类加载器jdk自带有三个类加载器:BootstrapClassLoader(启动类加载器)、ExtClassLoader(扩展类加载器)、AppClassLoader(系统类加载器)。1、BootstrapClassLoader是ExtClassLoader的父类加载器,默认负责加载%JAVA_HOME%/lib下的jar包和class文件。2、ExtClassLoader是AppClassLoader的的父类加载器,负责加载%JAVA_HOME%/lib/ext文件夹下的jar包和class

2021-09-28 19:28:38 327

原创 什么是字节码

什么是字节码 采用字节码的最大好处是什么java 中的编译器和解释器:   Java中引入了虚拟机的概念,即在机器和编译程序之间加入了一层抽象的虚拟的机器。这台虚拟的机器在任何平台上都提供给编译程序一个的共同的接口。编译程序只需要面向虚拟机,生成虚拟机能够理解的代码,然后由解释器来将虚拟机代码转换为特定系统的机器码执行。在Java中,这种供虚拟机理解的代码叫做字节码(即扩展名为 .class 的文件),它不面向任何特定的处理器,只面向虚拟机。每一种平台的解释器是不同的,但是实现的虚拟机是相同的。Ja

2021-09-25 17:57:11 220

原创 如何实现一个IOC容器

如何实现一个IOC容器1、配置文件配置包扫描路径2、递归包扫描获取.class文件3、反射、确定需要交给IOC管理的类4、对需要注入的类进行依赖注入配置文件中指定需要扫描的包路径定义一些注解,分别表示访问控制层、业务控制层、数据持久层、依赖注入注解、获取配置文件注解从配置文件中获取需要扫描打包路径,获取到当前路径下的文件信息及文件夹信息,我们将当前路径下所有以.class文件结尾的文件添加到一个Set集合中进行存储遍历这个set集合,获取在类上有指定注解的类,并将其交给IOC容器,定义一个安

2021-09-25 17:50:12 141

原创 ConcurrentHashMap

ConcurrentHashMapjdk7数据结构:数组(Segment) + 数组(HashEntry) + 链表(HashEntry节点)ReentrantLock+Segment+HashEntry一个Segment中包含一个HashEntry数组,每个HashEntry又是一个链表结构的头节点元素查询:二次hash,第一次Hash定位到Segment,第二次Hash定位到元素所在的链表的头部(HashEntry数组的下标(HashEntry节点链表头结点))锁:Segment分段锁,Se

2021-09-25 17:11:53 172

原创 HashMap和HashTable

HashMap和HashTable区别:HashMap、方法没有synchronized修饰,线程非安全,HashTable线程安全;HashMap允许key和value为null,而HashTable不允许底层实现:数组+链表实现jdk8开始链表高度到8、数组长度超过64,链表转变红黑树,元素以内部类Node节点存在计算key的hash值,二次hash然后对数组长度取模,对应到数组下标,如果没有产生hash冲突(下标位置没有元素)。则直接创建node存入数组,如果产生hash冲突,先进行eq

2021-09-06 17:00:55 120

原创 ArrayList和LinkedList

ArrayList和LinkedListArrayList:基于动态数组,连续内存存储,适合下标访问(随机访问),扩容机制:因为数组长度固定,超出长度存数据时需要新增数组,然后将老数组的数据拷贝到新数组,如果不是尾部插入数据还会涉及到元素的移动(往后复制一份,插入新元素),使用尾插法并指定初始容量可以极大提升性能,甚至超过linkedList(需要创建大量的node对象)。LinkedList:基于链表,可以存储在分散的内存中,适合做数据插入及删除操作,不适合查询,需要逐一遍历,遍历LinkedList

2021-09-06 16:42:14 103

原创 重载和重写

重载和重写重载(overload)发生在同一个类中,方法名必须相同,参数列表(参数类型、个数、顺序)不同。返回值、访问修饰符、异常可以相同也可以不同,不作为判断重载的条件。编译时的多态重写(override)发生在父子类中,方法名、参数列表必须相同,返回值范围小于等于父类,访问修饰符大于等于父类,抛出的异常范围小于等于父类。运行时多态重载和重写都是实现多态的方式,区别是重载是编译时的多态,重写是运行时多态...

2021-07-16 18:42:57 167

原创 String、StringBuffer、StringBuilder

String、StringBuffer、StringBuilderString是final修饰打,不可变,每次修改都会产生新打String对象StringBuffer和StringBuilder都是在原对象上操作StringBuffer是线程安全的,StringBuilder是线程不安全的StringBuffer方法都是synchronized修饰的性能:String < StringBuffer < StringBuilder经常修改字符串时使用StringBuffer、Strin

2021-07-10 18:23:47 93

原创 final

final类不可被继承、方法不可被重写、变量值不可变为什么局部内部类和匿名内部类只能访问局部final变量?原因是编译器实现上的困难:内部类对象的生命周期很有可能会超过局部变量的生命周期。局部变量的生命周期:当该方法被调用时,该方法中的局部变量在栈中被创建,当方法调用结束时,退栈,这些局部变量全部死亡。而内部类对象生命周期与其它类对象一样:自创建一个匿名内部类对象,系统为该对象分配内存,直到没有引用变量指向分配给该对象的内存,它才有可能会死亡(被JVM垃圾回收)。所以完全可能出现的一种情况是:成员方

2021-07-10 17:54:53 121

原创 == 和 equals

== 和 equals== :是判断两个变量或实例是不是指向同一个内存空间(基本数据类型比较的是值,引用数据类型比较的是内存地址equals:看类有没有重写,没有重写比较的也是地址,没有重写equals方法的类都是调用的Object的equals的方法。注意:String 中的 equals 方法是被重写过的S,string的equals方法比较的是对象的值.常量池,String s = “hello”;这种方式创建String对象时会先从常量池查找有没有这个对象,有就把它赋给当前引用,没有就创建一

2021-07-10 17:09:58 112

原创 JDK、JRE、JVM

JDK、JRE、JVMjdk: java develpment kit,java开发工具;jdk包含了jre,还包含了一些Java工具(调试和监视应用程序的工具javac、java、jconsole等)jre:java runtime environment,Java运行时环境;jre包含了jvm,还包含了Java核心类库。如果只是要运行Java程序只需安装jre。jvm:java virtual machine,java 虚拟机;jvm负责将.class文件转换为机器码;根据jvm版本(window

2021-07-07 18:37:29 110

原创 封装、继承、多态

封装、继承、多态封装将类的某些信息隐藏在类内部,不允许外部程序直接访问,而是通过该类提供的方法来实现对隐藏信息的操作和访问。隐藏对象的属性和内部实现细节,外部调用无需修改或者关心内部实现。优点:1.提高程序安全性2.便于修改,提高可维护性3.良好的封装能够减少代码之间的耦合度继承继承是从已有的类(父类)中派生出新的类(子类),子类继承父类的属性和方法,并作出自己的改变和扩展1.Java只支持单继承,也就是只能继承一个类2.如果一个类没有声明继承关系,默认继承Object类3.子类继承

2021-06-24 15:24:30 145

原创 面向对象、面向过程

面向对象什么是面向对象?对比面向过程,是两种不同的处理问题的角度。面向过程更注重事情的每一个步骤及顺序,面向对象更注重事情有哪些参与者(对象)及各自需要做什么。面向过程优点: 性能比面向对象高,因为类调用时需要实例化,开销比较大,比较消耗资源;比如单片机、嵌入式开发、Linux/Unix等一般采用面向过程开发,性能是最重要的因素。缺点: 没有面向对象易维护、易复用、易扩展面向对象优点: 易维护、易复用、易扩展,由于面向对象有封装、继承、多态性的特性,可以设计出低耦合的系统,使系统更加灵活、更

2021-06-23 11:55:08 98

转载 eclipse+maven搭建springboot项目入门

开始创建maven项目菜单 -&gt; File -&gt; New -&gt; Other -&gt; Maven -&gt; Maven -&gt; Maven Project -&gt; New Maven Project勾上这个 Create a simple project (skip archetype selection)group Id 包名 例如 com.svc.demo...

2018-11-08 15:56:20 374

空空如也

空空如也

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

TA关注的人

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