共计 6133 个字符,预计需要花费 16 分钟才能阅读完成。
背景
前段时间家里出了点事,辞职回家待了一段时间,解决完老家的事件后就回到广州这边持续找工作,前几天我去面试了一家叫做 Bigo(YY 的子公司),面试的职位是面向 3 - 5 年的 Java 开发,最终本人倒在了第三轮的技术面上。尽管有些遗憾和气馁,但想着还是写篇博客来记录一下本人的面试过程好了,也算是对宽广程序员同胞们的分享,心愿对你们当前的学习和面试能有所帮忙。
集体状况
先说下 LZ 的集体状况。
18 年毕业,二本,目前位于广州,是一个十分一般的 Java 开发程序员,算起来有两年多的开发教训。
其实这个阶段有点难堪,高不成低不就,比高级程序员略微好点,但也达不到高级的水平。加上现如今 IT 行业靠近饱和,很多岗位都是要求至多 3 - 5 年以上开发教训,所以对于两年左右开发教训的需要其实是比拟小的,这点在 LZ 找工作的过程中深有体会。最可悲的是,往年的大环境不好,很多公司一直的在裁员,更别说招人了,残暴的局势对于求职者来说更是雪上加霜,置信很多求职的同学也有所领会。所以,不到万不得已的状况下,倡议不要裸辞!
通过这次失败之后,我找了很多 Java 面试题来刷,也找了当初就任阿里的师兄师姐们,他们发了我一份《Java 面试突击宝典》,外面蕴含了当初面试必考的知识点,师兄师姐说他们都是靠这份文档进了阿里,心愿我刷完也能进阿里,哈哈哈哈!当初我也收费分享给浏览到本篇文章的 Java 程序员敌人们, 须要的可【点击此处】支付!
Bigo 面试
- 面试岗位:Java 后盾开发
- 教训要求:3- 5 年
一面 (微信电话面)
bigo 的第一面是微信电话面试,原本是想间接电话面,但面试官说须要手写算法题,就改成微信电话面。
- 自我介绍
- 先理解一下 Java 根底吧,什么是内存透露和内存溢出?(溢出是指创立太多对象导致内存空间有余,透露是无用对象没有回收)
- JVM 怎么判断对象是无用对象?(根搜索算法,从 GC Root 登程,对象没有援用,就断定为无用对象)
- 根搜索算法中的根节点能够是哪些对象?(类对象,虚拟机栈的对象,常量援用的对象)
- 重载和重写的区别?(重载产生在同个类,办法名雷同,参数列表不同;重写是父子类之间的行为,办法名好参数列表都雷同,办法体内的程序不同)
- 重写有什么限度没有?
- Java 有哪些同步工具?(synchronized 和 Lock)
- 这两者有什么区别(之前写过比拟这两者的文章,依照下面的知识点大略讲了下,文章地址:Java 并发编程:synchronized、Lock、ReentrantLock 以及 ReadWriteLock 的那些事儿)
- ArrayList 和 LinkedList 的区别?(ArrayList 基于数组,搜寻快,增删元素慢,LinkedList 基于链表,增删快,搜寻因为要遍历元素所以效率低)
- 这两种汇合哪个比拟占内存?(看状况的,ArrayList 如果有扩容并且元素没占满数组的话,节约的内存空间也是比拟多的,但个别状况下,LinkedList 占用的内存会绝对多点,因为每个元素都蕴含了指向前后节点的指针)
- 说一下 HashMap 的底层构造(数组 + 链表,链表过长变成红黑树)
- HashMap 为什么线程不平安,1.7 版本之前 HashMap 有什么问题(扩容时多线程操作可能会导致链表成环的呈现,而后调用 get 办法会死循环)
- 理解 ConcurrentHashMap 吗?说一下它为什么能线程平安(用了分段锁)
- 哪些办法须要锁住整个汇合的?(读取 size 的时候)
- 看你简历写着你理解 RPC 啊,那你说下 RPC 的整个过程?(从客户端发动申请,到 socket 传输,而后服务端解决音讯,以及怎么序列化之类的都大略讲了一下)
- 服务端获取客户端要调用的接口信息后,怎么找到对应的实现类的?(反射 + 注解吧,这里也不是很懂)
- dubbo 的负载平衡有几种算法?(随机,轮询,起码沉闷申请数,一致性 hash)
- 你说的起码沉闷数算法是怎么回事?(服务提供者有一个计数器,记录以后同时申请个数,值越小阐明该服务器负载越小,路由器会优先选择该服务器)
- 服务端怎么晓得客户端要调用的算法的?(socket 传递音讯过去的时候会把算法策略传递给服务端)
- 你用过 redis 做分布式锁是吧,你们是本人写的工具类吗?(不是,咱们用 redission 做分布式锁)
- 线程拿到 key 后是怎么保障不死锁的呢?(给这个 key 加上一个过期工夫)
- 如果这个过期工夫到了,然而业务程序还没解决完,该怎么办?(额 …… 能够在业务逻辑上保障幂等性吧)
- 那如果多个业务都用到分布式锁的话,每个业务都要保障幂等性了,有没有更好的办法?(额 …… 思考了下临时没有脉络,面试官就说那先跳过吧。预先我理解到 redission 自身是有个看门狗的监控线程的,如果检测到 key 被持有的话就会再次重置过期工夫)
- 你那边有纸和笔吧,写一道算法,用两个栈模仿一个队列的入队和出队。(因为之前温习的时候对这道题有印象,写的时候也比拟快,大略是用了五分钟,而后就拍成图片发给了面试官,对方看完后示意没问题就完结了面试。)
第一面问的不算难,问题也都是偏根底之类的,尽管答得不算完满,但过程还是比较顺利的。几天之后,Bigo 的 hr 就邀请我去他们公司加入现场面试。
二面
到 Bigo 公司后,一位 hr 小姐姐款待我到了一个会议室,等了大略半个小时,一位中年男子走了进来,十分的客气,说不好意思让我等那么久了,并且介绍了本人是技术经理,而后就开始了咱们的交谈。
- 按照常规,让我简略做下自我介绍,这个过程他也在边看我的简历。
- 说下你最相熟的我的项目吧。(我就拿我上家公司最近做的一个电商我的项目开始介绍,从简略的我的项目形容,到我的项目的次要性能,以及我次要负责的功能模块,吧啦吧啦 …………..)
- 你对这个我的项目这么相熟,那你依据你的了解画一下你的我的项目架构图,还有说下你具体参加了哪局部。(这个题目还是比拟麻烦的,毕竟我过后到职的工夫也挺长了,对这个我的项目的架构也是有些含糊。当然,最初还是硬着头皮还是画了个大略,从前端开始拜访,而后通过 nginx 网关层,最初到具体的服务等等,并且把本人参加的服务模块也标示了进去)
- 你的我的项目用到了 Spring Cloud GateWay,既然你曾经有 nginx 做网关了,为什么还要用 gateWay 呢?(nginx 是做负载平衡,还有针对客户端的拜访做网关用的,gateWay 是接入业务层做的网关,而且还整合了熔断器 Hystrix)
- 熔断器 Hystrix 最次要的作用是什么?(避免服务调用失败导致的服务雪崩,能降级)
- 你的我的项目用到了 redis,你们的 redis 是怎么部署的?(额。。。。如同是哨兵模式部署的吧。)
- 说一下你对哨兵模式的了解?(我对哨兵模式理解的不多,就大略说了下 Sentinel 监控之类的,还有相似 ping 命令的心跳机制,以及怎么判断一个 master 是下线之类。。。。。)
- 那你们为什么要用哨兵模式呢?怎么不必集群的形式部署呢?一开始 get 不到他的点,就说哨兵自身就是多实例部署的,他解释了一下,说的是 redis-cluster 的部署计划。(额 ……redis 的环境搭建有专门的运维人员部署的,应该是优先思考高可用吧 ………. 开始有点心慌了,因为我也不晓得为什么)
- 哦,那你是感觉集群没有方法实现高可用吗?(不 …. 不是啊,只是感觉哨兵模式可能比拟保障主从复制安全性吧 …….. 我也不晓得本人在说什么)
- 集群也是能保障高可用的,你晓得它又是怎么保障主从一致性的吗?(好吧,这里真的不晓得了,只能跳过)
- 你必定有微信吧,如果让你来设计微信朋友圈的话,你会怎么设计它的属性成员呢?(嗯 …… 须要有用户表,朋友圈的表,好友表之类的吧)
- 嗯,好,你也晓得微信用户有靠近 10 亿之多,那必定要波及到分库分表,如果是你的话,怎么设计分库分表呢?(这个问题考查的点比拟大,我答的其实个别,而且这个过程面试官还一直的进行连环炮提问,导致这个话题说了有将近 20 分钟,限于篇幅,这里就不再详述了)
- 这边差不多了,最初你写一道算法吧,有一组未排序的整形数组,你设计一个算法,对数组的元素两两配对,而后输入最大的绝对值差和最小的绝对值差的 ” 对数 ”。
- (听到这道题,我第一想法就是用 HashMap 来保留,key 是两个元素的绝对值差,value 是配对的数量,如果有雷同的就加 1,没有就赋值为 1,而后最初对 map 做排序,输入最大和最小的 value 值,写完后面试官说后果尽管是正确的,然而不够效率,因为遍历的工夫复杂度成了 O(n2),而后揭示了我往排序这方面想。我眉头一皱; 计上心来,能够先对数组做排序,而后首元素与第二个元素做绝对值差,记为 num,而后首元素循环和前面的元素做计算,直到绝对值差不等于 num 地位,这样效率比起 O(n2) 快多了。)
面试完后,技术官就问我有什么要问他的,我就针对这个岗位的职责和我的项目所用的技术栈做了询问,而后就让我先等下,等他去告诉三面的技术官。说实话,二面给我的感觉是最舒服的,因为面试官很亲切,面试的过程始终踊跃的疏导我,而且在职业规划方面给了我很多的倡议,让我受益匪浅,尽管面试工夫有一个半小时,但却丝毫不感觉长,整个面试过程聊得挺舒服的,不过因为工夫比拟久了,很多问题我也记不清了。
三面
二面完结后半个小时,三面的技术面试官就开始进来了,从他的额头发量散布状况就能猜测是个大牛,人狠话不多,坐下后也没让我做自我介绍,间接开问,整个过程我答的也不好,而且面试官的问题表述有些不太清晰,常常须要跟他反复确认分明。
- 对事务理解吗?说一下事务的隔离级别有哪些(我以比拟理解的 Spring 来说,把 Spring 的四种事务隔离级别都叙述了一遍)
- 你做过电商,那应该晓得下单的时候须要减库存对吧,假如当初有两个服务 A 和 B,别离操作订单和库存表,A 保留订单后,调用 B 减库存的时候失败了,这个时候 A 也要回滚,这个事务要怎么设计?(B 服务的减库存办法不抛异样,由调用方也就是 A 服务来抛异样)
- 理解过读写拆散吗?(额。。。大略理解一点,就是写的时候进主库,读的时候读从库)
- 你说读的时候读从库,当初假如有一张表 User 做了读写拆散,而后有个线程在一个事务范畴内对 User 表先做了写的解决,而后又做了读的解决,这时候数据还没同步到从库,怎么保障读的时候能读到最新的数据呢?(听完登时有点懵圈,一时间答不上来,起初面试官说想方法保障一个事务中读写都是同一个库才行)
- 你的我的项目里用到了 rabbitmq,那你说下 mq 的生产端是怎么解决的?(就是生产端接管到音讯之后,会先把音讯存到数据库中,而后再从数据库中定时跑音讯)
- 也就是说你的 mq 是先保留到数据库中,而后业务逻辑就是从 mq 中读取音讯而后再解决的是吧?(是的)
- 那你的音讯是惟一的吗?(是的,用了惟一束缚)
- 你怎么保障音讯肯定能被生产?或者说怎么保障肯定能存到数据库中?(这里开始慌了,因为 mq 接入那一块我只是看过局部逻辑,但没有亲自参加,凭着本人对 mq 的理解就答道,应该是靠 rabbitmq 的 ack 确认机制)
- 好,那你整顿一下你的生产端的整个解决逻辑流程,而后说说你的 ack 是在哪里返回的(听到这里我的心凉了一截,mq 接入这部分我的确没有参加,硬着头皮依照本人的了解画了一下流程,但其实漏洞百出)
- 依照你这样画的话,如果数据库忽然宕机,你的音讯该怎么确认曾经接管?(额 ….. 那发送音讯的时候就寄存音讯能够吧 ……… 答复的时候心里千万只草泥马路过 …….. 行了吧,没玩没了了。)
- 那如果发送端的服务是多台部署呢?你保留音讯的时候数据库就始终报唯一性的谬误?(好吧,你赢了。。。最初硬是憋出了一句,您说的是,这样设计的确不好。。。。)
- 算了,跳过吧,当初你来设计一个 map,而后有两个线程对这个 map 进行操作,主线程高速减少和删除 map 的元素,而后有个异步线程定时去删除 map 中主线程 5 秒内没有删除的数据,你会怎么设计?
- (这道题我答得并不好,做了下简略的思考就说能够把 map 的 key 加上工夫戳的标记,遍历的时候发现小于以后工夫戳 5 秒前的元素就进行删除,面试官对这样的答复显著不太称心,说这样遍历会影响效率,ps:对这道题,大佬们如果有什么浅见能够在评论区说下!)
- …… 还有其余问题,但我只记住了这么多,就这样吧。
面完最初一道题后,面试官就示意这次面试过程完结了,让我回去等音讯。听到这里,我晓得基本上算是宣告后果了。回想起来,本人这一轮面试的确体现的很个别,加上工夫拖得很长,从当天的 2 点半始终面试到 6 点多,精力上也尽显疲态。果然,几天之后,hr 微信告诉了我,说我第三轮技术面试没有通过,这一次面试以失败告终。
总结
以上就是面试的大略过程,不得不说,大厂的面试还是十分有技术水平的,这个过程中我学到了很多,这里分享下集体的一些心得:
1、根底!根底!根底!重要的事件说三遍,无论是什么阶段的程序员,根底都是最重要的。每个公司的面试肯定会波及到基础知识的发问,如果你的根底不扎实,往往第一面就可能被淘汰。
2、简历须要适当的包装。诚实说,我的简历必定是通过包装的,这也是我的工作年限不够,但却能获取 Bigo 面试机会的重要起因,所以适当的包装一下简历很有必要,不过切记一点,就是不能脱离现实,比方明明只有两年教训,却硬是写到三年。小厂还可能蒙混过关,但大厂根本很难,因为很多公司会在入职前做背景考察。
3、要对简历上的技术点很相熟。简历包装能够,但肯定要对简历上的技术点很相熟,比方只是简略写过 rabbitmq 的 demo 的话,就不要写“相熟”等字眼,因为很多的面试官会针对一个技能点问的很深刻,像连环炮一样的深耕你对这个技能点的了解水平。
4、简历上的我的项目要十分相熟。个别咱们写简历都是须要对本人的我的项目做肯定程序的包装和丑化,我的项目写得好能给简历加很多分。但肯定要对我的项目十分的相熟,不相熟的模块最好不要写上去。笔者这次就吃了大亏,我的简历上有个电商我的项目就写到了用 rabbitmq 解决下单,尽管略微理解过那局部下单的解决逻辑,但因为没有亲自参加就没有做深刻的理解,面试时在这一块内容上被 Bigo 三面的面试官逼得最初理屈词穷。
5、晋升本人的架构思维。对于初中级程序员来说,日常的工作就是根本的增删改查,把性能实现就完事了,这种思维不能说不好,只是想更上一层楼的话,业务工夫须要晋升下本人的架构思维能力,比如说如果让你接手一个我的项目的话,你会怎么思考设计这个我的项目,从整体架构,到引入一些组件,再到设计具体的业务服务,这些都是设计一个我的项目必须要思考的环节,对于晋升咱们的架构思维是一种很好的锤炼,这也是很多大厂面试高级程序员时的重要考查局部。
6、不要裸辞。这也是我最浮夸的倡议了,大环境不好,且行且珍惜吧,唉~~~~
总的来说,这次面试 Bigo 还是播种颇丰的,尽管有点遗憾,但也没什么悔恨的,毕竟本人面试之前也是筹备的很充沛了,有些题目答得不好阐明我还有很多技术盲区,不懂就是不懂,再这么吹也吹不进去。这也算是给我提了个醒,你还嫩着呢,好好修炼内功吧,毕竟菜可是原罪啊。
复习资料
更多 Java 学习笔记 + 面试真题,须要的可【点击此处】支付!