4月是春招的黄金阶段,投了几十份简历,大大小小的公司不知道去了多少家,也幸运的拿到了某厂offer。加上前阵子有好多朋友问各大厂的面试过程,所以为了方便沟通交流回来熬夜5天整理很多Google/网易/腾讯/百度/华为的面经,今天也拿来给分享一波攒攒人品吧!
注意:整理的各家面经(部分附有解析)以及面试专题(附答案),有需要的老铁<stron>传送门 即可!!</stron>
第一家是Google(笔试)
Google 笔试是没有门槛的,这样说是因为 Google 根本没有限制笔试的人数,开了N个教室,让N多人参加……不过笔试本身却有门槛,看了题目就知道...
- 第一个的题目(嗯,记的不是很完整):在一棵(排序?)二叉树中搜索指定值,数据结构定义为(唉唉,数据结构的具体名字都不记得了,my god)
- 第二个的题目:计算 Tribonaci 队列(嗯,九成九记错了那个单词……),规则是 T(n) = T(n
- - 1) + T(n - 2) + T(n -3),其中 T(0) = T(1) = 1,T(2) = 2
- 第三个的题目:在一个无向图中,寻找是否有一条距离为 K 的路径,描述算法即可,不用实现,分析算法的时间和空间复杂度,尽量优化算法
- 第四个的题目... ...
Google面经
第二家是网易
网易给了我一个教训,所以记下来以留念
一面:65分钟左右
- 抽象类和接口的区别;(Java核心技术:全部讲了一通后,抛出第三个问题)
- 抽象类内方法如果全部是抽象的,是不是就是接口?为什么有的类继承一个类后,还要实现多个接口?(Java核心技术)
- 多线程中,线程池用过哪些线程池?(多线程并发);
- 线程池中所有的参数讲解一下(多线程并发)
- 线程池中从corePoolSize到maximumPoolSize转变过程,然后问我反向转变的操作;
- HTTP发送请求和接收响应的整个流程;(web:扯了一下客户端和服务端之间的流程)
- 403和500状态分别讲解一下,他们之间有什么区别;(web技术)
- 淘宝里如果按照1-5星的店面,从五家店里一共推送出10个同一类产品,都是随机推送,但是最后大量的随机测试后,要保证五颗星的店家推送的商品数量大概是一颗星店家推送的商品数量的五倍,且不能破坏其他概率输出(思维能力:这个问题跟他讨论了有10几分钟)
- 一个已知存储了数据的HashMap中如何让所有的键修改成"网易+原来的键",意思是在所有的key中添加"网易"这个前缀;(Java核心技术)
- spring的AOP原理和底层实现;(框架技术)
- Spring的注解讲一下;(框架技术)
- 静态代理和动态代理区别讲一下;(Java核心技术)
- 静态代理和适配器设计模式的区别;(Java核心技术)
- tcp和udp的区别;(计算机网络知识:就从可靠性,通讯方式,数据大小,应用方面说了说)
- cglib底层实现;
- 数据库的乐观锁原理和实现。
二面:差不多也是1个小时
- 数据库索引的设计原理以及意义(数据库:讲了一下概念和聚集索引,非聚集索引)
- 接着上面的问题,问了给定一个数据库,如何设计索引,有什么要注意的?
- 给定淘宝秒杀场景,请设计系统实现秒杀
- 微博粉丝和关注者,以及用户信息,请实现数据库表,来关联起这些表
- 针对我设计的表,进行查询操作,问我所有的表查询完后,多少次操作。(数据库)
- 之前做了什么项目?讲解一下。(项目经验)
- 就着项目,提出海量数据的时候,集合存不下怎么办(Java核心技术)
- Spring中的事务原理讲一下
- 数据库里的事务原理讲一下
- 数据库的事务特性有哪些?(数据库)
- 手写jdbc连接数据库的代码
- mybatis和jdbc的区别?mybatis底层实现?
- 线程池(这个讲了好久)
网易面经
第三家是腾讯
一面(1小时50分钟)
- 有没有了解过nginx,如何将监听到的连接分配到其他线程
- linux内核是否支持多进程或多线程accept()同一个listenfd
- 有没有想过无锁队列的实现7.原子性的理解,系统底层如何实现原子性
- int类型全局变量读、写、自增哪些是原子性的
- volatile的作用
- stl容器是否线程安全
- 讲一下哈希表的底层细节,让你设计一个线程安全的哈希表,会怎么设计
- malloc()的底层细节,brk()和mmap()
- inline、define、普通函数的区别
- linux如何设置core文件生成
- linux如何设置开机自启动
- linux用过哪些命令、工具
- 用过哪些工具检测程序性能,如何定位性能瓶颈的地方
- 基于socket网络编程和tcp/ip协议栈,从客户端send()开始,到服务端recv()结束的过程,越细越好
- tcpdump抓包,如何分析数据包
- tcp如何设定超时时间
- 有没有做过网络安全协议相关的项目
- 手撕代码,数组内两个子区间交换
- 目前还有哪些面试在流程中,拿了哪些offer
二面(50分钟)
- 数据包如何编解码,tcp黏包问题如何解决
- rpc有没有了解
- 网络库的性能如何,怎么测试性能,如何计时和计数
- core dump有没有遇到过,gdb怎么调试
- 在高并发的生产环境中(非调试场景下),如果出现数据包的丢失,如何定位问题
- 项目性能瓶颈在哪,数据库表怎么设计
- 假设项目的性能瓶颈出现在写数据库上,应该怎么解决峰值时写速度慢的问题
- 假设数据库需要保存一年的数据,每天一百万条数据,一张表最多存一千万条数据,该咋设计表
- 除了C++,还有学习其他语言吗
- 一亿条电话号码删除重复的部分,时间、空间复杂度尽可能低
第四家是百度
百度的面试环境不错,一对一在酒店的房间面试,百度是我第一家被女面试官面试的公司,然后总体感觉百度面试官问完一个东西,喜欢揪着你问为啥是这样的,比如说前面的final关键字以及我讲完hashmap扩容以后问我正在扩容的时候来了一个怎么插入,所以感觉要想通过面试,有些东西自己得去深究,自己给自己想问题,为啥是这样子的。
- 项目
- 字符集和编码的区别?
- Final修饰词作用?
- 接着问了final修饰有啥好处?
- 还问了String中重写equals不重写hashcode会出现什么问题?
- 由于我上面提到了集合,然后问我让我讲一讲hashmap
- 由于我上面提到了hashmap非线程安全,就问了我ConCurrentHashmap
- 问了LinkedList适合用什么排序?
- 出了一道场景图,就是对于一个上线的系统,它会周期性地出现卡顿,这是怎么回事,让我分析原因.
- ... ...
百度面经
第五家是华为
一面
- 介绍一下你熟悉的技术栈和项目
- 说一下你常用的集合(ArrayList,LinkedList,HashMap)他们之间的区别
- 说一下线程池的参数,为什么要设置一个maxsize,以及各个参数的情况,线程空闲机制等
- 说一下你用到哪些锁,以及区别
- 假如给你一个类,类里面有一个方法public synchronized void x(){},现在new 两个对象a,和b,我们用a.x和b.x,会不会出现抢占锁的情况
- 什么是重入锁,为什么称为重入,举个例。如果不是重入的会发生什么。
- 项目中的协议用的什么
- 重用的集合自定义排序是怎么用的
- 前台的请求,后台怎么处理和接受
- http和https区别,有没有用过https
- jvm是运行时区域
- 堆外内存,为什么需要堆外内存
- 手撕一个代码leetcode72题
二面
- 将公司实习项目,架构和流程
- 具体分析流程,哪一步什么情况
- http请求的格式,三部分分别有哪些内容,之间的分隔符是‘/r’还是‘/n’
- 你的项目使用了tomcat没有
- tomcat是导入使用war包的,里面的xml文件是服务器读还是war读
- springboot的请求,在进行数据库操作的当前的链接是什么样,是否会阻塞
- 有没有做过线程,创建线程的方式
- 手撕一个代码,leetcode第415题
- 做一个数学题,有一栋100层高的大楼,给你两个完全相同的玻璃球。假设从某一层开始,丢下玻璃球会摔碎。那么怎么利用手中的两个球,用什么最优策略知道这个临界的层是第几层???
三面
- dubbo介绍一下
- dubbo架构图
- dubbo是否是微服务
- zookeeper的作用
- zookeeper要不要做分发?
- 负载均衡怎么做的?
接下来说说面试专题的复习与学习
其实不管哪家公司,怎么面试,问的知识点什么的都是差不多的,就看我们肚子里的存货有多少,能否应付。前段时间我还整理了一份覆盖25大专题的面试题+解析(总共有227页)
- 专题一:JavaOOP面试题
- 专题二:Java集合/泛型面试题
- 专题三:Java中的IO与NIO面试题
- 专题四:Java反射面试题
- 专题五:Java序列化面试题
- 专题六:Java注解面试题
- 专题七:多线程&并发面试题
- 专题八:JVM面试题
- 专题九:Mysql面试题
- 专题十:Redis面试题
- 专题十一:Memcached面试题
- 专题十二:MongoDB面试题
- 专题十三:Spring面试题
- 专题十四:Spring Boot面试题
- 专题十五:Spring Cloud面试题
- 专题十六:RabbitMQ面试题
- 专题十七:Dubbo 面试题
- 专题十八:MyBatis 面试题
- 专题十九:ZooKeeper 面试题
- 专题二十:数据结构面试题
- 专题二十一:算法面试题
- 专题二十二:Elasticsearch 面试题
- 专题二十三:Kafka 面试题
- 专题二十四:微服务面试题
- 专题二十五:Linux面试题
25大面试专题
除此之外还有一份287页Java核心知识整理(包括:VM,JAVA集合,JAVA多线程并发,JAVA基础,Spring原理,微服务,Netty与RPC,网络,日志,Zookeeper,Kafka,RabbitMQ,Hbase,MongoDB,Cassandra,设计模式,负载均衡,数据库,一致性哈希,JAVA算法,数据结构,加密算法,分布式缓存,Hadoop,Spark,Storm,YARN,机器学习,云计算)
Java核心知识整理
无论是面经也好,还是这个25大面试专题的整理以及这份287页的Java核心知识都是学习复习的宝典,若能把这些都存进脑子里,还不敢跟面试官杠杠?想拥有so easy,<stron>传送门 即可!!</stron>
最后来说说简历?
- 为什么说简历很重要?
一份好的简历可以在整个申请面试以及面试过程中起到非常好的作用。 在不夸大自己能力的情况下,写出一份好的简历也是一项很棒的能力。为什么说简历很重要呢?
- 先从面试来说
假如你是网申,你的简历必然会经过HR的筛选,一张简历HR可能也就花费10秒钟看一下,然后HR就会决定你这一关是Fail还是Pass。
假如你是内推,如果你的简历没有什么优势的话,就算是内推你的人再用心,也无能为力。
另外,就算你通过了筛选,后面的面试中,面试官也会根据你的简历来判断你究竟是否值得他花费很多
时间去面试。
所以,简历就像是我们的一个门面一样,它在很大程度上决定了你能否进入到下一轮的面试中。
- 再从面试说起
我发现大家比较喜欢看面经 ,这点无可厚非,但是大部分面经都没告诉你很多问题都是在特定条件下才问的。举个简单的例子:一般情况下你的简历上注明你会的东西才会被问到(Java、数据结构、网络、算法这些基础是每个人必问的),比如写了你会 redis,那面试官就很大概率会问你 redis 的一些问题。
比如:redis的常见数据类型及应用场景、redis是单线程为什么还这么快、 redis 和 memcached 的区
别、redis 内存淘汰机制等等。
history // 所有的历史记录
history | grep XXX // 历史记录中包含某些指令的记录
history | more // 分页查看记录
history -c // 清空所有的历史记录
!! 重复执行上一个命令
查询出来记录后选中 : !323所以,首先,你要明确的一点是:你不会的东西就不要写在简历上。另外,你要考虑你该如何才能让你
的亮点在简历中凸显出来,比如:你在某某项目做了什么事情解决了什么问题(只要有项目就一定有要
解决的问题)、你的某一个项目里使用了什么技术后整体性能和并发量提升了很多等等。
面试和工作是两回事,聪明的人会把面试官往自己擅长的领域领,其他人则被面试官牵着鼻子走。虽说
面试和工作是两回事,但是你要想要获得自己满意的 offffer ,你自身的实力必须要强。
- 必知必会的几点
大部分公司的HR都说我们不看重学历(骗你的!),但是如果你的学校不出众的话,很难在一堆简历
中脱颖而出,除非你的简历上有特别的亮点,比如:某某大厂的实习经历、获得了某某大赛的奖等等。
大部分应届生找工作的硬伤是没有工作经验或实习经历,所以如果你是应届生就不要错过秋招和春招。
一旦错过,你后面就极大可能会面临社招,这个时候没有工作经验的你可能就会面临各种碰壁,导致找
不到一个好的工作
写在简历上的东西一定要慎重,这是面试官大量提问的地方;
将自己的项目经历完美的展示出来非常重要。
- 必须了解的两大法则
STAR法则(Situation Task Action Result)
Situation: 事情是在什么情况下发生;
Task:: 你是如何明确你的任务的;
Action: 针对这样的情况分析,你采用了什么行动方式;
Result: 结果怎样,在这样的情况下你学习到了什么。
简而言之,STAR法则,就是一种讲述自己故事的方式,或者说,是一个清晰、条理的作文模板。不管是什么,合理熟练运用此法则,可以轻松的对面试官描述事物的逻辑方式,表现出自己分析阐述问题的清晰性、条理性和逻辑性。
FAB 法则(Feature Advantage Benefifit)
Feature: 是什么;
Advantage: 比别人好在哪些地方;
Benefifit: 如果雇佣你,招聘方会得到什么好处。
简单来说,这个法则主要是让你的面试官知道你的优势、招了你之后对公司有什么帮助。
- 项目经历怎么写
简历上有一两个项目经历很正常,但是真正能把项目经历很好的展示给面试官的非常少。对于项目经历
大家可以考虑从如下几点来写:
1. 对项目整体设计的一个感受
2. 在这个项目中你负责了什么、做了什么、担任了什么角色
3. 从这个项目中你学会了那些东西,使用到了那些技术,学会了那些新技术的使用
4. 另外项目描述中,最好可以体现自己的综合素质,比如你是如何协调项目组成员协同开发的或者在
遇到某一个棘手的问题的时候你是如何解决的又或者说你在这个项目用了什么技术实现了什么功能
比如:用redis做缓存提高访问速度和并发量、使用消息队列削峰和降流等等。
- 专业技能怎么写
先问一下你自己会什么,然后看看你意向的公司需要什么。一般HR可能并不太懂技术,所以他在筛选
简历的时候可能就盯着你专业技能的关键词来看。对于公司有要求而你不会的技能,你可以花几天时间
学习一下,然后在简历上可以写上自己了解这个技能。比如你可以这样写(下面这部分内容摘自我的简
历,大家可以根据自己的情况做一些修改和完善):
- 计算机网络、数据结构、算法、操作系统等课内基础知识:掌握
- Java 基础知识:掌握
- JVM 虚拟机(Java内存区域、虚拟机垃圾算法、虚拟垃圾收集器、JVM内存管理):掌握
- 高并发、高可用、高性能系统开发:掌握
- Struts2、Spring、Hibernate、Ajax、Mybatis、JQuery :掌握
- SSH 整合、SSM 整合、 SOA 架构:掌握
- Dubbo: 掌握
- Zookeeper: 掌握
- 常见消息队列: 掌握
- Linux:掌握
- MySQL常见优化手段:掌握
- Spring Boot +Spring Cloud +Docker:了解
- Hadoop 生态相关技术中的 HDFS、Storm、MapReduce、Hive、Hbase :了解
- Python 基础、一些常见第三方库比如OpenCV、wxpy、wordcloud、matplotlib:熟悉
- 排版注意事项
1. 尽量简洁,不要太花里胡哨;
2. 一些技术名词不要弄错了大小写比如MySQL不要写成mysql,Java不要写成java。这个在我看来还
是比较忌讳的,所以一定要注意这个细节;
3. 中文和数字英文之间加上空格的话看起来会舒服一点;
- 其他一些小tips
1. 尽量避免主观表述,少一点语义模糊的形容词,尽量要简洁明了,逻辑结构清晰。
2. 如果自己有博客或者个人技术栈点的话,写上去会为你加分很多。
3. 如果自己的Github比较活跃的话,写上去也会为你加分很多。
4. 注意简历真实性,一定不要写自己不会的东西,或者带有欺骗性的内容
5. 项目经历建议以时间倒序排序,另外项目经历不在于多,而在于有亮点。
6. 如果内容过多的话,不需要非把内容压缩到一页,保持排版干净整洁就可以了。
7. 简历最后最好能加上:“感谢您花时间阅读我的简历,期待能有机会和您共事。”这句话,显的你会
很有礼貌。
最后再唠叨一句,文中提到的各大面经点击传送门 即可领取!!
面试专题以及学习笔记皆可分享下载,点击传送门 即可!!