写在前面
想看面经的请直接往后拉,前面是一些自己的情况介绍和经验分享,希望能帮助到有需要的同学。
本硕传统工科专业,本科学习过C、C++、Java语言基础,数据结构和数据库,微机原理了解一点计算机底层的知识,其他的都是一些偏硬件相关的课程,硕士阶段决定转码之后自学了计算机网络、操作系统、spring框架、MySQL、redis、消息队列等知识。
先后拿到了滴滴、美团、阿里的offer,这次主要分享校招经验和阿里的面试题,想查看滴滴、美团等以前的面经可以移步:
自己还写过一篇《深入理解Java虚拟机:第三版》的读书笔记,这一版新增了ZGC等新版垃圾回收器的介绍,需要的可以移步:
最开始的时候就是集中精力先掌握20%最高频的面试问题,囫囵吞枣,不求甚解。你要相信即使你看完忘了,后续再复习到类似的知识,终究不会白看的。这一边可以参考GitHub上一些人整理的知识架构,或者面试常问的问题进行复习,具体链接我就不放了,相信大家都有自己收集整理资料的能力。
在进行一轮复习之后你差不多就知道了自己薄弱的点,拿我自己举例,21年3月份春招找实习,经过几轮面试之后发现基础还是薄弱,操作系统这块更是一窍不通,仅停留在线程进程初步认知的阶段。所以秋招之前就再系统地过了一遍Java生态体系相关的基础知识,然后系统性地学习了操作系统线程进程、进程通信、进程调度、虚拟内存、置换算法等知识,这块感兴趣可以找本操作系统的书籍学习,面试最常问的差不多就是我说的这几块知识。
接下里一般就是在实际面试中总结,然后继续深化一些知识点的学习,比如redis经常问常用的数据类型和实际使用场景,但是问得更深入的时候会问你有没有了解过这些数据类型的底层数据结构,比如字典和跳表等,这种都需要你再深一步去学习掌握,博客一般质量参差不齐,需要自己甄别,时间充裕还是以官方文档和出版书籍为准,博客更适合遇到一个有印象的知识点但是忘了内容的时候查阅,用以验证,但不适合从零开始的学习。
关于面试再多谈一点,正常来看大公司面试一般有三四轮技术面,加上一轮HR面。
一面一般是工作了一两年已经有一定经验的面试官(当然不绝对),考察技术宽度,会尽可能广地考察你的基础,除了前面提到的语言基础、计算机科班基础、框架和中间件基础,还会问对一些工具的使用,比如Git指令,Linux指令,maven依赖管理,看你是否具有一定实际开发经验。
二面一般是你的团队主管,把控部门业务方向(当然不绝对),考察你的技术深度,有没有看过JDK源码,比如容器、JUC相关源码,是否了解spring内部的原理,IOC和AOP本质是用的JavaSE中什么技术。其他语言我不清楚,如果是Java你是否对JVM有更深入的了解,因为JVM好比是Java中对象生活的一个大环境,你除了了解Java对象,当然还要了解这个环境的规则,你对这些规则能否有自己的感悟。
三面一般是部门总监,考察你的学习能力,是否足够聪明,反应是否足够敏捷,思维是够足够发散,能够举一反三。自己经历过这一面被问Java新建对象的时候,会给对象头中添加哪些信息,当时自己有印象但是真忘了,就直言在《深入理解Java虚拟机》这本书里看到过,但是具体内容想不起来了,面试官表示也理解,就换下一个问题了,问了下强弱软虚引用。
HR面主要考察你对自己的认知是否存在障碍,是否乐观,能很好释放压力。所以一般都会问你的优缺点是什么,经历过的最大挫折,一般如何排解等等,没准备的就正常回答,有准备的可以先准备一下,突出自己乐观向上就行,自身性格就是不怕苦不怕累就更好了。
以上仅仅为个人经验,不一定适用于其他大厂,比如滴滴只有三轮技术面,而且面试官都是随机分配的,不是递进关系;美团是2轮技术面+1轮HR面,阿里对于优秀的同学还会安排其他部门的主管来交叉面等。
对于有实习经历的同学,一般面试问基础知识之前,都会了解下你实习的工作,自己可以提前准备好实习遇到的难点问题,如何解决;如果实在没有难点,可以聊聊自己实习的收获,哪怕是Linux系统指令、Git指令的熟悉等,对产品迭***过程的体会等,都可以和面试官聊,但是技术上解决的问题或者实际需求肯定能和面试官聊得更多。所以实习期间一定要自己完成跟进一个实际需求,复盘技术难点,总结技术方案,评估能否解决一类问题,有无可拓展的空间等等。人都是有惰性的,并且健忘,如果只是日复一日干活,一段时间后就忘了自己做了什么。善于总结才能让自己进步,什么时候开始总结?种一棵树最好的时间是十年前,其次就是现在。
我是刚经历完秋招和春招,面试也面了很多轮,最后再简单分享一点吧,有时候面试官问你一个问题,不是想听一个很简单的回答,是想了解你是怎么学习的,是否系统了解这个知识点。举个例子,我们经常被问到你了解https协议吗?你总不能说https就是http+ssl,然后就开始等面试官提下一个问题。
你心里可能想着嗯就是这样,你继续提问我ssl是什么吗,我再继续回答。但是从我自身的面试经验来看,面试官提问也是很累的,他提了一个比较广的问题时候,你要按照你自己树立好的知识体系,完整但是概要地介绍一遍,比如先介绍http存在的问题,https是怎么解决那些问题的,用了什么新的技术方法实现的,但是对应的https是否解决问题的时候又带来的新的问题。
再举个例子,面试官问Sting类型为什么是不可变的,你不能只说String的底层是final定义的char数组,你要先从String为什么不可变开始分析,线程安全、经常被用作key等等,然后解释String不可变的底层实现,最后说下final 修饰会存在什么问题。还要进一步拓展的话,可以说一下如果需要频繁可变的字符串对象,Java提供了两种类,各有优劣,分别的优劣是什么。
一个简单的问题,你可以回答10s,也可以回答2分钟,全看你自己是否对知识有系统性地梳理。
上面说的是回答的时候要有知识体系,另外一点就是学习知识要触类旁通,比如我们学习过线程池,基本思想就是提前创建和延迟销毁,这种池化的思想比比皆是,数据库连接池,IO复用,长连接等等,都是为了减少频繁新建和销毁的性能消耗使用了“资源池”。在比如TCP的可靠传输,可靠体现在哪些方面,无非就是如下场景:1.传丢了怎么办;2.传重复了怎么办;3.传太快了怎么办;4.传输通道是不是可靠的等等,对应的无非就是超时重传、丢失确认、拥塞控制、三次握手等等技术,类比到消息队列如何保证消息的可靠消费,也是类似的场景:1.消息穿丢了怎么办;2.消息传重复了怎么办;3.如何保证消费端成功消费,对应去设计一些策略就行。这一段我说完能体会我意思的同学不知道有多少,可能需要一定的积累才会在学另外的的东西的时候产生新的感悟:哦,这不就是XX技术里的XX思想嘛,换汤不换药嘛!
最后对于常规的问题要加上自己的理解,锦上添花。比如问hashmap的源码,我想这个知识点学Java的同学都有准备过吧,那你怎么让自己的回答出彩一点呢,可以动动脑筋自己想一点出彩的地方。举个例子,hashmap中链表转红黑树的临界值是8,为什么设置成8大多数人都能回答出在时间复杂度上,n=8时红黑树的时间复杂度更优。但是再仔细想想,链表平均复杂度是n/2,红黑树复杂度是log2N,无论n取4还是16,红黑树复杂度都不会比链表差,那设置成8是什么原因呢?源码中有提到泊松分布,如果hash冲突导致链地址法产生8个以上节点的链表的概率小于百万分之一,出现这种情况说明不是正常的key的存放,后续一定会有更多的key都是落到散列表的这个位置,因此要转成红黑树,提高性能。具体可以看那段英文解释,比我这里解释得更好。
总支,面试之前要要自己总结知识点形成体系;对部分常见知识点要形成自己的理解;对一些解决方案要能有一定的抽象类比,举一反三。
阿里一面 周日下午 2h
面试一小时,笔试一小时,比较基础的问题,忘得差不多了,记一下印象深的
自我介绍
实习经历和收获
实习难点和解决
多线程开发经验,juc包,线程池
有10个线程和一个工作线程,如何保证工作线程在10个线程执行结束之后开始执行
当时第一反应回答了CountDownLatch工具类,然后面试官说不用工具类自己实现,我就有点想复杂了,以为需要AQS的实现,自己写一个双向队列,然后面试官提示不用这么复杂,你可以额外设置一个公共变量不就可以,点拨到这里就明白了是类似多线程打印的问题,公共变量+锁实现线程通信。
然后了下线程之间如何等待如何唤醒,具体用什么方法
因为简历是捞起来的需要补笔试,写了道算法题,中等难度,n根木材截成相同长度的m段,求可以截取的最大段长,写完面试官问有无优化思路,想了下动态规划的思路,没想出来。
阿里二面 周二晚上 50min
对部门业务是否了解
面试官对部门业务的介绍
自我介绍
实习经历介绍
对spring的理解
对spring“简洁”这一妙处的理解(回答的不好,到了后面按照面试官的引导,开始理解是希望回答动态代理实现的动态编译过程)
三次握手,四次挥手
拥塞控制,快重传、快恢复
HTTP和HTTPS
关于公有密钥和私有密钥的加密解密过程,以及证书的发放过程(关于这个问题《图解HTTPS》一书中有通过图示给出详细的过程讲解)
HTTP的报文结构,首部信息
cookie的作用
session相关,如何和cookie结合使用
京东网站是否可以读淘宝网站的cookie
cookie在子域的访问权限粒度
@mapper注解的理解(需要回答动态代理的知识)
AOP的理解
这里额外提一下,在回答@mapper注解注解的时候自己回答得不好,面试官就问了下对AOP的理解,顺利回答除了动态代理以及反射的知识点,然后面试官提示说AOP的原理知道,@mapper的实现方式为什么会不知道呢?
面试官都这么提示了,我自然明白他的意思了,就回答说@mapper也是使用了动态代理运行时动态编译的实现方式,让整个代码变得简洁。
为什么想到要去看《深入理解Java虚拟机》
发表的论文、专利的大概内容,是第几作者
阿里三面 周三晚上 45min
技术总监,是那种谷歌他的花名都能搜索到一堆相关资料的大佬
自我介绍
项目的架构设计,不足,如何改进
单机情况和分布式情况不同场景如何设计一些业务
基本现场给场景,让你提供设计思路
Java对象头有哪些信息
强软弱虚四种引用,弱引用有了解吗
ThreadLocal用过吗,可能会出现什么问题,如何解决
个人学习方式、性格特点
阿里四面 周二晚上 20min
目前的offer情况,还有无在面试流程中的公司
实习时长情况,实习经历介绍
实习遇到的困难和解决办法,实习经历的收获
导师对你的评价中好的方面和坏的方面
对于评价中不好的方面有想过怎么改进吗
实习期间最深的感受
对目前手里offer的打算,未来几年的规划
户籍,父母所在地
父母对你的教育方式
你如何评价自己的性格
对部门业务的了解
对企业文化的认知和对996的看法
有女朋友吗
反问环节,了解了下部门业务的定位和前景
全部评论
(7) 回帖