- 起因
- 面试过程
- 等待offer的过程中悟道
- Java面试常考知识点个人总结
从去年百度全面冻结hc,停止社招之后,今年陆续又缩小了实习生的招聘规模,每个部门的hc都非常紧张,相应的,也直接造成了实习生和校招招聘的难度被放大!因为hc实在是太少了。
好了,闲言少叙,既然是斩获记,那么必然得说说我的面试过程和准备过程。这样才对得起标题啊。
这次面百度是现场的,一共三面,因为投的是java研发岗位,故第一面安排的是一个懂java的高工,先是自我介绍(ps:三面我介绍了三次……也是醉了),问我能研二还能实习多久……之后先让手写了个二分查找,然后顺着简历项目问,主要就是java多线程这块,内存模型,生产者和消费者模式,如何保证项目的线程安全的,怎么做的……hashmap和hashtable的比较,concurrentHashmap的线程安全的实现原理,手写一个单例模式,让写了两种实现方式,枚举和非枚举,并问了如何保证线程安全,反射攻击,序列化等。接着又手写一个链表的反转算法(稍微修改了下才对的),看我简历上有我博客,还有说熟悉JVM,就让我画了JVM的结构,堆的结构(我画的JAVA7的),最后还问了JVM垃圾回收算法的种类都有啥……接着问有没有jvm调优过?我简单说了下调优,因为调优经验不是很丰富,最后一面结束,让我问他问题,主要问的主要做啥,实习生培养制度,实习时间,这里强调下,今年百度研发很难进,名额很少很少,并且要求一定的实习时间,不然不要的……越长越好。面了半个多小时,紧接着马上就是二面经理面,ps:和我一起的还有一个来面试的,貌似是北大的,一面刷掉了。
二面大概1个小时,技术上没再细问,主要问的项目经验,还有目前实习的内容,工作情况,总之就是看你怎么自圆其说喽,没啥难度,只要是真正实习,好好做项目,回答这些应该都没问题。最后还是例行的让我问问题,我当时问了待遇,实习生培养机制,主要做啥,老生常谈。到了这一刻,我以为就算结束了,没想到,经理让我等等,他去叫他老板来……三面开始了!
三面半个多小时,竟然还是问技术,让手写了个快速排序,大小顶堆,m个元素数组找前n大的元素(不排序方法,最优),1-n自然数的数组,乱序排序(最优),后两个题回答的不是很让面试官满意,虽然也说了思路。接着就是还问了TCP三次握手,为啥三次?还有流量控制的机制,说下滑动窗口和选择重传……最后因为是java岗位,很自然的问了我期待的问题:JVM垃圾回收的过程,四类java引用作用和使用场景。技术面试到这里就算结束了,最后问实习多久了,代码量多少了,跳槽理由,对未来的规划,家是哪儿的,你和你同学比有啥优势?你认为华三,华为这样的通信企业和互联网公司有什么区别?比较下两个公司的主营业务,你认为有什么不同……最后还是例行问,你有啥想问的?我还是问了下实习待遇,培养机制,但是当时竟然忘了问是不是通过了,估计问了也白搭……
结束后,大概用了3个多小时,老板很和蔼,还怕我找不到路,亲自送我到电梯离开。整个面试期间,感觉还是很不错的,百度氛围非常棒,装修也不错,看我紧张还让我喝水……很不错。
悟道
整个过程,唯一遗憾的是从面试完到最终确定offer到手,一共等了三周+……期间经历了协调hc,hr休假……想想对自己也是一种磨砺和心性的锻炼啊!
其次这个过程还是对人心性的磨练,等过高考成绩,等过考研成绩,但是那都有确切出分的时间,有答案可以预测结果。而等待人为因素占不小比重的offer是最痛苦的,因为你不知道结果,你也不知道什么时候出结果,你不知道哪个面试官看你不爽了……这种等待非常熬人,在此我总结一个教训,就是在offer下来之前,永远不要提离职,在offer到手之前,永远不要相信任何口头承诺,只是不停的找新的工作,直到有offer攒底为止,就会消除这种等待的焦虑。
知识总结
应付算法,除了常见的二分查找,快速排序,链表判断有环,链表逆序,二叉树的三种遍历等等考察之外,就是多做做leetcode,或者总结下《剑指offer》,应付大部分的算法题足够了。ACMer直接可以忽略。其实算法的重点是必须熟练手写!
其次就是Java的基本功,主要是JavaSE的考察:
- 了解下java虚拟机的结构,重点是堆的结构,以及各部分的功能要知道,必须掌握现代Java垃圾回收算法的种类,简单调优,和分代算法的思想,了解四种Java引用类型是什么。看周志明的那本《深入理解Java虚拟机》就够了,应届生。
- 熟悉一下LRU的缓存实现原理,重点是如何实现并发,顺便梳理下操作系统的内存存储方式,各种算法,分页,分段,碎片啥的理解下。
- Java面试常考,可以互相引申的就是Java集合的知识点:hashmap和concurrentHashMap原理、区别,hashTable,hashset,各种list等,看《编程思想》结合网上博客文章总结即可。
- 熟悉下多线程设计模式,比如生产者和消费者,不变模式等。有一本日本人写的比较老的书可以看看《Java多线程设计模式》,深入的JUC并发知识最好看下《Java并发编程实践》,老外的书非常棒。并且结合操作系统课程可以梳理下进程,线程的各种知识点。
- 计算机网络,起码的几层协议要会,记住,理解tcp三次握手(具体报文格式),概念:流量控制,滑动窗口机制,选择重传等,一般应届生也就够用了,可以看下老外那本经典的《tcp/ip详解》卷一,深入可以把卷二看了,虽然我没看过。但是确实好。
- 设计模式起码掌握单例,工厂,观察者等,系统的可以看下《Head First设计模式》,应付日常工作和面试足以。设计模式这也是各个框架的考察中常考的点,重点一般就是单例的各种版本的优缺点,线程安全实现,枚举的使用,反射,序列化的攻击应对方法。工厂的类型等。
- 反射,序列化的概念
- clone的一些知识点
- 最好熟悉下类加载机制
- 框架暂时没有遇到考察的。熟悉原理最好,了解过,读过源码更好了。如果是Java大数据方向的求职,相应的就是hadoop,spark等,对应的大数据的算法也要掌握一些。
- 暂时就那么多了。