今天就给大家总结了一份Java高级工程师面试题及答案,包含了Java高级工程师必备的核心面试题@mikechen
Spring体系结构以及优点?
- 轻量:Spring是轻量的,基本的版本大约2MB。
- 控制反转:Spring通过控制反转实现了松散耦合,对象们给出它们的依赖,而不是创建或查找依赖的对象们。
- 面向切面的编程(AOP):Spring支持面向切面的编程,并且把应用业务逻辑和系统服务分开。
- 容器:Spring包含并管理应用中对象的生命周期和配置。
- MVC框架:Spring的WEB框架是个精心设计的框架,是Web框架的一个很好的替代品。
- 事务管理:Spring提供一个持续的事务管理接口,可以扩展到上至本地事务下至全局事务(JTA)。
- 异常处理:Spring提供方便的API把具体技术相关的异常(比如由JDBC,HibernateorJDO抛出的)转化为一致的unchecked异常。
JVM内存模型组成结构?
JVM内容模型如下图所示,主要分为4部分:
1.堆:存放对象实例,几乎所有的对象实例都在这里分配内存
- 堆得内存由-Xms指定,默认是物理内存的1/64;最大的内存由-Xmx指定,默认是物理内存的1/4。
- 默认空余的堆内存小于40%时,就会增大,直到-Xmx设置的内存。具体的比例可以由-XX:MinHeapFreeRatio指定
- 空余的内存大于70%时,就会减少内存,直到-Xms设置的大小。具体由-XX:MaxHeapFreeRatio指定。
2.虚拟机栈
虚拟机栈描述的是Java方法执行的内存模型:每个方法被执行的时候都会同时创建一个栈帧(Stack Frame)用于存储局部变量表、操作栈、动态链接、方法出口等信息本地方法栈:本地方法栈则是为虚拟机使用到的Native方法服务。
3.方法区:存储已被虚拟机加载的类元数据信息(元空间)
1)有时候也成为永久代,在该区内很少发生垃圾回收,但是并不代表不发生GC,在这里进行的GC主要是对方法区里的常量池和对类型的卸载
2)方法区主要用来存储已被虚拟机加载的类的信息、常量、静态变量和即时编译器编译后的代码等数据。
该区域是被线程共享的。
3)方法区里有一个运行时常量池,用于存放静态编译产生的字面量和符号引用。该常量池具有动态性,也就是说常量并不一定是编译时确定,运行时生成的常量也会存在这个常量池中。
4.程序计数器:当前线程所执行的字节码的行号指示器
常用的JVM调优工具有哪些?
- Jconsole : jdk自带,功能简单,但是可以在系统有一定负荷的情况下使用。对垃圾回收算法有很详细的跟踪。
- JProfiler:商业软件,功能强大。
- VisualVM:JDK自带,功能强大,与JProfiler类似。
- MAT:MAT(Memory Analyzer Tool),一个基于Eclipse的内存分析工具。
为什么HashMap1.8需要引入红黑树(重点)
1.7HashMap集合中,当我们发生了Hash冲突,则会存放在同一个链表中,当链表的查询长度过长,查询效率非常低。
因为采用链表存放查询的时间复杂度是为O(n),从头查询到尾部、在JDK1.8开始优化当数组容量>=64且链表长度>8则会将链表转化为改为红黑树,红黑树的时间复杂度为O(logn),性能有所提升。
线程池有哪7个核心参数?
public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue < Runnable > workQueue, ThreadFactory threadFactory, RejectedExecutionHandler handler)
进程、线程、多线程的区别?
进程
在操作系统中运行的程序就是进程,比如你的QQ、播放器、游戏、IDE等等
线程
一个进程可以有多个线程,如视频中同时听声音,看图像,看弹幕,等等。
多线程
多线程:多个线程并发执行。
线程的生命周期
在线程的生命周期中,它要经过新建(New)、就绪(Runnable)、运行(Running)、阻塞(Blocked)和死亡(Dead)5种状态
1)新建状态(New):当线程对象对创建后,即进入了新建状态,如:Thread t = new MyThread();
2)就绪状态(Runnable):当调用线程对象的start()方法(t.start();),线程即进入就绪状态。处于就绪状态的线程,只是说明此线程已经做好了准备,随时等待CPU调度执行,并不是说执行了t.start()此线程立即就会执行;
3)运行状态(Running):当CPU开始调度处于就绪状态的线程时,此时线程才得以真正执行,即进入到运行状态。注:就 绪状态是进入到运行状态的唯一入口,也就是说,线程要想进入运行状态执行,首先必须处于就绪状态中;
4)阻塞状态(Blocked):处于运行状态中的线程由于某种原因,暂时放弃对CPU的使用权,停止执行,此时进入阻塞状态,直到其进入到就绪状态,才 有机会再次被CPU调用以进入到运行状态。
5)死亡状态(Dead):线程在run()方法执行结束后进入死亡状态。此外,如果线程执行了interrupt()或stop()方法,那么它也会以异常退出的方式进入死亡状态。
Spring七大功能模块
Spring有七大功能模块,分别是Spring Core,AOP,ORM,DAO,MVC,WEB,Context。
数据库三范式?
第一范式(1NF):属性不可分割,即每个属性都是不可分割的原子项;
第二范式(2NF):满足第一范式,且不存在部分依赖,即非主属性必须完全依赖于主属性;
第三范式(3NF):满足第二范式,且不存在传递依赖,即非主属性不能与非主属性之间有依赖关系,非主属性必须直接依赖于主属性,不能间接依赖主属性。
简单来说:
第一范式:列表字段不可分;
第二范式:有主键且非主键依赖主键;
第三范式:非主键字段不能相互依赖。
SpringBoot的核心注解有哪些?
启动类上面的注解是@SpringBootApplication,它也是 Spring Boot 的核心注解,主要组合包含了以下 3 个注解:
1)@SpringBootConfiguration
组合了 @Configuration 注解,实现配置文件的功能。
2)@EnableAutoConfiguration
打开自动配置的功能,也可以关闭某个自动配置的选项,如关闭数据源自动配置功能:@SpringBootApplication(exclude = { DataSourceAutoConfiguration.class })。
3)@ComponentScan
Spring组件扫描
SpringBoot的配置文件有哪几种格式?
.properties 和 .yml,它们的区别主要是书写格式不同。
1)properties
app.user.name = javastack
2)yml
app: user: name: javastack
Spring IOC的底层原理?
IOC是Inversion of Control的缩写,多数书籍翻译成“控制反转”。
IOC不是一种技术,只是一种思想,一个重要的面向对象编程的法则,它能指导我们如何设计出松耦合、更优良的程序。
传统应用程序都是由我们在类内部主动创建依赖对象,从而导致类与类之间高耦合,难于测试,有了IoC容器后,把创建和查找依赖对象的控制权交给了容器,如下图所示:
上图引入了IOC容器,使得A、B、C、D这4个对象没有了耦合关系,齿轮之间的传动全部依靠“第三方”了,全部对象的控制权全部上缴给“第三方”IOC容器。
所以,IOC借助于“第三方”实现具有依赖关系的对象之间的解耦,使程序更优良。
Spring AOP的底层原理?
AOP (Aspect Orient Programming),直译过来就是 面向切面编程,AOP 是一种编程思想,是面向对象编程(OOP)的一种补充。
面向切面编程,实现在不修改源代码的情况下给程序动态统一添加额外功能的一种技术,如下图所示:
AOP可以拦截指定的方法并且对方法增强,而且无需侵入到业务代码中,使业务与非业务处理逻辑分离,比如Spring的事务,通过事务的注解配置,Spring会自动在业务方法中开启、提交业务,并且在业务处理失败时,执行相应的回滚策略。
SpringMVC执行流程是什么?
(1)用户发送请求发送给前端控制器
(2)前端控制器收到请求调用处理器映射器
(3)处理器映射器找到具体得处理器,生成处理器对象以及处理器拦截器并返回给前端控制器
(4)前端控制器调用处理器适配器
(5)处理器适配器经过适配调用具体得处理器
(6)处理器执行完成并返回结果给前端控制器
(7)前端控制器接受到结果,并讲结果传给视图解析器
(8)视图解析器解析后返回具体得view
(9)前端根据view进行渲染视图,并且响应用户
什么时候要创建索引?
(1)表经常进行 SELECT 操作;
(2)表很大(记录超多),记录内容分布范围很广;
(3)列名经常在 WHERE 子句或连接条件中出现。
什么时候不要创建索引?
(1)表经常进行 INSERT/UPDATE/DELETE 操作;
(2)表很小(记录超少);
(3)列名不经常作为连接条件或出现在 WHERE 子句中。
常用的索引有哪些类型?
- 唯一索引:唯一索引不允许两行具有相同的索引值;
- 主键索引:为表定义一个主键将自动创建主键索引,主键索引是唯一索引的特殊类型。主键索引要求主键中的每个值是唯一的,并且不能为空;
- 聚集索引(Clustered):表中各行的物理顺序与键值的逻辑(索引)顺序相同,每个表只能有一个;
- 非聚集索引(Non-clustered):非聚集索引指定表的逻辑顺序。数据存储在一个位置,索引存储在另一个位置,索引中包含指向数据存储位置的指针,可以有多个,小于249个。
常用的设计模式有哪些?
开发中常用到的模式如下:
singleton单例模式,用来减少重复创建对象;
factory工厂模式,用来解耦;
iterator迭代器模式,用来遍历对象;
observer观察者模式,用来收发消息;
templete模板模式,用来避免执行相同的操作;
strategy策略模式,用来定义算法等。
什么是线程池?为什么要用线程池?
线程池里面存放了若干数量的线程,这些线程给我们程序去使用,使用的时候,就去线程池里面取一个,用完了再还回来,而不再是自我销毁。
线程池带来的好处:
- 降低资源消耗
- 提高相应速度
- 提高线程的可管理型
陈睿mikechen
10年+大厂架构经验,资深技术专家,就职于阿里巴巴、淘宝、百度等一线互联网大厂。
关注「mikechen」公众号,获取更多技术干货!
后台回复【面试】即可获取《史上最全阿里Java面试题总结》,后台回复【架构】,即可获取《阿里架构师进阶专题全部合集》