新华智云22届实习一、二面(已 offer)
一面
1.介绍下自己的技术栈和之前实习做的事情
2.这两个项目挑一个做介绍
3.项目:
- Netty 自定义了什么插件/Handler
- API 调用数据源是同步还是异步的(同步)
- 如果有一个慢请求的话阻塞住了后面的请求怎么办
答:有数据库连接池,来一个请求对应一个连接
追问:现在就是连接数满了,没有了额外的连接(懵了)
一顿乱蒙,面试官说不行,后面思考了几分钟,说用异步的方式(死马当活马医),一个线程去请求,一个线程在这监控他是否有数据到来。面试官说可以,具体分两个线程,一个 work 线程去请求数据,一个Listener 线程监听消息队列,当 work 线程拿到数据后发消息给队列,这样的话 Listener 线程就知道数据拿到 了,最后将数据响应出去。
正确答法:设置 JDBC 连接超时时间,如果请求超时了,就新建一个线程去处理该请求,将获取到的数据放进缓存中,主流程直接返回超时重试,当同样的参数再次请求过来时,直接去缓存中获取。
4.Spring 和 SpringBoot 有什么区别(八股文)
5.Spring Bean 的生命周期(八股文)
- 自定义个类实现 BeanPostProcessor 接口,重写 postProcessBeforeInitialization、postProcessorAfterInitialization 方法,在这两个方法中可以对 bean 做一些自定义的操作,将该实现类注册进 Spring容器就行了,每个 bean 初始化前后都会调用这两个方法。
- 自定义个 Bean 类实现 BeanNameAware 接口,实现 setBeanName 方法,该方法将 Bean 的 name 通过参数传过来,在 Bean 类中定义一个变量,来接收 BeanName。BeanFactoryAware(传递创建该 Bean 的 BeanFactory)、ApplicationContextAware(传递该 Bean 所在的上下文对象) 同理。将该 Bean 注册到 Spring 容器就行了,仅仅对实现了这些接口的 Bean 有效
7.BeanFactory 用来做什么的(可以调用 get 方法获取 Bean 对象)
8.BeanFactory 相当于 Spring 的哪个概念(就是 IOC 容器)
9.除了 BeanFactory 还有其他的吗(ApplicationContext。当时不敢答这个的,怕问到这两个的区别,但是不回答的话显的我又不行,最后还是回答了)
10.MySQL 了解吗(了解)
11.脏读、不可重复读、幻读;隔离级别(八股文)
12.好像平时不会用到可串行化这个级别吧(对,平时项目中也不会特意改这个东西,都是用默认的)
13.MVCC 知道吗(打扰了,不会)
14.MySQL 索引(八股文)
15.刚听你提到了 B+ 树一个节点的大小为一个页的大小,那你知道 MySQL 的页表多大吗(没听过这东西)
16.了解过 Page Cache 吗(都没听过这东西)
17.你通过 MySQL 写入一条数据是直接写入到磁盘里还是写入到哪里(这个不知道)
18.说到缓存了,你了解过 LRU Cache 吗,用 Java 怎么实现一个(好家伙,早上刚复习了一遍)
19.Java 中有没有现成的有序的 HashMap(LinkedHashMap)
20.能不能用 LinkedHashMap 来实现 LRU(说了下 LinkedHashMap 底层的数据结构,答:可以实现)
21.Java 中除了 LinkedHashMap 还有没有别的有序 Map(TreeMap,底层用了红黑树。还好接下来没问红黑树)
22.HashMap 怎么扩容的(申请一个2倍大的数组,拷贝过去)
- 拷贝的流程是什么(重新 hash 一遍,这样可以让数据更离散)
24.线程池中 coreSize、maxSize、等待队列,这三个参数有什么关系
答:就是核心线程数满了之后该怎么处理吗?
问:是的,是继续增加线程呢,还是进入等待队列
答:会先进入队列,队列满了才会继续增加线程
问:为什么中间要加个队列呢,不用不行吗
答:如果一直让线程创建的话会导致 OOM,来一个任务就创建一个线程比较浪费资源,使用队列的话可以起到缓冲的作用。
25.去队列拿任务、新建一个线程,这两种操作哪个会加锁
答:去队列拿任务的时候需要加锁,新建线程不需要加锁。(结果面试官说你说反了。其实我是蒙反了)
26.线程(Thread)的 stop 方法是安全的吗
答:你问的是 sleep 吗
问:不是,就是 Thread 类的 stop 方法
答:没有用过。
27.那你说下调用 sleep 方法这个线程会处于什么状态
答:运行状态
问:首先它肯定是 block 状态,那他是属于线程的什么状态
答:处于运行态,CPU 一直在空转(这个错了,调用 sleep 是阻塞态,执行完回到就绪)
28.什么情况下会出现等待状态
答:IO 操作的时候,线程会进入阻塞态
29.调用 wait 方法进入什么状态
答:进入阻塞态,会进入等待池中,需要别人唤醒
30.wait 和 notify 为什么是在 Object 类中,而不是在 Thread 类中呢
答:因为 wait 和 notify 方法必须要在同步代码块中才能调用,而同步代码块锁的是对象,调用该对象的 wait 方法,线程会进入该对象的等待池中,和 Thread 无关。
31.写道题吧,三个线程轮流打印 ABC 十次(这个磨蹭了好久,面试官给了提示才写出来)
32.有没有什么要问我的
我问:我觉得我有些知识学得不够深入,对我有什么建议吗,有什么需要加强的地方
他答:你在平时接触到的一些中间件,应该要对它有更深入的了解,比如 MySQL,ES。Java 基础看你还是可以的。
我问:我觉得我有些东西学的太死了,比如遇到了一些场景,不知道怎么解决。
他答:看你一开始那个同步异步的场景题,就知道你没有碰到过这种情况,也没有考虑过并发带来的一些问题。这面通过肯定是通过了(好险,以为挂了),后面会有二面,看你什么时候方便。
我问:你们那边一共有多少面
他答:2 到 3 面,下一面还是技术面,三面可能就是老板找你聊一聊。
一共 2 轮技术面,一轮老板面,一轮hr。
二面
1.讲下在学校和之前实习的情况
2.介绍下第一个项目
- 问了一些细节问题
- 如果有人写的 SQL 查询很慢呢
类似一面的问题,我就扯到这个问题上来了:有一个慢请求阻塞住了后面的请求
设置 JDBC 连接超时时间,如果请求超时了,就新建一个线程去处理该请求,将获取到的数据放进缓存中,
主流程直接返回超时重试,当同样的参数再次请求过来时,直接去缓存中获取。
3.实习的时间什么时候可以开始呢(放暑假后第一时间可以入职)
4.两道算法题(感谢面试官提示)
- 大数相加(手写代码)
- 两个链表求交点(只需要说思路)
5.HashMap 实现原理(八股文)
- 去链表里面比较元素的时候用什么方法比较(equals 方法)
6.一个变量在多线程的环境访问,有几种方式保证它的安全(volatile、synchronized、Lock)
7.volatile 的原理(八股文)
8.Lock 和 synchronized 怎么选择(说了他们之间的区别和应用场景)
9.OOM 怎么排查(没有了解过,只知道 dump 命令)
10.你有什么要问我的吗
- 我感觉这次发挥不太好,你对我有什么建议吗
我觉得你挺好的,基础也很扎实;写程序的话不要太着急,写程序的速度也还可以。
- 下一面还是技术面吗
没有技术面了
- 入职之后负责什么
介绍了下公司的业务
- 最快什么时候可以得到回复
这周
11.你有面试别的公司吗
- 阿里、字节