2021-07-04 04:08:29
整体来看,此次面试以Java技术栈知识为主,涉及集合、多线程、JVM、框架、算法、数据库、Linux等多个方面,同时有少量前端知识考查,面试时长25分钟未涉及项目细节,因前端知识不足可能不符合全栈岗位标准。具体内容如下:
面试基本信息
面试岗位:中科院空天院相关岗位(招全栈)。
面试时长:25分钟。
面试流程:技术面仅这一面,后续会有老师聊项目和其他问题。
面试问题及回答情况分析
Java集合相关
HashMap和ConcurrentHashMap的区别:基本说出但细节不到位。二者主要区别在于线程安全性,HashMap是非线程安全的,在多线程环境下操作可能出现数据不一致等问题;ConcurrentHashMap是线程安全的,通过分段锁(JDK1.7)或CAS+synchronized(JDK1.8)等方式保证线程安全,在多线程并发场景下性能较好。
ArrayList和LinkedList的区别:ArrayList基于动态数组实现,随机访问效率高,插入和删除操作在数组末尾效率较高,但在中间或开头插入和删除效率较低,因为需要移动元素;LinkedList基于链表实现,插入和删除操作效率高,不需要移动大量元素,但随机访问效率较低,需要从头或尾节点开始遍历。
多线程相关
线程的创建方式:常见的有继承Thread类、实现Runnable接口、实现Callable接口配合FutureTask、使用线程池等方式。继承Thread类需要重写run方法;实现Runnable接口和Callable接口可以将线程任务与线程对象分离,更符合面向对象思想,Callable接口的call方法可以有返回值;线程池可以复用线程,提高系统资源利用率,管理线程生命周期。
反射相关
获取一个类里的方法:可以通过Class对象的getMethods()方法获取所有公共方法,包括继承的方法;getDeclaredMethods()方法获取该类声明的所有方法,包括私有方法,但不包括继承的方法。
Spring相关
涉及到的设计模式:回答出单例模式与动态代理模式。除此之外,还有工厂模式(如BeanFactory创建Bean对象)、模板方法模式(如JdbcTemplate)、观察者模式(如Spring事件驱动模型)等。
Bean的初始化加载流程:大致流程为实例化Bean对象、填充属性、调用BeanNameAware的setBeanName方法、调用BeanFactoryAware的setBeanFactory方法、调用ApplicationContextAware的setApplicationContext方法、调用BeanPostProcessor的前置处理方法、调用InitializingBean的afterPropertiesSet方法、调用自定义的init - method方法、调用BeanPostProcessor的后置处理方法,最后Bean初始化完成。
事务隔离机制:有DEFAULT(使用数据库默认隔离级别)、READ_UNCOMMITTED(读未提交)、READ_COMMITTED(读已提交)、REPEATABLE_READ(可重复读)、SERIALIZABLE(串行化)等。不同的隔离级别可以解决不同的并发问题,如脏读、不可重复读、幻读等。
过滤器与拦截器的区别:过滤器(Filter)依赖于Servlet容器,在请求到达Servlet之前和响应离开Servlet之后对请求和响应进行过滤处理,主要关注URL级别的过滤;拦截器(Interceptor)依赖于Spring框架,在方法调用前后进行拦截处理,可以获取到方法调用的相关信息,如方法名、参数等,更侧重于业务逻辑的处理。
JVM相关
内存的区域划分:包括方法区、堆、虚拟机栈、本地方法栈、程序计数器。方法区存储类信息、常量、静态变量等;堆是线程共享的,存储对象实例;虚拟机栈和本地方法栈分别用于存储Java方法调用和本地方法调用的栈帧;程序计数器记录线程执行的字节码行号。
不会发生OOM的地方:程序计数器不会发生OOM,因为它只是记录字节码的行号,占用的内存空间很小且固定。
CMS垃圾回收器和G1垃圾回收器的区别:CMS以获取最短回收停顿时间为目标,采用标记 - 清除算法,会产生内存碎片;G1将堆内存划分为多个大小相等的Region,采用复制算法和标记 - 整理算法,可以预测停顿时间,能更好地处理大内存堆。
垃圾回收调优方面:可以使用工具如Arthas查看内存异常情况,还可以关注垃圾回收的最大停止时间等参数进行调优,例如调整新生代和老年代的大小比例、选择合适的垃圾回收器等。
算法相关
冒泡排序和二分查找法的区别:冒泡排序是一种简单的排序算法,通过多次比较和交换相邻元素将数组排序,时间复杂度为O(n2);二分查找法是在有序数组中查找特定元素的算法,通过不断将查找区间缩小一半来提高查找效率,时间复杂度为O(log n)。
数据库相关
MyBatis里ResultType和ResultMap的区别:ResultType直接指定返回类型的全限定名,MyBatis会自动将查询结果映射到对应的JavaBean属性上,要求数据库列名和JavaBean属性名一致;ResultMap可以自定义映射关系,可以处理复杂的映射情况,如数据库列名和JavaBean属性名不一致、关联查询等。
分析SQL慢查询:可以使用explain查看查询计划,查看是否用到了索引,通过分析执行计划可以找出SQL语句执行效率低的原因,如全表扫描、索引失效等。
ES的搜索原理:Elasticsearch基于倒排索引实现搜索,当文档被索引时,会将文档中的词项提取出来并建立倒排索引,记录每个词项出现在哪些文档中以及出现的位置等信息。搜索时,将查询语句拆分成词项,在倒排索引中查找包含这些词项的文档,然后根据相关度算法对文档进行排序并返回结果。
其他技术相关
Docker部署:未涉及具体操作。Docker是一种容器化技术,可以将应用及其依赖打包成一个容器,方便在不同环境中部署和运行。
拉取Redis5.0镜像指令:正确的指令是docker pull redis:5.0。
Linux杀死进程指令:常见的有kill指令,可以通过进程ID杀死指定进程;killall指令可以通过进程名杀死所有匹配的进程;pkill指令也可以通过进程名杀死进程。
Vue里的ref和reactive的区别:ref用于定义基本数据类型的响应式变量,返回一个包含value属性的对象;reactive用于定义对象类型的响应式变量,直接返回一个响应式对象。
面试结果及反思
结果推测:因前端只会三大件,有一个用Vue的项目未深入学习,可能不符合全栈岗位标准。
反思建议:对于全栈岗位,需要加强前端知识的学习,深入掌握Vue等前端框架的使用;对于Java技术栈,进一步细化知识点,加深对细节的理解和掌握;补充Linux相关知识,熟悉常用指令;多进行项目实践,积累项目经验,提高解决实际问题的能力。