兄弟姐妹们,我终于上岸了,喜获蚂蚁offer,定级p7,万字长文带你走完面试全过程

前言

在今天,我收到了蚂蚁金服A级的实习录用offer。

从开始面试到拿到口头offer(四面技术+一面HR)战线大约拉了半个月,

从拿到口头offer到收到正式录用邮件大概又是半个月。

思前想后,决定还是做一个整理与总结。

一方面是回顾并记录自己的努力过程,

一方面也是希望对后来者起到一些帮助。

前方高能预警,本篇文章万字有余,通读可能要很久。

目录

如何进行知识积累

如何把握实践与理论的天平

我应该如何整理笔记

怎么复习才不会忘

面试前

怎么写出让人眼前一亮的简历

如何突击面试

面试前焦虑该怎么办

面试开始

自我介绍到底要怎么说

面试中

技术面试的时候应该注意些什么

面试尬场怎么办

如何学会埋坑

面试结束

面试官:“你有什么想问我的吗”,该说什么?

我怎样才能知道我是否通过了

我两年半的技术人生

如何进行知识积累

在讲面试技巧之前,显然知识积累是不可或缺的。不然即使面试侥幸通过,在之后的工作中也会体验极差。

如何把握实践与理论的天平

实践是什么?

比如你new Object()初始化了一个对象来使用;

比如你用HashMap结构作为容器存储了一些数据;

比如你拿SpringBoot搭建了一个web网站后台;

比如……

理论是什么?

初始化对象有什么代价?背后的底层实现逻辑是怎么样的?初始化太多对象可能导致什么问题?为什么我经常初始化对象,明明是空间消耗大,反而导致程序在运行时间上变得缓慢?

HashMap适合什么场景?我现在这个场景真的是用HashMap最合适吗?运用的时候有没有什么需要注意的?有时候遇到一些特殊需求,在HashMap基础上可以再优化性能吗?

天天用SpringBoot,IOC、AOP到底是什么概念,背后怎么实现的?它们适用场景如何,我的用法是最佳实践吗?会不会有什么弊端,导致在生产环境出现问题?

……

实践与理论的学习,到底应该侧重实践一些呢,还是侧重理论一些呢?

都说实践与理论要两相结合,缺一不可,在我看来这是一句废话。重点是如何权衡两者,并且在不同的发展阶段,两者的侧重比例是否又要发生变化呢

在我看来,实践决定方向,理论填补细节

(1)首先要实践,然后填补理论

程序员首先要实践,才能够收获基本的技术视野和处理问题的能力,这两者都是不可或缺的。

有了基本的视野之后,就可以根据自己学习的方向,去填补你的细节,例如:

  • 我学习了Java,会写一些应用程序了,也知道如何利用应用服务层的Java来对数据库层的数据做一些处理,那么接下来: 1. 对数据怎么处理会更快(这里可能就会引出多线程,然后就可能引出线程池,又引出JDK提供的线程池有什么并发问题,怎么解决,然后可能又引入并发包,一下子串出好多) 2. 各种优化(比如初始化太多对象导致频繁GC,全局变量太多导致占存一直很高blabla)

  • 我学习了MySQL,会用SQL语句操作数据了,知道建索引可以加快访问速度了,那么接下来: 1. 在SQL语句上是不是也可以做一些优化来提升性能(比如很有名的延迟关联) 2. 索引到底应该怎么建才好(这就涉及到索引的很多知识,比如B+树,比如一些匹配原则例如最左适配原则等等)

这种细节的填补是有逻辑性的,从我上面举的两个例子就可以看得出来。这种逻辑性的存在会使你在学习的过程中不会感到虚浮,会发现这些理论都是切实有用且有价值的。

但这样的理论学习还不够,因为它不系统。充分的发散思维使你能够在实践之外追求到很多理论知识,但那些你发散不到的部分就接触不到了。这个时候你就需要系统性的学习,例如读书。

当你第一次学会实践,就好像在自己的脑海中制作了一个知识星球。它里面几乎是空白的,但是球体本身存在,帮助你去界定、区分知识——借助这个球体的框架,当你在遇到一个新知识的时候,你会它有一个模糊的概念:这个知识到底是有用知识还是无用知识,它又在哪个范畴或层面里?

所以借助了一开始的实践,然后你再去逻辑地发散、或者系统地读书的时候, 就不会让新知识成为无根之萍,而是切实地进入你的知识星球中,成为你知识架构的一部分。

(2)理论再返回到实践中

知识架构建立起来了,但它没有经历实践的检验,就依然是不可用的。

一方面在于我们学习的理论知识可能是过时的,甚至是谬误的;另一方面我们可能以为自己懂了但其实没懂,这一点相信大家都能理解。

那么如何实践呢?有些理论可能是很难实践出来的,但是至少我们要对能实践的一部分去做一下尝试。就比如简单的JVM排查和调优,通过MySQL EXPLAIN去检查执行计划并实践优化等等。

我应该如何整理笔记

首先要强调笔记是很重要的。至少我认识的那些能够面试进大厂的同学,每个人都会为自己做笔记。

而至于到底应该如何整理笔记,我认为最重要的有两点:一是分门别类,二是控制粒度。

(1)分门别类

我们一定要能够清晰地把我们要整理的知识模块化,比如说JVM基础,我们可以这样分模块:

运行时数据区

垃圾回收

类加载

JMM

JVM调优

然后分别根据每一个小模块,单独整理一篇笔记。

并且在篇末,或者另开一篇笔记,专门记录针对这个模块的比较大而广的问题。

例如运行时数据区,我们就可以记录这样一些问题:

讲讲JVM运行时数据区的各个组成,是什么,有什么用

讲讲对象。它是如何创建的,里面包含一些什么信息,如何定位到对象

记录这种大的问题,有助于我们进行自测。不要问自己太多细小的问题,除非你切实觉得它很重要。

什么叫细小的问题呢?比如:类里静态的基本数据类型存在方法区还是堆里?

这种问题枚举你是枚举不完的,它其实已经包含在了”讲讲JVM运行时数据区的各个组成,是什么,有什么用“这个问题里。

(2)控制粒度

什么叫控制粒度?其实就是控制你笔记记录的详细程度。

如果你笔记中对于知识点的描述非常简洁,带来的好处是阅读起来就会很快,坏处是可能在阅读时导致你忽略掉一些本不该忽略的细节,或者甚至是:”咦,我这记的是啥,我怎么看不懂了。“

那如果记得太详细呢?很显然,就会导致阅读起来非常繁琐,可能达不到一个理想的迅速复习的效果。

那到底应该控制在一个什么程度上呢?

我认为一篇良好的笔记应该满足以下两个条件:

这段笔记切实提到了所有应该提到的知识点,不需要我去联想;

这段笔记对于这些知识点都有简单的描述性文字,并且能够言简意赅,尽可能以列表列举的形式,不要有叙述性的内容。

tips:什么叫叙述性内容?

举个例子,比如下面这是一段对于垃圾回收算法里的标记-清除算法的笔记:

标记-清除算法:

标记出所有需要回收的对象,根据标记统一回收。

问题:1. 低效率

  1. 产生大量不连续内存碎片

带有叙述性内容的写法是怎么样的呢:

标记-清除算法:

它的基本原理是,标记出所有需要回收的对象,然后根据标记统一回收。

它有两个问题,一是在于效率比较低,二是在于可能产生大量不连续的内存碎片。

非常显然,阅读前者的效率远高于后者。

整理笔记时,我们尽可能省去不必要的铺垫,例如”它的基本原理是“这句话就是完全不必要的。

我们也可以尽可能省去一些联结词,例如”首先“、”然后“、”最后“这种。以及对于一些枚举性内容,我们尽可能采取列表而非文字形式表达,会更加直观易懂易记。

怎么复习才不会忘

每天都反复复习当然可以保证你不会忘,但会非常疲惫而且费时。

严格遵守网上的某些号称贴合人类记忆曲线的复习方式,坚持起来压力很大,最终往往也很难达到自己理想的效果。

实际上这种所谓”曲线“是有一定道理的,但是也要结合我们每个人自身的特殊情况,去找到最适合自己的一种记忆方式。

我认为这样一种记忆法是比较有效的:

从第一次复习并记忆的时候开始算,隔比较短的一段时间再复习并记忆一次,隔不太短的一段时间再复习一次,然后坚持每隔较长的一段时间就复习一次。

那么这个**”比较短的一段时间“、”不太短的一段时间“、“较长的一段时间”**又分别是多久呢?我们可以自己来决定。但需要知道的是,我们的复习间隔时间应该是不断变长的,直到一个比较稳定的值。

比如我个人的话,就喜欢第一次记忆完后,两小时再复习一次,隔一天再复习一次,然后隔四五天复习一次,之后可能就一直是7-10天会复习一次。

无需刻意,比如我本来打算三天后复习一次,但是三天后突然有什么事耽搁了。所以我提前到前一天,或者滞后到后一天,又能怎么样呢?记忆是量变的过程,一天两天的偏移根本不会有什么质变可言。

但让记忆周期大抵符合一个慢慢变长的规律,我想是有必要的。而如果你觉得最后每隔7-10天复习一次都会压力很大,那你也可以半个月甚至二十天才看一次。不过这样的话,等面试要来临的时候,你可能就难免需要简单突击一下了。

面试前

怎么写出让人眼前一亮的简历
按照一般流程来说,你的简历会先给懂一点技术/不懂技术的HR初审,然后再交给研发的同事过审,经过这两层都ok了,才会给你进面试的流程。

也就是说,你的简历不仅要让专业人士看着厉害,还要让非专业人士看着也厉害。

那么作为技术人员,简历到底应该怎么写呢?

(1)综述

我们不妨先概括后具体,先总体看一下简历应该写一些什么东西,写多长篇幅,排版成什么样子,然后再分析每个模块应该如何去写。

写什么东西

一个正常的简历应该有如下内容:

基本信息及联系方式

学习经历

工作经历(或实习经历)

项目经历

专业技能

自我评价(这个不一定要有,看前面篇幅)

写多长篇幅

作为技术人员,我觉得简历1-2页就好,3页未免太过冗长。

排版成什么样子

首先格式上来说,现在一般都是网申,也就是提交电子材料,所以HTML或者PDF格式为佳。

具体排版的话,尽可能简洁明了,不要花里胡哨。技术人,又不是去做UI设计,搞那么好看,人家也不会欣赏,反而觉得你不务正业。

我个人建议简历的好看程度,达到markdown能支持的极限就可以了,不要超过markdown的能力。

(2)基本信息及联系方式

可能会包括以下一些信息:

姓名,电话,邮箱:这几个是必须的,不多说了。

求职意向:单独列这条出来,我建议要写。不然你本来做后端的,人家给你安排到测试开发,你哭都来不及。

个人网站/博客/GitHub:如果有厉害的一定要记得写,如果很水的话建议别写了。

(3)学习经历

可能会包括以下一些信息:

学历(或者毕业年份)

绩点:如果不好看,请不要写,不要写,不要写

专业:如果不是计算机相关专业,请不要写,不要写,不要写

奖项:尽可能多写,从高到低排。先写厉害的,最后写不厉害的。如果没什么拿的出手的奖项,建议干脆什么也不要写。不要孤零零写个什么XX大学优秀团员上去,还不如不写。

(4)工作经历(或实习经历)

这里就如实说就好,切记一定要准确,包括在职时间也写明白,一两个月的偏差也是在给自己埋炸弹。

应该包括以下信息:

在职时间:例如2018.2~2019.3

工作单位:如果不是大家熟知的大厂,最好附上行业

部门:这个是可选项,不一定要写。如果是厉害的部门请记得写,比如腾讯微信

岗位:建议具体。如果公司里岗位就叫“研发工程师”,你可以写成“JAVA研发工程师”或者“GO研发工程师”之类的。

(5)项目经历

这是第二重要的部分!!第一重要的部分是下面的专业能力。但这也是决定你是否能简历过审的很重要的一部分,并且是可能导致面试官疯狂追问你的来源。

一般写2-3个项目经历比较好,相对来说,要挑最厉害的、最对口的、最近的。

那么每个项目经历中,应该写一些什么呢?

项目名称

项目简介:1-2句话就好,让别人知道你这是个什么项目。比如是个后台管理系统?比如是个电商平台?之类的

个人技术工作:请以列表形式列举自己的核心工作,不要大段叙述性文字!! 后面是一些可选项,不一定要写:

技术关键词:项目中涉及到的技术关键词

项目中的收获

项目成果:项目上线后有什么成果。比如抗住了多大的QPS,比如做到了多大的规模等等。请注意这两者是有区别的,前者可能更强调峰值,后者是长期的稳定性。当然还可以有其他的,但最好要有技术视角。

给一个优秀的范例(来自敖丙):
兄弟姐妹们,我终于上岸了,喜获蚂蚁offer,定级p7,万字长文带你走完面试全过程

如果觉得这个有点太高大上了,再看一个普通一点的:

兄弟姐妹们,我终于上岸了,喜获蚂蚁offer,定级p7,万字长文带你走完面试全过程

(6)专业技能

专业技能方面应该尽可能讲得全面,把自己确定会的一个都不要漏掉。

但是一定要和岗位对口。比如你投个Java后台,你非得写个摄影技能上去,反正我个人感觉不是很好。

如果你不知道怎么写,可以看一下岗位描述。一般投递简历前你看到的岗位描述上都会有对于技术要求的说明,比如:

=我们的要求=

全日制211本科以上学历,计算机相关专业,毕业时间2020.11-2021.10

JAVA基础扎实,理解io、多线程、集合等基础框架,对JVM原理有一定的理解

熟悉分布式、缓存、消息、搜索、推荐等技术,并能合理应用,解决实际问题

学习能力强,对代码质量及系统性能具备精益求精的精神

良好的团队沟通协同能力,抗压能力,勇于接受挑战

有作品或者实习经验优先

我们可以根据岗位的要求,结合我们自身的优势,来写我们的专业技能。像这样:
兄弟姐妹们,我终于上岸了,喜获蚂蚁offer,定级p7,万字长文带你走完面试全过程

如何突击面试
我个人觉得,突击面试是在面试前1-10天的这个阶段。

(1)笔试突击复习

这个是毋庸置疑的。之前在怎么复习才不会忘里说,最后坚持每7-10天复习一次。如果你坚持了这种频率,我觉得笔记突击复习对你来说几乎是不需要的。不过如果你觉得心有不安,可以在突击阶段每天复习一次。

切记一点,笔记突击复习时,请记得自己问自己问题,然后模拟一下在面试官面前你会怎么回答。别只是记忆,你还要学会如何表达。

(2)针对性复习

针对性复习包含两方面:把握公司面试特点+刷特定面经

首先是把握公司特点。打个比方,如果你去面试字节跳动,可能就需要多准备一点算法、网络,他们很喜欢问这些。如果你去面试美团,你可能就更需要准备一些JUC并发包、框架。

把握公司特点很重要,你会发现即使同样是面试JAVA岗位,不同公司的面试内容差别也会很大。

甚至不只是公司。到部门层面,差别也会很大。某公司A部门的JAVA岗,和该公司B部门的JAVA岗,就是要求不一样的。也许一个更注重并发能力,一个更注重排查调优能力等等。这一点你可以从岗位要求里去了解,或者问部门里相关的人员。

其次是刷特定的面经。现在网上有很多人分享面经。可能不一定能直接找到你现在面试的部门的面经,但你至少可以找到同一家公司下、业务类型相近的面经。把他们题目拿过来,给自己模拟面试一遍。和前面说笔记突击复习一样,模拟你的表达,别只是心里想一想答案就过去了。

(3)每日一道算法

如果你面试中可能会出现算法题,建议你在突击阶段每天一道LeetCode以保持手感。不过这因人而异,有些人即使很久不做算法,临阵磨枪也不虚。

面试前焦虑该怎么办

什么深吸一口气?站在阳台看看窗外?我觉得效果不是很大。

深呼吸在面试前半小时是有效的,它可以缓解你面试前过分紧张的情绪。但它是缓解紧张的,无法缓解焦虑。

焦虑的源头在于:害怕意外的发生。我觉得缓解焦虑最有效的方式就是,为自己规划好一切。

在突击面试之前,时间尚早,相信你也不会有太多焦虑。当突击面试阶段开始,你就要开始学会为自己规划。让一切有条不紊地进行,你会发现你不再会为面试和其结果感到焦虑,因为你知道你自己做到了最好。

那如何规划呢?

不妨给个例子:

比如我在下周六(2020-04/18)是阿里的一面。而今天是周日(2020-04-12),接下来我怎么安排呢?

2020-04-12 周日

复习单线程容器、JUC包,整理出相关的大而广的面试问题,进行自测。

2020-04-13 周一

复习网络、操作系统

2020-04-14 周二

复习JAVA常见面试题、JVM

2020-04-15 周三

复习MySQL和Redis

2020-04-16 周四

复习Spring、IO、设计模式

2020-04-17 周五

网上查阅面经自测,做两道算法恢复一下手感

2020-04-18 周六

盯着自己准备好的各种大而广的问题反复车轮式复习,直到面试前半小时。

半小时里再背一遍自我介绍,复习一下简历里的项目。

迎接面试。

如果这样规划以后,依然让你感到十分焦虑,很简单:把规划再细化。

你会发现,当规划的细致程度达到某种阶段以后,你的焦虑会转化成压力和动力,不会再让你手足无措。

最后说一个小tip。其实让你面试前不焦虑还有一个非常简单的办法,就是多投递简历,多面试,面多了你就会感到麻木,不会焦虑了。

面试开始

自我介绍到底要怎么说
如果是一面/二面,一般是纯技术面,这个时候我建议可以遵照这样一种自我介绍模板:

自报家门

介绍自己的技术方向和技术能力

我主攻的方向是XX,从技术上来说,我对于XX、XX(枚举一些技术点)比较熟悉(以引导面试官问你熟悉的内容)

介绍项目经历(什么项目,在里面做什么事情,有什么难点,怎么克服的,有什么收获)

我在之前XX(读大学?在XX工作?之类的)的时候,很喜欢并善于研究 / 做过一些有价值的项目,比如blabla。期间遇到过一个问题至今印象深刻,blabla。经过这个项目,我吸收了一些blabla的知识。

tips:在介绍项目经历的阶段中,**“在里面做什么事情”是最重要的模块,一定要讲清楚,做什么事情决定你在面试官第一印象中的高度。而“有什么难点,怎么克服的”**是给你一个埋坑的机会,让面试官更有可能在这个点上去追问你。

收尾

希望在未来,可以把这些知识(之前项目中提到的知识)运用在工作中。

也希望在本次面试中,可以得到面试官的一些建议和指导。

如果是三面/四面/HR面,并且你切实觉得可能不再那么纯技术了,你的自我介绍可以向软实力角度偏移,这里拿我的自我介绍给个例子:

tips:整理你自己的自我介绍的时候,请切记不要太书面语,背起来不舒服不说,真正到自我介绍的时候也会显得生硬。

您好,我是来自XX大学XX专业的XX。

我想从技术理论、项目实践、工作能力上来简单介绍一下自己。

首先是技术理论。我主攻的方向是Java后台。技术上来说,我对于Java基础、JVM、并发容器、线程池等等还是比较熟悉的,另外在框架方面用SpringBoot比较多,读过Spring的源码。而数据库层面的话,磁盘数据库中我对于MySQL尤其是InnoDB引擎比较熟悉,内存数据库中对于Redis比较熟悉。

而在项目实践方面,我对于理论和实践的结合一直是比较看重的。从大一入学两个月我就有带领大一的学生队伍参加院里的项目比赛,之后陆陆续续到今天累计也做了不下十几个项目了。而在这些项目中,在综合方面我主要担任的也都是一个负责人的角色,而在技术方面我主要做的则都是Java后台的部分。我开过会议,出过文档,写过代码,也参加过有好几百人作为听众的大型答辩,应该说不管在硬实力还是软实力上,都得到了很不错的锻炼。

最后是我的工作能力。我现今任我们专业XX班的班长,已经历时一年半,对于组织工作应该说是非常熟悉了。另外,我也有参与学校里一个较大型的信息技术工作室,出任其中的技术部负责人,偶尔会带领学弟学妹们进行一些项目实践,以及参与引导部门及工作室的规划安排。事务很多很杂,也培养了我强大的规划力和执行力,相信这也能够使我在未来的工作中得心应手。

面试中

技术面试的时候应该注意什么
要从表达内容两方面来讲。

(1)表达

表达切记一定要口齿清楚,逻辑清晰。

口齿清楚

口齿清楚这一点相信大家都能领会。但是也不排除有些小朋友一紧张口齿就不利索,这个一定要注意。

更有甚者有时候遇到不太确定的问题,想要以口齿不清来蒙混过关,这种更不可取,基本是搬石砸脚。

逻辑清晰

如何保证这一点呢?有时候当遇到一个措手不及的问题,很难保证我们的逻辑又快又清晰。

所以最简单的方式,就是用速度的牺牲来换取逻辑的明了。甚至有时候你可以短暂地沉默一会儿,好好整理一下思路,千万别张口就来,导致说得乱七八糟不成体系。

(2)内容

对于一些切入点非常小的问题,直接回答就可以。比如说:

Q:对象的锁信息是存在哪里的?

A:在对象头MarkWord里

但是对于一些切入点比较大的问题。例如:

Q:讲讲垃圾回收?

Q:集合里ArrayList和LinkedList有什么区别?

回答的内容切记不可过于简短,但也不能胡乱堆砌。最好的方式是水平扩展或者垂直扩展。

不妨就拿上面的一个问题来举个例子。比如说讲讲垃圾回收。

水平扩展的话,应该怎么讲呢?

A:

有关垃圾回收,我们首先要考虑两个问题。一是如何判断对象可回收,二是用什么样的方式来回收。

首先对于前者,有引用计数法和可达性分析两种方法,它们分别……(讲讲它们的含义,优缺点)

而对于后者,市面上主要有标记-清除,标记-整理,复制三种回收算法,它们分别……(讲讲含义,优缺点)

结合这些算法,市面上就出现了很多垃圾收集器,例如Serial,ParNew,CMS,G1……(顺便讲讲它们的回收逻辑,优缺点)

面试官:(暗自点头)

水平扩展也就是从一个问题出发,把与它相关的整棵知识树或者整颗知识树的一部分(如果树太大的话)讲出来,体现你的知识是有架构有体系的。

垂直扩展的话,又应该怎么讲呢?

A:

垃圾回收的话,自JDK1.8后,市面上就非常流行G1垃圾回收器了。它是不分新生代和老年代的,基本原理是……(讲讲含义,优点)

但是垃圾的频繁回收势必会导致用户体验的下降,虽然G1已经很优秀了,作为开发者我们还是需要关注JVM的优化(话锋一转,开始走向深度)

(讲一些具体的优化策略)

面试官:(暗自点头)

垂直扩展主要是需要自行找到一个切入点。或者面试官已经把切入点给到你了,那么接下来你要引入自己的思考,按照一个没有漏洞的逻辑走向深度,体现你是勤于思考并且善于发现并解决问题的人。

面试尬场怎么办

首先如果是因为你答不上来而尬场,你就乖乖说你不会,千万别强撑。

如果不是这个情况,是面试官一时沉默的话:

有时候面试官可能很忙,他可能都没来得及看完你的简历就来给你面试。换言之,他并没有做太多的准备。所以临时尬场也是非常正常的。

所以现在你要做的就是:让面试官不要尬场。

打个比方:

Q:你说你熟悉线程池,那你说说看线程池都有些什么重要的参数?

A:比如有核心线程数、最大线程数、允许存活时间、阻塞队列等等(顺便简单说一下这几个参数都是什么含义)

Q:嗯不错……(开始沉默)

一般面试官的沉默可能是你回答完这一个问题之后,他一时间想不到问什么。这个时候你可以继续沿着这个问题扩展下去:

A:关于线程池还有一些需要注意的地方。比如当一个任务添加进来的时候……(讲一下任务添加到线程池的流程)

A:考虑到这样一个流程,所以我们在控制最大线程数、阻塞队列的时候是需要注意的。如果最大线程数设置过大,或者阻塞队列设置上限过长,可能导致OOM(又联系回前面参数的问题)

是不是联系回去不要紧,但是只要你依然在讲这个问题相关的知识树里的东西,就可以有效地缓解尬场,还会让面试官觉得:

面试官:(嗯,这小伙基础还挺扎实)

如何学会埋坑

埋坑是非常重要的一个技巧。

什么叫埋坑?就是在回答前一个问题的时候,适当地对面试官进行引导,让他能够问你想让他的问题。

面试前是最容易埋坑的。一是简历里的项目经历,专业技能;二是自我介绍阶段,讲一些自己擅长的技术点等等,引导面试官去问你。

而在面试的过程中,应该如何埋坑呢?

打个简单的比方。

比如现在面试官问你:”ArrayList和LinkedList有什么区别?“

你先中规中矩地回答。回答完之后,我们可以根据我们的擅长点做一些不同的策略:

如果你比较擅长并发容器,你可以说:

ArrayList和LinkedList都属于单线程框架,是并发不安全的。如果要并发安全的话,需要使用CopyOnWriteArrayList或者ConcurrentLinkedQueue

如果你比较擅长线程池,你可以说:

ArrayList和LinkedList分别是对数组和链表的封装。JAVA中比较重要的对于数组、链表的封装集合类还有线程池中的阻塞队列,例如ArrayBlockingQeque和LinkedBlockingQueue

当然了,埋坑只能启到一定的导向作用,最终决定权还是在面试官手上。不要太刻意,不然会适得其反。

面试结束

面试官:“你有什么想问我的吗”该说什么?
这个问题可以给几个例子:

您对我有什么建议吗?

您平时工作中主要做些什么呢?

如果我有幸能够被录取的话,主要会做一些什么样的工作呢?

我怎样才能知道我是否通过了
我个人不建议在面试完后直接问面试官:”我通过了吗?“

而且面试本来就是双向选择,你是在众多offer中挑一个最喜欢的,人家也是在众多面试者中挑最好的那一批。

所以如果你想要知道自己是否通过了,最好的方式是从面试官对你的态度中窥探。

比如你最后问:”您平时工作中主要都做些什么呢?“

他给你回答得非常详细,而且还会主动跟你聊一点别的,比如告诉你进来以后会做什么之类的,那说明他还是很认可你的。

如果他只是简单说一下,有点敷衍的样子,不排除只是他工作忙的可能,但你最好也可以考虑一下,找找其他出路了。

另外,等面试结束后,如果你有推荐你去面试的推荐人或者HR的联系方式,你也可以直接问他们面试的结果。

我两年半的技术人生

最后附上我两年半的技术生涯,中间不免有些弯路,但总体还是令我满意的。

希望给有需要的人以参考。

2017(入学)

7-8月

参加社会上的Java语言基础培训课程,学习Java,基本上到可以简单使用Swing的程度,对于反射泛型等中高级知识一窍不通;

10月

拉了五个也是大一的小伙伴参加学院的创新创业比赛,基于Java Swing写了一个井字策略游戏,拿到学院的优胜奖;

11月

机缘巧合认识了一位研二的研究生,经他推荐进入一位教授的实验室做商业网站;

12月

在研究生的带领下认识SpringBoot和Mybatis,原理一窍不通,但是可以写一点CRUD;

总结

Java语言最基础内容的使用比较熟练了

有了可怜到几乎可以忽略不计的web后台开发经验

当时学院算法学习氛围比较好,到年末我大概相当于共计刷了一百道LeetCode中等题

2018(大一~大二)

1-3月寒假

进入培训机构学习web前端,了解了html-css-js,学会ajax;

4-6月

划水度过,我不知道我在干嘛,就好好上课;

7-8月暑假

做一些基于SpingBoot的简单实践,初步学习Unity游戏引擎;

9-10月

划水;

11-12月

学校各种创新比赛启动,我都参加了,最后同时启动了大约6-7个校园小项目;

总结

这是我多角度尝试的一年(比如web前端、游戏开发),因为我还并没有决定以后从事什么方向。大约在暑假后(9月),我才觉得自己未来应该会做Java后台;

在后台技术上提高不多,只是熟练了那么一丢丢;

项目启动很多,那个时候觉得项目很重要很能锻炼人,后来觉得其实做那么多差不多级别的项目并不是很有意义。

2019(大二~大三)

1-2月寒假

我启动了太多项目,CRUD崽忙不过来了!!

3-6月

各种项目比赛遍地开花的几个月:

3月:两个创新培育项目,一个国创一个市创评级

4月:上海市计算机应用能力大赛二等奖

6月:校大夏杯创业大赛铜奖

但只有我自己心里清楚,奖是拿得很不错,但是技术上其实都是一样的东西,而且非常简单非常基础。全是传统的小型单体web项目,业务驱动。

还是3-6月

比我大两级的拿到蚂蚁金服正式offer的学长来讲了Java面经,我终于意识到自己太菜了。但是跟着大三春招的洪流,我也没忍住投了几个简历试试:

携程:一站式面试,我不知道一站式是什么意思,去面了一面自我感觉良好,就直接走了!走了!没在那等着继续面下去,就没了。

字节跳动 · 北京:视频面试,在第二面挂了,评价是”相对大二学生来说比较优秀,但是暂时还没达到实习岗位的要求

7月

买了一堆蚂蚁学长推荐的书籍,例如《高性能MySQL》、《深入理解Java虚拟机》、《Java并发编程实践》、《图解HTTP》等,开始有计划地阅读起来;

8月

去安徽会场参加全国大学生计算机设计大赛的答辩,荣获一等奖。还是那句话,真没啥技术含量。但是提升了我答辩的能力和吹嘘的水平;

9-12月

继续读书。

总结
这是我从实践逐步转战理论学习的一年。之前的我太过于知其然而不知其所以然了,写项目都是不考虑原理的。自蚂蚁学长分享了Java面经之后,为我指出了方向。

这一年我仔细阅读了《高性能MySQL》前七章,《深入理解Java虚拟机》近整本,也买了《MySQL技术内幕 InnoDB存储引擎》看完了一整本,做了很多笔记。

我还买了很多其他杂七杂八的书,例如《轻量级微服务架构》、《图解TCP/IP》、《大型网站架构》等等,有些是几乎读不懂,有些是没怎么读,大抵算是这一年走的弯路。

2020(大三)

1月

疯狂整理、复习,中旬参加了携程的日常实习面试,通过了,年前进入携程实习;

2月

过年几天还带了两本书回老家,但是真的学不进去。回来后因为疫情远程办公,同时不断进行复习与整理,准备春招;

3月

开始进入春招面试阶段。只投了字节和阿里,都通过了;

4月

一直到今天4.11,一直是静待offer。没有什么事情,就不疾不徐地学一学SpringCloudAlibaba,平时就谈谈恋爱,打打游戏,看看电影。

我两年半的技术生涯,主要走的是 实践学习 → 理论学习 → 实践理论相结合 这样一条路线。

一开始的实践学习就像是培训班生活,只不过是自我培训;

然后到理论学习层面,有幸听到蚂蚁学长的面经讲座,加上有之前的实践基础,让我的理论学习有方向感且不会太虚浮;

最后是实践理论相结合层面,主要就是把我一些新学习的没实践过的理论付诸实践。就比如学习了JVM调优和问题排查,就自己写一个死锁程序或者OOM程序然后用排查工具来排查一下问题。

学习资料分享

面经
兄弟姐妹们,我终于上岸了,喜获蚂蚁offer,定级p7,万字长文带你走完面试全过程

学习图谱
兄弟姐妹们,我终于上岸了,喜获蚂蚁offer,定级p7,万字长文带你走完面试全过程

面试资料
兄弟姐妹们,我终于上岸了,喜获蚂蚁offer,定级p7,万字长文带你走完面试全过程

视频资料
兄弟姐妹们,我终于上岸了,喜获蚂蚁offer,定级p7,万字长文带你走完面试全过程

文档资料
兄弟姐妹们,我终于上岸了,喜获蚂蚁offer,定级p7,万字长文带你走完面试全过程
你的支持,我的动力;祝各位前程似锦,offer不断!!!

上一篇:阿里P7面试官:请你简单说一下类加载机制的实现原理?


下一篇:归并排序非递归版本2及其相关面试题