一面
1、Spring 原理、Spring IOC、AOP
说一下Bean 如何加载、如何初始化以及如何注册到IOC容器中的详细过程, 涉及BeanDefinition、BeanFactory也深入细节聊一下。
2、一个请求过来在Spring中发生了哪些事情?
这个问题不妨把一个请求过来在TCP层面上建立连接、操作系统如何处理连接、Web容器接收到连接对象后做了哪些事情、Spring 如何对接收到的请求进行处理都说一下,当然最终还是落在Spring 容器内部如何处理一个请求,这个过程一定要说清楚,需要体现细节。
3、手写一个栈,实现 push,pop方法,以及 max(获取最大的元素) 方法,要求时间复杂度为 O(1)
4、JVM内存结构
需要你能画出JVM内存结构的图,画出方法区、堆、程序计算器、虚拟机栈、本地方法栈,并说出每一个部分具体是什么作用,比如,哪些是线程共享的,哪些是线程独享的,哪些地方存放了什么数据,为什么会这样存放,哪些虚拟机参数对这些空间大小是有影响的,可以如何配置。这些都比较常规。
5、手写一个基于懒汉式的双重检测的单例。
(1)单例有三个比较关键的点,一是私有构造方法,避免外部new出对象;二是保证唯一性;三是提供一个全局访问点。
(2)另外,懒汉式双重检测的实现方式 有三点需要注意的地方,一是全局访问点必须是静态的,外界使用可以通过类直接调用,二是在进入锁之后还需要校验,三是保存单例对象的私有变量一定要用volatile修饰,这个地方可以多说一些,比如volatile防止指令重排序,保证内存可见性(JVM层面和CPU层面可以分别说)。
6、HashMap相关
(1)在jdk1.8之后,HashMap除了数组+链表之外,引用了红黑树。需要说明对于引用了红黑树的 HashMap 如何put一个元素,以及链表是在何时转化为红黑树的。比如,首先需要知道这个元素落在哪一个数组里,获取hashcode后并不是对数组长度取余来确定的,而是高低位异或求与来得到的。这个地方首先得知道异或求与是做什么样的运算的。
(2)之后说一下在HashMap中的实现,比如hashcode无符号右移16位后和原hashcode做异或运算,这相当于把hashcode的高16位拿过来和hashcode的低16位做异或运算,因为无符号右移后前面说的16位都补零,这就是前面说的 "高低位异或“,进而是“求与”,和谁求与呢,和数组长度减1 求与。说到这里起码能够证明你是看过源码的,接下来说说你的思考,比如我们知道对于hashmap 初始化容量决定了数组大小,一般我们对于数组这个初始容量的设置是有规律的,它应该是 2^n 。这个初始容量的设置影响了HashMap的效率,那又涉及到影响HashMap效率的主要因素,比如初始容量和负载因子。
7、为什么要引入红黑树?
8、如何在红黑树中插入一个节点。
9、链表是如何转换为红黑树的?
10、对ConcurrentHashMap的理解,⽐如在什么地⽅会涉及到线程安全问题以及ConcurrentHashMap是如何解决的?
11、JVM四种引入类型
这个问题比较简单,强引入、弱引入、软引入、虚引入,说一下它们各自的特点和GC对它们的不同处理方式,再说一下常用的应用场景或者jdk的实现中对它们的使用,比如,ThreadLocal 的静态内部类ThreadLocalMap,它的Key是弱引用的,也可以说一下 在你的理解中 为什么它是弱引用的,假如不是会怎么样。
12、SpringBoot 启动过程
这个主要是从它基于Spring的事件发布和监听机制开始说起
二面
1、类加载过程
加载、链接、初始化,链接又分为验证准备和解析,每一个阶段是做了什么要说清楚。Object a = new Object();这行代码做了哪些事情,需要从类加载开始说起,所以一定要清楚每一个环节做了哪些事情的,否则这个问题不可能说清楚。
2、JVM层面对指令的优化,以及在哪些时刻我们需要避免它做这样的优化
3、在new一个对象的过程中如果指令重排序了会导致什么结果?
4、maven的熟练程度
5、Linux命令⾏的熟练程度
6、消息队列的熟练程度;Kafka分区,如何分区等等
7、Netty;从NIO开始说,再说说Netty的实现⽅式,以及它除了IO之外还⼲了哪些事情。
8、手撕代码。牛客题霸上的原题,可以去看看:NC29 矩阵查找
三面
1、根据过往项目经验依次介绍业务,解决了什么问题,架构是什么样的,以及你在其中做了哪些⼯作。
2、你有什么问题想问面试官的?
我问了一下公司业务,团队构成,技术栈,以及所应聘的这个岗位大概做哪些工作。
四面
HR面试。会考察到些软技能、个人成长、职业素质,也会问一下期望薪资。
全部评论
(3) 回帖