笔试过了之后,通知到深圳百度国际大厦面试,北京打来的电话,一开始以为是推销电话给挂了……幸亏人家打了第二次。一二三面是同一天进行的,面完一次就让你等候,然后要么告诉你“您今天的面试结束了”要么给你安排下一面。
本人侥幸面了三面,三面全是技术面,而且每个面试官会记录你的信息给下一轮的面试官,比如一面觉得你可以手撕代码能力稍弱或者什么方面问得比较少,第二轮可能会进行加强。面试官人都挺好的,不过感觉三面过的希望不大。因为面了一天感觉脑子有点混乱,记住得不全,只能把记得住的分享给大家。
三次面试都是一开始做自我介绍,中间会看着简历问一下项目经历,所以下面不重复。
JAVA:
8大基本类型?他们各自占多少字节?
JAVA集合类有哪些,有什么区别,如何保证线程安全?
synchronize的特点,用过哪些lock,两种同步方式的区别?
synchronize可以加在哪?加在类上时,该类的两个实例能不能同时调用类中同一个方法?能不能同时调用同一个静态变量?
乐观锁和悲观锁的区别以及Java中如何实现?
lock和CAS的联系?
线程有几种实现?区别和特点是什么?
写一个程序,Main函数里开10线程,怎么保证10个线程都执行完后Main函数才继续往下执行(我用cutdownlatch)?
线程池的机制?怎么实现线程池(问到这个我就有点慌了)?
IO与NIO的概念?为什么 NIO能保证不阻塞?阻塞的IO应该怎么处理(我答多线程)?
JAVA中各种InputStream,什么情况用字节流什么情况用字符流?读取本地文件怎么指定编码?
网络中数据流传输,接收方怎么实现按帧获取?
框架:
MVC模式的概念及好处?
注解的实现原理(这个我也慌了,实现原理???)?
IOC和AOP?AOP的实现原理(反射+代理)?
LINUX:
LINUX的一些简单命令(我直接告诉他我很少用LINUX)
操作系统:
进程和线程概念?线程彼此的区别是什么?对应到JAVA程序哪个是进程哪个是线程?
计算机网络:
五层模型?每层的基本作用?每层各有哪些协议?
数据库:
几个范式的概念?
设计上分表的好处?
另一种分表(横向,纵向,散列)的概念和好处?喜欢用哪种?为什么?
怎么防止数据库注入攻击?preparedStatement为什么能防止?
前端(主要是我简历写我做过前端):
跨域请求?
session和cookie的区别?
知道什么网站攻击行为?怎么防止js嵌入攻击?字符转义可以在哪实现?
编程(不知道为什么,简单到我有点不敢相信,感觉就像让人写冒泡排序):
给两个接口,一个可以判断对象是文件还是目录。另一个接口可以获取目录下的所有文件和目录,写一个程序,输出某一目录下的所有文件和目录。递归和非递归各实现一遍。
JAVA:
写一个最安全的单例模式并解释(感觉这个哪哪都必考)?
synchronize可以加在什么上(代码段,类,方法这些)?我习惯用在什么地方?为什么?
volatile的特点和作用?可以用在哪(上面的单例模式就用到了)?和synchronize的区别?怎么在使用volatile时也保证原子性?(JAVA提供了原子类)
实现一个不能被继承的类(我只答了构造器私有,然后其他的不了解)?
抽象和接口的区别?
怎么判断一个对象是否改被回收(引用计数法和可达性分析法)?如何实现引用计数法(讲思路)?
操作系统:
死锁的条件?用JAVA写一个必定死锁的程序?
页面置换算法有哪些?如何用JAVA实现一个最近最久未使用算法?如果不用JAVA,而是自己去设计一个操作系统,怎么实现该算法(讲讲思路而已,我说内存本身要排序)?
还有一些零散的我忘了,基本都是JAVA的(发现二面的挺多问题都是讲个大概思想就行)。
然后她问我还有什么问题,我说你想考察我的什么素质?因为听说大厂都很注重算法和数据结构,但是两面过来还没感觉有太难的算法(我简直是作死……)?
面试官:“听说算法问得比较少?那我们来问算法吧。”(我的内心……)
算法:
1.八皇后写过吗?写完递归让我写非递归。
2.一个人困在山洞里,有三个洞口A、B、C,进去三个洞口后分别要走1、2、3个小时,走进A、C洞口会回到原点,走进B洞口会走出山洞,问走出去的数学期望是多少?(我说数学期望是什么已经忘了,概率论不行)
3.一个接口,返回0的概率是0.25,返回1的概率是0.75,写一个封装该接口的方法,得到一个返回0和1的概率都为0.5的方法,不能用到随机数的接口?(我给了个解决方法他说要是比例换成是0.1和0.9呢?懵了,不懂……我记得在其他百度面经看过这道题,但是当时没有详细去研究,真的是后悔,其实就是按顺序调两次接口,若为1,0就返回1,若为0,1就返回0,否则重新调用,这样子就相当于两个概率各取一半,总的概率也为一半)
4.面试官自己临时随便想的一道题,挺简单的,给你n瓶饮料,每三个空瓶子可以换一个饮料,总共能换几瓶?程序实现。
其他问题:
http和https的区别?http里用了什么协议?比tcp多了什么?
联合索引?
一致性哈希是什么?
亿级数据怎么分表?怎么去部署实现。
分表的线性散列用什么键求哈希值?除余吗?考虑扩展性应该怎么设计算法?
设计一个秒杀系统(抢手机那种)?考虑会出现什么问题?怎么解决?(我没接触过,所以按自己的理解就是说一个怕抢多了所以volatile保证可见性,另一个是怕同步导致抢的顺序不对所以用公平锁。但面试官说这是个分布式的问题。)
如果要自己负责组织一个app的开发,怎么去组织,流程是什么?考虑什么问题(比如协议用的是json还是xml)?
非技术性问题:
有博客吗?
参加过什么比赛?
在原本的公司收获最大是什么?
还有一些忘了。
三面感觉自己答得不好,4道手撕代码的题,其中两道不会,自己也没准备充足,面试官一开始看了我简历一眼,“深圳大学的啊”,后期也有说我做的东西不多,不过人还是很和善的,没有那种表现出来的鄙视,感觉比网上其他同学幸运了。说实话能到三面自己已经有点难以置信。问了一个一起面试同学,虽然我们一面的面试官是同一人,但是他一面就被问了算法和数据结构。感觉面试官自己的知识储备比较足,所以基本你回答什么,他都可以从你的回答里找出知识点继续问,所以个人感觉我们在回答问题的时候,可以多往自己会的方面引导。
祝愿各位面试顺利。
结果出来了,深圳Java没过,但被百度捞起来去上海做php,不想去,拒了。