1.Springboot的自动装配原理
首先我们来了解一下什么是自动装配,在使用SpringBoot的时候,会自动将Bean装配到IoC容器中。例如我们在使用Redis数据库的时候,会引入依赖spring-boot-starter-data-redis。在引入这个依赖后,服务初始化的时候,会将操作Redis需要的组件注入到IoC容器中进行后续使用。
自动装配原理
Spring Boot的自动装配完全基于JavaConfig,每个场景启动器都配置了一个JavaConfig,Spring Boot 启动时将这些JavaConfig配置类加入到IoC容器,从而完成自动注入。
Spring Boot通过main()方法启动SpringApplication类的静态方法run()来启动项目,run()方法是在默认配置已经完成的基础上(通过注解@SpringBootApplication实现)启动SpringApplication的。所以@SpringBootApplication注解是自动装配的入口。
2.HashMap底层数据结构,为什么会这么设计,什么时候会转化成红黑树结构?
在JDK1.7中,由数组+链表组成,数组是HashMap的主体,链表则是主要为了解决哈希冲突而存在的。 在JDK1.8中,由数组+链表+红黑树组成。当链表过长,则会严重影响HashMap的性能,红黑树搜索时间复杂度是O(logn),而链表是O(n)。因此JDK1.8对数据结构做了进一步的优化,引入了红黑树,链表和红黑树在达到一定条件会进行转换:
- 当链表超过8且数据总量超过64才会转红黑树
- 将链表转换成红黑树前会判断,如果当前数组的长度小于64,那么会选择先进行数组扩容,而不是转换为红黑树,以减少搜索时间。
3.MySQL索引是如何实现的,使用过程中要注意什么?
首先我们来了解一下MySQL包含的索引类型:
从存储结构上划分:BTree索引(B-Tree或B+Tree索引),Hash索引,full-index全文索引,R-Tree索引。
从应用层次来分:普通索引,唯一索引,复合索引
根据数据的物理顺序与键值的逻辑(索引)顺序关系:聚集索引,非聚集索引。
索引的底层实现
- Hash索引
基于哈希表实现,只有精确匹配索引所有列的查询才有效,对于每一行数据,存储引擎都会对所有的索引列计算一个哈希码,并且Hash索引将所有的哈希码存储在索引中,同时在索引表中保存指向每个数据行的指针。 - B-Tree索引
B-Tree能加快数据的访问速度,因为存储引擎不再需要进行全表扫描来获取数据,数据分布在各个节点之中。 - B+Tree索引
是B-Tree的改进版本,同时也是数据库索引所采用的存储结构。数据都在叶子节点上,并且增加了顺序访问指针,每个叶子节点都指向相邻的叶子节点的地址。相比B-Tree来说,进行范围查找时只需要查找两个节点,进行遍历即可。而B-Tree需要获取所有节点,相比之下B+Tree效率更高 索引结构默认使用B+Tree,而不是B-Tree,Hash,二叉树,红黑树。
4.简单叙述一下Spring的IOC和AOP,AOP的原理是什么
IOC就是控制反转,通俗的说就是我们不用自己创建实例对象,这些都交给Spring的bean工厂帮我们创建管理。这也是Spring的核心思想,通过面向接口编程的方式来实现对业务组件的动态依赖。这就意味着IOC是Spring针对解决程序耦合而存在的。在实际应用中,Spring通过配置文件指定需要实例化的java类,包括这些java类的一组初始化值,通过加载读取配置文件,用Spring提供的方法就可以获取到我们想要的根据指定配置进行初始化的实例对象。
AOP面向切面编程,它与OOP相辅相成,提供了与OOP不同的抽象软件结构的视角。在OOP中,我们以类作为我们的基本单元,而AOP中的基本单元是Aspect(切面)。
AOP实际上是由目标类的代理实现的。AOP代理其实是由AOP框架动态生成的一个对象,该对象可作为目标对象使用。AOP代理包含了目标对象的全部方法,但AOP代理中的方法与目标对象的方法存在差异,AOP方法在特定切入点添加了增强处理,并回调了目标对象的方法。
5.JVM的回收过程
先描述一下Java堆内存划分。 在Java中,堆被划分成两个不同的区域:新生代、老年代,新生代默认占总空间的1/3,老年代默认占2/3。 新生代有三个分区,分别为:Eden,TO Survivor,From Survivor,它们的默认占比是8:1:1 新生代的垃圾回收后只有少量对象存活,所以选用复制算法,只需要少量的复制成本就可以完成回收。 老年代的垃圾回收通常使用“标记-清理”或“标记-整理”算法 转化流程:
- 对象优先在Eden分配。当eden区没有足够空间进行分配时,虚拟机将发起一次Minor GC。
- 大对象直接进入老年代,大对象就是需要大量连续内存空间的对象,为了避免为大对象分配内存时由于分配担保机制带来的复制而降低效率。
- 老年代满了而无法容纳更多的对象,Minor GC之后通常就会进行Full GC,Full GC清理整个内存堆,包括年轻代和老年代