我本身总结的Java学习的系统知识点以及面试问题,已经开源,目前已经 35k+ Star。会一直完善下去,欢迎建议和指导,同时也欢迎Star: github.com/Snailclimb/…java
本文来自 Anonymous 的投稿 。git
一面是上海的小哥打来的,3.12 号中午确认的内推,下午就打来约时间了,也是惟一一个约时间的面试官。约的晚上八点。紧张的一比,人生第一次面试就献给了阿里。github
幸运的是一面的小哥特温柔。好像是个海归?口语中夹杂着英文。废话很少说,上干货:面试
面试官: 先自我介绍下吧!redis
我: 巴拉巴拉...。算法
关于自我介绍:从 HR 面、技术面到高管面/部门主管面,面试官通常会让你先自我介绍一下,因此好好准备本身的自我介绍真的很是重要。网上通常建议的是准备好两份自我介绍:一份对 HR 说的,主要讲能突出本身的经历,会的编程技术一语带过;另外一份对技术面试官说的,主要讲本身会的技术细节,项目经验,经历那些就一语带过。sql
面试官: 我看你简历上写你作了个秒杀系统?咱们就从这个项目开始吧,先介绍下你的项目。数据库
关于项目介绍:若是有项目的话,技术面试第一步,面试官通常都是让你本身介绍一下你的项目。你能够从下面几个方向来考虑:编程
- 对项目总体设计的一个感觉(面试官可能会让你画系统的架构图)
- 在这个项目中你负责了什么、作了什么、担任了什么角色
- 从这个项目中你学会了那些东西,使用到了那些技术,学会了那些新技术的使用
- 另外项目描述中,最好能够体现本身的综合素质,好比你是如何协调项目组成员协同开发的或者在遇到某一个棘手的问题的时候你是如何解决的又或者说你在这个项目用了什么技术实现了什么功能好比:用 redis 作缓存提升访问速度和并发量、使用消息队列削峰和降流等等。
我: 我说了我是如何考虑它的需求(秒杀地址隐藏,记录订单,减库存),一开始简单的用 synchronized 锁住方法,出现了问题,后来乐观锁改进,又有瓶颈,再上缓存,出现了缓存雪崩,因而缓存预热,错开缓存失效时间。最后,发现先记录订单再减库存会减小行级锁等待时间。后端
一面面试官很耐心地听,并给了我一些指导,问了我乐观锁是怎么实现的,我说是基于 sql 语句,在减库存操做的 where 条件里加剩余库存数>0,他说这应该不算是一种乐观锁,应该先查库存,在减库存的时候判断当前库存是否与读到的库存同样(可这样不是多一次查询操做吗?不是很理解,不过我没有反驳,只是说理解您的意思。事实证实千万别怼面试官,即便你以为他说的不对)
面试官: 我缓存雪崩什么状况下会发生?如何避免?
我: 当多个商品缓存同时失效时会雪崩,致使大量查询数据库。还有就是秒杀刚开始的时候缓存里没有数据。解决方案:缓存预热,错开缓存失效时间
面试官: 问我更新数据库的同时为何不立刻更新缓存,而是删除缓存?
我: 由于考虑到更新数据库后更新缓存可能会由于多线程下致使写入脏数据(好比线程 A 先更新数据库成功,接下来要取更新缓存,接着线程 B 更新数据库,但 B 又更新了缓存,接着 B 的时间片用完了,线程 A 更新了缓存)
逼逼了将近 30 分钟,面试官竟然用周杰伦的语气对我说:
我忽然受宠若惊,连忙说谢谢,也正是由于第一次面试获得了面试官的确定,才让我信心大增,二三面稳定发挥。
面试官又曰: 我看你还懂数据库是吧,答:略懂略懂。。。那我问个简单的吧!
我: 由于这个问题太简单了,因此我忘记它是什么了。
面试官: 你还会啥数据库知识?
我: 我一听,问的这么随意的吗。。。都让我选题了,我就说我了解索引,慢查询优化,巴拉巴拉
面试官: 等等,你说索引是吧,那你能说下索引的存储数据结构吗?
我: 我心想这简单啊,我就说 B+树,还说了为何用 B+树
面试官: 你简历上写的这个 J.U.C 包是什么啊?(他竟然不知道 JUC)
我: 就是 java 多线程的那个包啊。。。
面试官: 那你都了解里面的哪些东西呢?
我: 哈哈哈!这但是个人强项,从 ConcurrentHashMap,ConcurrentLinkedQueue 说到 CountDownLatch,CyclicBarrier,又说到线程池,分别说了底层实现和项目中的应用。
面试官: 我以为差很少了,那我再问个与技术无关的问题哈,虽然这个问题可能不该该我问,就是你是如何考虑你的项目架构的呢?
我: 先用最简单的方式实现它,再去发掘系统的问题和瓶颈,因而查资料改进架构。。。
面试官: 好,那我给你介绍下我这边的状况吧
总结: 一面多是简历面吧,问的比较简单,我在讲项目中说出了我作项目时的学习历程和思考,赢得了面试官的好感,感受他应该给个人评价很好。
然而开心了没一会,内推人问我面的怎么样啊?看我流程已经到大大 boss 那了。我一听二面不是主管吗???怎么直接跳了一面。因而瞬间慌了,赶忙(下床)学习准备二面。
隔了一天,3.14 的早上 10:56 分,杭州的大大 boss 给我打来了电话,卧槽我当时在上毛概课,万恶的毛概课每节课都点名,我还在最后一排不敢跑出去。因而接起电话来怂怂地说很差意思我在上课,晚上能够面试吗?大大 boss 看来很忙啊,跟我说晚上没时间啊,再说吧!
因而又隔了一天,3.16 中午我收到了北京的电话,当时内心小失望,个人大大 boss 呢???接起电话来,就是一番狂轰乱炸。。。
第一步仍是先自我介绍,这个就很少说了,提早准备好要说的重点就没问题!
面试官: 咱们仍是从你的项目开始吧,说说你的秒杀系统。
我: 一面时的套路。。。我考虑到秒杀地址在开始前不该暴露给用户。。。
面试官: 等下啊,为何要这样呢?暴露给用户会怎么样?
我: 用户提早知道秒杀地址就能够写脚原本抢购了,这样不公平
面试官: 那好比说啊,我如今是个黑客,我在秒杀开始时写好了脚本,运行一万个线程获取秒杀地址,这样是否是也不公平呢?
我: 我考虑到了这方面,因而我本身写了个 LRU 缓存(划重点,这么多好用的缓存我为啥不用偏要本身写?就是为了让面试官上钩问我是怎么写的,这样我就能够逼逼准备好的内容了!),用这个缓存存储请求的 ip 和用户名,一个 ip 和用户名只能同时透过 3 个请求。
面试官: 那我可不能够建立一个 ip 代理池和不少用户来抢购呢?假设我有不少手机号的帐户。
我: 这就是在为难我胖虎啊,我说这种状况跟真实用户操做太像了。。。我无法区别,不过我以为能够经过地理位置信息或者机器学习算法来作吧。。。
面试官: 好的这个问题就到这吧,你接着说
我: 我把生成订单和减库存两条 sql 语句放在一个事务里,都操做成功了则认为秒杀成功。
面试官: 等等,你这个订单表和商品库存表是在一个数据库的吧,那若是在不一样的数据库中呢?
我: 这面试官好变态啊,我只是个本科生?!?!我以为应该要用分布式锁来实现吧。。。
面试官: 有没有更轻量级的作法?
我: 不知道了。后来查资料发现能够用消息队列来实现。使用消息队列主要能带来两个好处:(1) 经过异步处理提升系统性能(削峰、减小响应所需时间);(2) 下降系统耦合性。关于消息队列的更多内容能够查看这篇文章:snailclimb.gitee.io/javaguide/#…
后来发现消息队列做用好大,因而如今在学手写一个消息队列。
面试官: 好的你接着说项目吧。
我: 我考虑到了缓存雪崩问题,因而。。。
面试官: 等等,你有没有考虑到一种状况,假如说你的缓存刚刚失效,大量流量就来查缓存,你的数据库会不会炸?
我: 我不知道数据库会不会炸,反正我快炸了。当时说没考虑这么高的并发量,后来发现也是能够用消息队列来解决,对流量削峰填谷。
面试官: 好项目聊(怼)完了,咱们来讲说别的,操做系统了解吧,你能说说 NIO 吗?
我: NIO 是。。。
面试官: 那你知道 NIO 的系统调用有哪些吗,具体是怎么实现的?
我: 当时复习 NIO 的时候就知道是咋回事,不知道咋实现。最近在补这方面的知识,可见 NIO 仍是很重要的!
面试官: 说说进程切换时操做系统都会发生什么?
我: 不如杀了我,我最讨厌操做系统了。简单说了下,可能不对,须要答案自行百度。
面试官: 说说线程池?
答: 卧槽这我熟啊,把 Java 并发编程的艺术里讲的都说出来了,说了得有十分钟,自诩一波,毕竟这本书我看了五遍😂
面试官: 好问问计网吧若是设计一个聊天系统,应该用 TCP 仍是 UDP?为何
我: 固然是 TCP!缘由以下:
面试官: 好的,你有什么要问个人吗?
我: 我还有下一次面试吗?
面试官: 应该。应该有的,一周内吧。还告诉我竟然转正前要实习三个月?wtf,一个大三满课的本科生让我如何在八月底前实习三个月?
我: 面试官再见
3.18 号,三面来了,此次又是那个大大 boss!
第一步仍是先自我介绍,这个就很少说了,提早准备好要说的重点就没问题!
面试官: 聊聊你的项目?
我: 通过二面的教训,我迅速学习了一下分布式的理论知识,并应用到了个人项目(吹牛逼)中。
面试官: 看你用到了 Spring 的事务机制,你能说下 Spring 的事务传播吗?
我: 完了这个问题好像没准备,虽然以前刷知乎看到过。。。我就只说出来一条,面试官说其实这个有不少机制的,好比事务嵌套,内事务回滚外事务回滚都会有不一样状况,你能够回去看看。
面试官: 说说你的分布式事务解决方案?
我: 我叭叭的照着资料查到的解决方案说了一通,面试官怎么好像没大听懂???
阿里巴巴以前开源了一个分布式 Fescar(一种易于使用,高性能,基于 Java 的开源分布式事务解决方案),后来,Ant Financial 加入 Fescar,使其成为一个更加中立和开放的分布式交易社区,Fescar 重命名为 Seata。Github 地址:github.com/seata/seata
面试官: 好,咱们聊聊其余项目,说说你这个 MapReduce 项目?MapReduce 原理了解过吗?
我: 我叭叭地说了一通,面试官好像以为这个项目太简单了。要不是没项目,我会把个人实验写上吗???
面试官: 你这个手写 BP 神经网络是干了啥?
我: 这是我选修机器学习课程时的一个做业,我又对它进行了扩展。
面试官: 你能说说为何调整权值时要沿着梯度降低的方向?
我: 老大,你太厉害了,怎么什么都懂。我压根没准备这个项目。。。没想到会问,作过去好几个月了,加上当时一紧张就忘了,后来想起来大概是....。
面试官: 好咱们问问基础知识吧,说说什么叫 xisuo?
我:???xisuo,您说什么,很差意思我没听清。(这面试官有点口音。。。)就是 xisuo 啊!xisuo 你不知道吗?。。。尴尬了十几秒后我终于意识到,他在说死锁!!!
面试官: 假如 A 帐户给 B 帐户转钱,会发生 xisuo 吗?能具体说说吗?
我: 当时答的很差,后来发现面试官又是想问分布式,具体答案参考这个:blog.csdn.net/taylorchan2…
面试官: 为何不考研?
我: 不喜欢学术氛围,巴拉巴拉。
面试官: 你有什么问题吗?
我: 我还有下一面吗。。。面试官说让我等,一周内答复。
等了十天,一度觉得我凉了,内推人说我流程到 HR 了,让我等着吧可能 HR 太忙了,3.28 号 HR 打来了电话,当时在教室,我直接飞了出去。
面试官: 你好啊,先自我介绍下吧
我: 巴拉巴拉....HR 面的技术面试和技术面的仍是有所区别的!
面试官人特别好,一听就是很会说话的小姐姐!说我这里给你悄悄透露下,你的评级是 A 哦!
接下来就是几个经典 HR 面挂人的问题,什么难给我来什么,我看别人的 HR 面怎么都是聊聊天。。。
面试官: 你为何选择支付宝呢,你怎么看待支付宝?
我: 我从我的情怀,公司理念,环境氛围,市场价值,趋势导向分析了一波(说白了就是疯狂夸支付宝,不过说实话我说的那些一点都没撒谎,阿里确实作到了。好比我举了个雷军和格力打赌 5 年 2000 亿销售额,大部分企业家关注的是利益,而马云更关注的是真的为人类为世界作一些事情,利益不是第一位的。)
面试官: 明白了解,那你的优势咱们都很明了了,你能说说你的缺点吗?
缺点确定不能是目标岗位须要的关键能力!!!
总之,记住一点,面试官问你这个问题的话,你能够说一些不影响你这个职位工做须要的一些缺点。好比你面试后端工程师,面试官问你的缺点是什么的话,你能够这样说:本身比较内向,平时不太爱与人交流,可是考虑到之后可能要和客户沟通,本身正在努力改。
我: 听说这是 HR 面最难的一个问题。。。我当时翻了好几天的知乎才找到一个合适的,也符合个人答案:我有时候会表现的不太自信,好比阿里的内推二月份就开始了,其实我当时已经复习了好久了,可是总是以为本身还不行,不敢投简历,因而又把书看了一遍才投的,当时也是舍友怂恿一波才投的,面了以后发现其实本身也没有不好。(划重点,必定要把本身的缺点圆回来)。
面试官: HR 好像不太满意个人答案,继续问我还有缺点吗?
我: 我说比较容易紧张吧,举了本身大一面实验室由于紧张没进去的例子,后来不断调整心态,如今已经好不少了。
接下来又是个好难的问题。
面试官: BAT 都给你 offer 了,你怎么选?
其实我当时好想说,BT 是什么?很差意思我只知道阿里。
我 : 哈哈哈哈开玩笑,就说了阿里的文化,支付宝给咱们带来不少便利,想加入支付宝为人类作贡献!
最后 HR 问了我实习时间,如今大几之类的问题,说确定会给我发 offer 的,让我等着就行了,但愿过两天能收到好的结果。
若是你们想要实时关注我更新的文章以及分享的干货的话,能够关注个人公众号。
《Java面试突击》: 由本文档衍生的专为面试而生的《Java面试突击》V2.0 PDF 版本公众号后台回复 "Java面试突击" 便可免费领取!
Java工程师必备学习资源: 一些Java工程师经常使用学习资源公众号后台回复关键字 “1” 便可免费无套路获取。