作为一位二本毕业,非计算机专业的学生来说,先后在0-20小公司,外包,100-499的中小公司做java开发,目前终于通过大厂面试,下面来看看整个面试过程
一面:电话面试
1、Java重写equals 为什么要重写hashcode?
答:如果重写了equals不去重写hashcode那么就有两个对象equlas相等,hashcode不一样,对于hashSet来说,因为hashcode不一样计算的数组位置下标也不一样,这样两个对象都能存到这个Set集合里面。这就违背了Set不能装重复对象的设定。这样包括hashmap在内的只要已hashCode未基础的各种集合无法正常去判断一个对象。
2、介绍一下java常用的集合类,底层数据结构,线程安全不安全
答:介绍了ArrayList LinkedList HashMap HashSet HashTable concurrenthashmap 详细介绍一番。(面试必问,已经老油条了)
3、说一下hashMap的put方法流程
答: 巴拉巴拉一大堆,重点要分1.7 和1.8讲,以及讲清楚了1.7的链表头插法导致并发扩容的时候的形成的环形链表导致的死锁问题。1.8改成尾插法来解决这个问题。1.8的红黑树引进。什么时候会变身红黑树。(面试必问,必须的)
4、new一个hashMap 传入的容量为10 最终new 出来的map的数组长度是多少?
答 是16
hashMap 的数组长度总是2的n次方,至于为什么 源码这么设定的,不太清除为什么这么设定。(看了源码也不知道)
5、volitale关键字用过吗,它能解决什么问题?
答:解决并发问题的线程之间的可见性问题,当多个线程对同一个变量进行操作的时候,该线程并不能感知到别的线程已经修改了这个变量。volitale是对JAVA对MESI缓存一致性协议给出的关键字。之后又扯了什么是MESI协议,cpu从从主内存读变量到工作内存这一大堆流程。volitale还能防止指令重排。之后面试官接着问读写屏障,这我就支支吾吾打不上来了。(这块射击的底层计算机知识太多,问深了打不上来)
6、线程池用过吗,有哪些核心参数,线程池的工作流程是什么样子的。
答 :核心线程数 最大线程数 最大空闲时间 线程池满的时候的执行策略。然后介绍了线程池的工作流程,以及这几个参数是如何配合流程工作的。(这问题,为了面试也得专门看,稳)
7、线程池内的线程出现错误抛出来异常?线程池会如何处理?
答:移除销毁该线程,重新创建一个新线程(这个不知道答的对不对,小伙伴可以自己查一下)
8、了解jvm模型吗,那些区域是线程共享的那些是线程独享?
答:线程栈,本地方法栈,程序计数器是独占的 堆和元空间共享的。
9、知道oom吗,发生oom如何排查?
答:巴拉巴拉一大堆,说的估计不准确,但是大概意思是这样子的。
10、数据库的隔离级别,什么是脏读,mysql默认的隔离级别。
答:巴拉巴拉一堆,(基本概念题是,稳的一批)
11、做过sql优化吗 mysql 索引的数据结构 什么时候索引会失效
答B+Tree 然后巴拉巴拉一大堆。
12、接着问B+Tree有什么特点,为什么要用B+树
答 巴拉巴拉一大堆(做足了准备,稳的一批)。
13 介绍几个设计模式?项目应用
答:工程模式,模板方法模式,策略模式,责任链模式。
认证鉴权管理用的责任链模式
一面大概40分钟,主要记得的就上面这些问题。
线程池用的策略模式
springmvc中用的适配器模式调用controller方法。(不一定介绍项目应用,介绍源码应用也一样的)
两天之后二面(视频面试)
1、i++和++i;
2、equals和== 区别
3、方法的重写和重载
(这三个问题问的我狂喜,我四年工作经验问我这个???然后平静的回答了这些问题)
后面全程高能,不做面试准备基本连话都说不出来!!!!
4、谈一谈synchronized知道它的膨胀升级过程吗
答:每个对象都可以成为synchronized的锁对象,在对象的对象头存有持锁线程的信息。然后介绍了一下synchronized的无锁->偏向锁->轻量级锁->重量级锁的整个过程,巴拉巴拉一大堆。
5、AQS了解吗,知道AQS框架下的那些锁,有看过源码实现吗
答:介绍了ReentrantLock 后面说源码实现随便说了说。(基本我已经忘完了源码,答得比较烂)
6、redis用过吗?它又那些数据类型?你们项目中这么用的这些数据类型?
答巴拉巴拉一大堆(这个文体还好 ,我们主要用String 和hash 然后介绍了一些简单的业务场景使用)
7、了解redis的缓存淘汰机制吗?遇到过redis内存崩溃吗?
答
LRU算法然后介绍了一下算法实现。redis内存崩溃没遇到过(实在不敢说遇到过,万一接着这个问题往下问,这么办。不敢接)。
8、看你简历里面都是用的springBoot,如何做一个start
答:详细说明了一下如何做一个start(这个之前学springboot的时候做过,比较清楚),并介绍了一下自动装配原理
9、spring的bean声明周期?
答:巴拉巴拉一大堆(终于轮到我发挥了,我自认为答的最好的一个问题,从源码层面将sping容器启动过程,如何解决循环依赖,为什么要用三级缓存,springAop
sping和mybatis整合和面试官深入探讨一番,过程20分钟,不磕不拌,接下面的问题面试官再也没提spring的事)
10、介绍一下啊mysql有那些引擎,有什么区别,mysql的锁
答:巴拉巴拉一大堆(又是一大堆概念问题,稳稳的)
11、用过分布式锁吗?这么实现分布式锁的?
答:用过,redis做分布式锁 介绍了一下redission框架和原理(这个最近项目中有用到这,所以比较了解,总的来说,你要是用的现成框架实现的,需要知道原理,如果你是自己写的,需要知道实现细节以及考虑了那些问题)
12、看你用过rabbitmq,你们是在什么场景下用的,你们是这么做可靠性投递的?
答:介绍了我们的应用场景,已经可靠性投递的实现(消息重复发送和消费者做幂等性保证)(说实话感觉过于简单,面试官没有看上我们的方案)
13 dubbo 的服务暴露和注册或称,调用过程
答;巴拉巴拉一堆(我简历上写的有dubbo,但是很久都没有用了,如果不写,那简历上一个rpc都没有,有点磕碜,还是写了,照着准备的答一下吧)
14 什么是CAP理论?zookeeper是cp架构还是ap架构?为什么?
答:巴拉巴拉一大堆。(解释一下:CPA是指 C:数据一致性 A:系统可用性 P:分区一致性 简单说:我们的服务如果是多节点集群部署,那么总会存在网络等问题造成节点之前无法通信问题,所以要保证P,在发生网络不可达造成节点信息不一致是,要么你停止对外服务,保证数据一致性 这就是CP架构,要么你继续提供服务,但是节点数据不一致,这就是AP架构,这个大家可以参考资料。之前没了解过,为了面试准备看到的。)
15 现在有10万电影票 如何实现秒杀抢电影票?
答:用分布式锁,然后巴拉巴拉将了一大堆(开放性问题,只要你说的有道理就行,但是不能不说)
16 数据库里面的表有2000w数据,如何处理?
答:(其实想问如何分库分表,委婉得表示了一下自己实际应用中并没有分库分表得经验。)
17 你用到过spingCloud没有?
答:没有。面试官应该看我的简历没有springCloud,所以问了一下,这里我简单得介绍了我们得项目情况,没有必要上springCloud然后表明了自己最近也在看springCloud并且向面试官介绍了几个组件及其实现原理。
算法题:
给一个int数组包含重复元素,如何统计不重复元素得个数,并且输出不重复元素?
排序加双指针法
可以参考力扣题目 https://leetcode-cn.com/problems/remove-duplicates-from-sorted-array/ 解法大同小易
因为做过这个上面力扣这道题,所以第一反应就是有思路序加双指针法(快慢指针)大概15分钟做完,写代码得时候会和面试官交流思路,然后因为紧张,变量名都写错了,面试官给了提示。还好最后运行出来了。
二面是所有时间最长得一面,考察的也很广,大概持续了一个多小时。面试完整个人都虚脱了。
三面:(视频面试)
聊了聊项目得实际情况,问了一下项目某些功能得具体实现,并问了一下哪个项目最让你感觉成功以及解决了那些问题让你印象深刻。
我回答了最近的项目,深度参与到了需求分析,代码开发,问题修改,环境发布,技术文档输出。然后举了一个开发遇到得数据库死锁问题(加索引引起得select操作和update操作在并发条件下出现得死锁,,以及排查和解决过程。)
由于项目是在没有高并发和大数据得地方,面试官可能也没觉得要问得地方,最后让写了一个排序算法,时间复杂度在O(nlogn)级别
(其实就是让你在快排,堆排,归并排之前选一个写),我写了一个归并排序。并简单聊了一下分治得思想。
三面结束!!!不到半个小时
后面隔了一天hr打电话说面试通过,走offer发放流程。
总结:基础贯穿整个面试过程,所以复习基础很重要,spring
mysql jvm 锁 面试大厂必问。另外我相信很多和我一样一直在小公司开发的程序员,项目根本就没有高并发,(有并发,高并发谈不上)大数据处理真实项目经验 。都是一些业务项目。这个时候简历上面不建议写有高并发大数据处理项目经验。如果你写了,他会问你哪个项目做的高并发,是什么业务,具体做了那些并发管理 并发量是多少,qps 多少,各种处理细节,集群这么搭的等等一堆只有做过才能答上来的问题。这部分不像基础知识和源码能靠自己学习就能搞定。万一被问露馅了那更是给面试官留下一个非常不好的印象。你可以说自己学习了解过这部分知识,也知道一些方案。可以和面试官讲一下这些方案。