MySql为什么选用B+树
MySql为什么选用B+树参考于:为什么选择b+树作为存储引擎索引结构_技术交流_牛客网 (nowcoder.com)
这篇文章写的比较详细!!!
B树时间复杂度为O(logn)
B树支持范围查询、排序等操作
B树比其他的平衡二次树更加矮胖(准确点说应该是多路查找树)
B树的一个结点(页)为16KB,而操作系统的页为4KB,可以直接顺序读4个页,减少了随机IO次数
B+树由于将数据全部存储在叶子结点上,非叶子结点上可以存储更多的键,所以B+树比B树更矮,所以时间复杂度更低(还是应该说是查询任何数据的时间复杂度都差不多?)
B+树由于将数据全部存储在叶子结点上,并且用指针连接起来,形成了一个双向链表,扫库扫表能力更强
SrpingBoot整合PageHelper
SpringBoot+Mybatis+Thymeleaf+Pagehelper1.在pom.xml中导入依赖12345<dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper-spring-boot-starter</artifactId> <version>1.3.0</version></dependency>
2.在application.yml中添加配置123456#pagehelper分页插件配置pagehelper: helper-dialect: mysql reasonable: true support-methods-arguments: true params: count=countSql
3.编写sql语句1234<!--这里的sql语句只是举例,无任何实际含义--><select id="getAllBlog&q ...
SpringBoot自动装配原理初探
springBoot自动装配原理摘抄于https://www.cnblogs.com/shamo89/p/8184960.html,https://www.cnblogs.com/hellokuangshen/p/12450327.html
1234567891011121314@SpringBootApplication @SpringBootConfiguration// 继承了Configuration,表示当前是配置类 @ComponentScan// 自动扫描并加载符合条件的组件或者bean , 将这个bean定义加载到IOC容器中 //@EnableAutoConfiguration也是借助@Import的帮助,将所有符合自动配置条件的bean定义加载到IOC容器 @EnableAutoConfiguration// 开启springboot的注解功能,springboot的四大神器之一,其借助@import的帮助 @AutoConfigurationPackage// 自动配置包注册 @Import(AutoConfigurationPackages.Regist ...
Spring事务
Spring事务Spring事务的隔离级别就是数据库的4个隔离级别+1个Spring默认隔离级别
Spring默认隔离级别:oracle为读已提交,mysql为可重复读
读未提交
读已提交
可重复读
序列化
Spring事务的传播级别有事务A、B,事务A中调用事务B,A为父事务,B为子事务
传播级别用于修饰B
保证同一个事务中
REQUIRED 支持当前事务,如果不存在 就新建一个(默认)
SUPPORTS 支持当前事务,如果不存在,就不使用事务
MANDATORY 支持当前事务,如果不存在,抛出异常
保证没有在同一个事务中
REQUIRES_NEW 如果有事务存在,挂起当前事务,创建一个新的事务
NOT_SUPPORTED 以非事务方式运行,如果有事务存在,挂起当前事务
NEVER 以非事务方式运行,如果有事务存在,抛出异常
NESTED 如果当前事务存在,则嵌套事务执行(父事务回滚,子事务一定回滚,但是子事务回滚,不影响父事务回滚)
Spring事务什么时候会失效
自调用
类中调用本类的方法,解决办法:设置为代理类,由代理类来执行
方法不是public
@Tra ...
Spring循环依赖的解决
Spring循环依赖的解决参考于:面试必杀技,讲一讲Spring中的循环依赖 - 程序员DMZ - 博客园 (cnblogs.com)
小提示:一级缓存为单例池
有A、B两个Bean
二级缓存(未使用AOP)
只需存储一个A的原始对象(二级缓存),当B注入A时,获取当A的原始对象
通过A对象创建一个工厂(三级缓存),当B注入A时,从工厂中获取一个A对象(其实可以直接用上面一种方式)
三次缓存(使用了AOP)
通过A对象创建一个工厂(三级缓存),当B注入A时,从工厂中获取一个A对象的代理对象
总结了解详细请前往:面试必杀技,讲一讲Spring中的循环依赖 - 程序员DMZ - 博客园 (cnblogs.com)
面试官:”Spring是如何解决的循环依赖?“
答:Spring通过三级缓存解决了循环依赖,其中一级缓存为单例池(singletonObjects),二级缓存为早期曝光对象earlySingletonObjects,三级缓存为早期曝光对象工厂(singletonFactories)。当A、B两个类发生循环引用时,在A完成实例化后,就使用实例化后的对象去创建一个对象工厂 ...
Spring中Bean的生命周期
Spring中Bean的生命周期参考于:面试官:请你说一下 Bean 的生命周期 - 知乎 (zhihu.com)
实例化Bean对象
属性注入
构造器注入
setter方法注入
接口注入
检测Aware接口
BeanNameAware
如果有实现,则调用setBeanName方法
BeanFactoryAware
如果有实现,则调用setBeanFactory方法
ApplicationContextAware
如果有实现,则调用setApplicationContext方法
检测BeanPostProcessor接口
如果有实现,则调用postProcessBeforeInitialization()方法
检测InitializingBean接口
如果有实现,则调用afterPropertiesSet()方法
如果Bean有使用init-method声明初始化方法,就调用该初始化方法
检测BeanPostProcessor接口
如果有实现,则调用postProcessAfterInitialization()方法
初始化完成,可以被使用
检测Dis ...
String、StringBuffer、StringBuilder
String、StringBuffer、StringBuilderString12public final class String implements java.io.Serializable, Comparable<String>, CharSequence {}
【两种实例化方式的区别】
直接赋值(String str = “hello”;):只开辟一块堆内存空间,并且会自动入池,不会产生垃圾。
构造方法(String str= new String(“hello”);):会开辟两块堆内存空间,其中一块堆内存会变成垃圾被系统回收,而且不能够自动入池,需要通过public String intern();方法进行手工入池。
在开发的过程中不会采用构造方法进行字符串的实例化
StringBuffer123456789101112public final class StringBuffer extends AbstractStringBuilder implements java.io.Serializable, ...
url访问过程
当你从浏览器地址栏中输入URL回车后发生了什么参考于:当你从浏览器地址栏中输入URL回车后发生了什么_千里之行,始于足下-CSDN博客
在浏览器中输入域名
例如www.zhuhebin.com
查询浏览器缓存
查询本机的hosts文件(C:\Windows\System32\drivers\etc\hosts)
查询本地域名服务器
由本地域名服务器去访问根域名服务器,获取顶级域名服务器”com”的IP地址
由本地域名服务器去访问顶级域名服务器,获取权限域名服务器”zhb.com”的IP地址
由本地域名服务器去访问权限域名服务器,获取”www.zhuhebin.com"的IP地址
本地域名服务器将查询结果返回主机(此时本地域名服务器会保留一份缓存)
主机访问该域名
发起TCP的三次握手
A–>B SYN=1,seq=x
B–>A SYN=1,ACK=1,ack=x+1,seq=y
A–>B ACK=1,ack=y+1,seq=x+1
在建立TCP连接后,发起HTTP请求
服务器给浏览器进行一个301永久重定向响应。(该I ...
多线程小结
多线程小结参考于:首页-KuangStudy
https://blog.csdn.net/pange1991/article/details/53860651
什么是线程线程:通常在一个进程中可以包含若干个线程,当然一个进程中至少有一个线程,不然没有存在的意义,线程可以利用进程所有拥有的资源。在引入线程的操作系统中,通常都是把进程作为分配资源的基本单位,而把线程作为独立运行和独立调度的基本单位,由于线程比进程小,基本上不拥有系统资源,故对它的调度所付出的开销就会小得多,能更高效的提高系统多个程序间并发执行的程度。
创建线程的方式
继承Thread类(lamda表达式:new Thread(()->System.out.println(“多线程学习。。。。”)).start();)
自定义线程类继承Thread类
重写run()方法,编写线程执行体
创建线程对象,调用start()方法启动线程
实现Runnable接口(推荐使用,因为Java单继承的局限性)
自定义实现Runnable接口
实现run()方法,编写线程执行体
创建线程对象,调用start()方法启动线程
...
内部类
内部类参考于:https://www.jianshu.com/p/0d0bd9046039
https://www.kuangstudy.com/
定义内部类就是在一个类的内部在定义一个类
作用
内部类方法可以访问该类定义所在的作用域的数据,包括私有的数据
内部类可以对同一个包中的其他类隐藏起来,一般的非内部类,是不允许有 private 与protected权限的,但内部类可以
可以实现多重继承
当想要定义一个回调函数且不想编写大量代码时,使用匿名内部类比较便捷
分类内部类分为四种:
成员内部类
静态内部类
局部内部类
匿名内部类
成员内部类1234567891011121314151617181920212223public class Outer { private int id; public void out(){ System.out.println("这是外部类方法"); } class Inner{ public void in(){ System.out.println(&q ...