牛客大佬面经

https://www.nowcoder.com/discuss/55353?type=0&order=0&pos=17&page=3

笔试很多题目就是面试出的基础题目,语言基础、网络、数据库、linux,这些都是必考的,所以在校招之前和校招过程中,最好保持每天刷一定量的题(50起),注意查漏补缺,重点刷自己的短板。但前提是,以上书单或者相似的内容都已经学会,否则很容易在笔/面试中铩羽而归。

提升软实力:

面试是一场个人show,是对自己目前已有知识与项目的一种展示,更是对面试者的全面审查。所以不只是硬实力的比拼,也考虑个人的综合素质,也就是所谓的软实力。我认为软实力这方面主要就是每个人的情商表现了,性格方面的东西是很难取改变的,由此每个人的作风也有所区别。但是在面试过程适当的掩盖自己的锋芒与说话的技巧还是极其重要的。大体可以总结为:
(1)保持自信的姿态,相信自己能够胜任这一份工作,语言有力,连贯并富有力量感
(2)保持谦卑的态度,认可面试官的知识能力,能够坦然接受面试官的所有评价,即使是嘲讽,切忌强烈反驳(双选过程,实在不开心不外乎就不去了)
(3)适当展示自己的价值观与人生观,每个公司都喜欢找契合自己公司文化的人,所以适当展示这方面,会给面试官一种很舒服的柑橘
(4)锻炼自己的反应能力,面试问题是不可控的,面试官会问到什么问题大都是无法预测的,所以保持绝对的热情与饱满的精神状态去面对,即使遇到不懂的问题很多时候也能够凭借本身的实力与灵活的现场反应能力回答上一二,加上面试官的提示,是完全可能回答好的。
(5)专注的注意力,在面试过程中,有时候是会有前后联系的,能判断到面试官擅长或者感兴趣的内容时,可以尽量往哪方面描述,可能会有意想不到的效果。

准备笔试的技巧:

(1) 学习过程中,注意总结笔/面试会可能会问到的问题,重点研究。举个栗子,鸟哥的linux家常菜这本书通俗易懂,看过一遍,估计也就一周。推荐边看边刷题(赞一波牛客的题库),即使刷题耽误了看书时间,也能慢慢让你培养出笔试的感觉,看完了你自然而然就知道这本书哪一块是重点,哪一块过一遍即可,然后再去刷题,看面经里面出现的linux命令的题目(如果分数ok,题目也都会,那么下一本)。
(2) 笔试过程中注重归纳与总结,记录每一类高频问题,可以在牛客上先找别人列出的问题,但是一定要将每个问题研究透彻,随时对其进行补充。
(3) 算法题除了多刷图以外,可以在自己电脑上将自己平时练习的算法题目进行总结,写一些通用的小算法,例如字符串题目、数组题目,dp问题,有些问题经常只是意境变换了,实际算法还是用得上的。
一言以蔽之,多看多练多总结,笔试不能高分也会通过。
另外:如果有线下笔试,都推荐线下笔试,难度会降低。

面试的准备与技巧:

面试是一个考核的现场,在实力之外,是需要技巧来支撑的,能够掌控面试节奏与放任面试节奏绝对是两个感受。。而校招本身就是一场战役,如果大厂岗位逐年减少,而IT学生越来越多,僧多粥少,没有准备的站会输得很惨。
(1)简历问题:互联网简历最重要的就是技能树和项目,其他都是锦上添花的东西。所以写上简历的东西一定要极其熟悉,自己深入项目,考虑面试官会询问什么问题,如果面试官问到你没有考虑到的地方,可以尝试发散思维去想去说,最好不要什么都说,甚至可以说你自己理解的但是其实不太相关的东西,至少要让他知道你是考虑过项目的整体框架,内在联系,存在问题以及改进空间的。另外,在面试几次之后,项目你也介绍过几遍了,面试官可能也提出一些问题,基于这些问题,重新润色简历上的项目描述,并且重新熟悉自己介绍项目的说辞,对面试官可能提出的问题做到心中有数。
简历上的技能,对自己写的每一项做到心中有数,例如,你写上“熟悉TCP/IP协议及其编程”,那么面试官问你建立服务器的socket函数有哪些,分别什么作用,你总不能不会吧?我最开始对数据库不太熟,没有系统复习过,简历上就没写数据库,然后美团面试的时候,一直问JAVA和数据库,我都直说不会/不太熟,面试官没有过分刁难,虽然还是问了很多。
(2)面试的准备
面试之前,前面简历的问题要熟透,嚼烂已知的项目的坑,并在后面面试中慢慢补全。知识技能方面,多看面经,首先将面试岗位的高频面试题都事先熟悉,用面经上面的题目自我考核,判断自己能不能很流利地回答出来。何谓流利地说出来,就是富有条理性的,透彻的,横向纵向结合的描述。并且在看面经的过程,可以扩展的看,每个问题的延伸问题,最后都花时间去琢磨(博客是个好东西,多看)。后面我会给出我知道的C++研发高频题目。
(3)面试过程的技巧
首先如果可以现场面,推荐现场面试,优势在于能够让面试官看到你的精气神,确保面试期间精神饱满,富有交流欲,尤其和面试官保持眼神交流,让他看到你的态度,并且对于每个问题,不管会不会,多问问面试官总是没错的。这个我认为是最重要的,每次面试官问的问题,我一般都是紧盯这面试官说,我是这么考虑的,您看看对不对/我对这一块不是特别熟悉,但我是这么想的,麻烦您指点一下/对于这个问题,我们分成三部分考虑,首先…
有人说面试变成了一站到底,这是很难避免的,面试官为了追求效率,考察你是否具备他们所要的技能,那么语言基础、网络、数据库、算法、linux基础,都必须至少两三个问题,于是他们就一个一个蹦出来。这种时候,你最好要稳住节奏,表现出足够的表现欲,对擅长的问题进行扩展,深挖,让面试官意识到你在某一方面很厉害,促使他去按照你想的方向去了解。聚个栗子,面试官问是否了解linux的IO模型,我一般是这么回答的,“对于这个问题,我们首先要理解同步异步、阻塞非阻塞的概念,balabala,他们之间的区别可以类比为XXX。在理解这些之后,我们将IO模型分为五类,分别是XXX”,讲完这些估计就要五分钟,相比你不咸不谈说,有五种,是XXX,面试官不详细问它们的特点你就不说,是不是差距很大。假设我有点忘记了IO模型的分类,那么前面的铺垫是不是也可以给自己时间去回忆。我经常是在面试期间忘了某个问题的答案,于是一边打打擦边球,一边大脑快速回忆这个问题,很可能在讲着讲着就想起来了。即是你想不起来,也绝对你比支支吾吾说不了几个字强太多了。
(4)面试的心态
前面说到了,精神一定要饱满,尽可能有信心一点。当然,我觉得对于前面几次面试的同学或者手上还没有靠谱offer的同学,紧张无可避免,那么就告诉自己,上次我面到了一面,这次我只要一面过了就好,一点一点目标往上提。
面试中自己的面试尽可能不要太受面试官影响,毕竟有些面试官确实不太负责,在面试期间时不时做一点别的事情,我们要做的就是做到自己的最好,描述清晰而流利,控制语速(我中兴面试的时候自我介绍实在太熟了,说得太快,被面试官提了一下)。
非科班同学面试经常碰到的一个问题就是,你不是这个计算机专业的呀/你的专业跟我们不匹配啊。这个问题很现实也很尖锐,毕竟科班出身的人就那么多,我凭什么要你不要他们,所以你要展示的就是你得计算机技能不比别人差,你的自学能力比普通人要强,或者你做的项目比别人牛逼,或者你比别人更能坚持,语言是很无力的,即使你说了,面试官也不一定就相信,所以在后面的面试拿出实力来表现自己。放在这里是想说,首先你自己心态要摆正,非科班对面试是正buff还是负buff,重点还在面试者自己身上,大公司一般不会卡这方面,更不会因此鄙视你,所以坦然一些,用实力告诉他们我们能行。
(5)面试后的总结与再准备
面试后,最关键是什么?还是总结。很多时候其实面试完毕你就大致知道结果了,至少你知道你能够根据面试官的反馈知道你自己的缺陷在哪里,记录下来。如果可能,每天都用word或者博客进行记录,短暂时间的将重点问题记录在手机备忘录上,然后找时间将这些问题一个一个克服。我个人是将问题都分类,分类总结记录,并且查资料将问题彻底弄明白。在经历三四次这个过程之后,你应该会很赞同这样一句话:面试是提高能力的最好途径。没错,你最初的总结一般都是很片面的,或者不符合面试需求的,但是在实战几次之后,你就会明白哪里才是重点,哪里是次要的,也明白自己的优势或者擅长的地方是哪些。在知道这些之后,面试过程中,就可以尽可能的避重就轻,引导面试官往你擅长的方面去说。还是聚个栗子,腾讯面试的时候,问了我http的状态码,我当时真的完全忘记了,就说这个我记得不太清楚,但是我了解的http是应用层上的XXX,版本有http1.0 1.1 2.0,动作一般有…,为了安全会用https来代替http。这样过渡掉这个问题,引导面试官来到你说的这些问题上(当然前提是你说这些可不能不会,不然就是自己挖坑自己跳了)。
还是回归面试后的心态,面试后就尽量不要过度去考虑这一场面试通过与否,最重要的是总结和准备下一场面试。这里也适用于笔试,校招时候公司太多,每天面试笔试往往都很多,没有太多时间给你感伤或者惊喜,在没有确定秋招结束之前,这里一直都是战场,不能松懈否则你可能就输了下一场。尤其是,如果面试失败了,那种低落情绪几乎避免不了,我们要做的就是尽可能缩短这个低落时间。我一直很看重京东的面试,抱了很大的期望,面试过程中感觉也很不错,但是当天就挂了,当时表示完全理解不了,非常低落,甚至开始怀疑自己的能力。这个时候,就必须和家人朋友聊一聊,放松一下,然后重新开始(有个信念,就是这是千万人都在争的路,输了也正常,但是我们都没有退路,没有任何办法,总结总结重新开始吧)

面试过程,真的不是学习或者工程能力强就能够拿到offer的,自身软实力也极其重要。心态,反应能力,态度,甚至状态都是能否通过一场面试至关重要的因素,这些就要靠我们自己去慢慢摸索与准备。我在拿到一些offer之后,跟同学讨论过,发现挺多人存在一个问题就是:对于很平常的问题,他们表现出不知道应该怎么回答,例如专业面的你在项目过程中最大的难点是什么,怎么克服的;HR面的你怎么评价你的研究生/本科生涯等等。这些问题说白了都是情商,无关技术,但是又很影响面试官对你的看法。这些问题没有标准答案,但是,保持诚恳的态度与真实的描述(当然实现要有所准备)是总是能够拉近和面试官的距离的。

大佬面经

以C++开放举例,粗略说说笔试一般会考哪些内容:
(1) 语言基础,C++中的定义,指针,模板,多态,重载等(尤其是多态,给定一个程序,基类子类有不同实现,考虑输出结果,这一类的题目面试题也极为高频)
(2) TCP/IP协议及其编程:计算机网络基础,socket编程,其中子网划分,七层协议(例如交换机属于数据链路层一类题目),五层协议,协议名称及其作用,常用端口号,https1.0 1.1特性与区别,三次握手四次挥手(可能出现的服务器攻击),加密(对称,非对称),IO复用等
(3) 操作系统:进程通信方式(linux/windows,每种方式的特点),线程通信(linux/windows),进程与线程区别,页面置换策略(考察置换几次),进/线程状态转换图,进程调度方式,死锁(必要条件,哲学家就餐,银行家,读者写者问题),
(4) 数据库:索引作用,应该/不应该创建索引的列,索引底层实现,sql语法,常见引擎特点,事务特点,隔离级别(引擎默认级别),隔离级别的问题,锁等
(5) Linux方面:IO模型,linux常见命令(grep,awk,sed),文件系统,
(6) 智力题:智力题是大公司笔试面试很喜欢出的题目,重在考察思维能力,也是为了选出潜力更大的人来吧。我没有刷过这类题,如果自我感觉这方面有欠缺的话可以自己在牛客上刷题。
(7) 算法:剑指offer,leetcode,左神的书和视频,任意两个搞定你都没有问题
那么说说面试的硬实力。


1.语言基础(Java)

J2SE基础

  1. 九种基本数据类型的大小,以及他们的封装类。

  2. Switch能否用string做参数?

  3. equals与==的区别。

  4. Object有哪些公用方法?

  5. Java的四种引用,强弱软虚,用到的场景。

  6. Hashcode的作用。

  7. ArrayList、LinkedList、Vector的区别。

  8. String、StringBuffer与StringBuilder的区别。

  9. Map、Set、List、Queue、Stack的特点与用法。

  10. HashMap和HashTable的区别。

  11. HashMap和ConcurrentHashMap的区别,HashMap的底层源码。

  12. TreeMap、HashMap、LindedHashMap的区别。

  13. Collection包结构,与Collections的区别。

  14. try catch finally,try里有return,finally还执行么?

  15. Excption与Error包结构。OOM你遇到过哪些情况,SOF你遇到过哪些情况。

  16. Java面向对象的三个特征与含义。

  17. Override和Overload的含义去区别。

  18. Interface与abstract类的区别。

  19. Static class 与non static class的区别。

  20. java多态的实现原理。

  21. 实现多线程的两种方法:Thread与Runable。

  22. 线程同步的方法:sychronized、lock、reentrantLock等。

  23. 锁的等级:方法锁、对象锁、类锁。

  24. 写出生产者消费者模式。

  25. ThreadLocal的设计理念与作用。

  26. ThreadPool用法与优势。

  27. Concurrent包里的其他东西:ArrayBlockingQueue、CountDownLatch等等。

  28. wait()和sleep()的区别。

  29. foreach与正常for循环效率对比。

  30. Java IO与NIO。

  31. 反射的作用于原理。

  32. 泛型常用特点,List能否转为List

  33. 解析XML的几种方式的原理与特点:DOM、SAX、PULL。

  34. Java与C++对比。

  35. Java1.7与1.8新特性。

  36. 设计模式:单例、工厂、适配器、责任链、观察者等等。

  37. JNI的使用。

Java里有很多很杂的东西,有时候需要你阅读源码,大多数可能书里面讲的不是太清楚,需要你在网上寻找答案。

推荐书籍:《java核心技术卷I》《Thinking in java》《java并发编程》《effictive java》《大话设计模式》

JVM

  1. 内存模型以及分区,需要详细到每个区放什么。

  2. 堆里面的分区:Eden,survival from to,老年代,各自的特点。

  3. 对象创建方法,对象的内存分配,对象的访问定位。

  4. GC的两种判定方法:引用计数与引用链。

  5. GC的三种收集方法:标记清除、标记整理、复制算法的原理与特点,分别用在什么地方,如果让你优化收集方法,有什么思路?

  6. GC收集器有哪些?CMS收集器与G1收集器的特点。

  7. Minor GC与Full GC分别在什么时候发生?

  8. 几种常用的内存调试工具:jmap、jstack、jconsole。

  9. 类加载的五个过程:加载、验证、准备、解析、初始化。

  10. 双亲委派模型:Bootstrap ClassLoader、Extension ClassLoader、ApplicationClassLoader。

  11. 分派:静态分派与动态分派。

JVM过去过来就问了这么些问题,没怎么变,内存模型和GC算法这块问得比较多,可以在网上多找几篇博客来看看。

推荐书籍:《深入理解java虚拟机》

操作系统

  1. 进程和线程的区别。

  2. 死锁的必要条件,怎么处理死锁。

  3. Window内存管理方式:段存储,页存储,段页存储。

  4. 进程的几种状态。

  5. IPC几种通信方式。

  6. 什么是虚拟内存。

  7. 虚拟地址、逻辑地址、线性地址、物理地址的区别。

因为是做android的这一块问得比较少一点,还有可能上我简历上没有写操作系统的原因。

推荐书籍:《深入理解现代操作系统》

TCP/IP

  1. OSI与TCP/IP各层的结构与功能,都有哪些协议。

  2. TCP与UDP的区别。

  3. TCP报文结构。

  4. TCP的三次握手与四次挥手过程,各个状态名称与含义,TIMEWAIT的作用。

  5. TCP拥塞控制。

  6. TCP滑动窗口与回退N针协议。

  7. Http的报文结构。

  8. Http的状态码含义。

  9. Http request的几种类型。

  10. Http1.1和Http1.0的区别

  11. Http怎么处理长连接。

  12. Cookie与Session的作用于原理。

  13. 电脑上访问一个网页,整个过程是怎么样的:DNS、HTTP、TCP、OSPF、IP、ARP。

  14. Ping的整个过程。ICMP报文是什么。

  15. C/S模式下使用socket通信,几个关键函数。

  16. IP地址分类。

  17. 路由器与交换机区别。

网络其实大体分为两块,一个TCP协议,一个HTTP协议,只要把这两块以及相关协议搞清楚,一般问题不大。

推荐书籍:《TCP/IP协议族》

数据结构与算法

  1. 链表与数组。

  2. 队列和栈,出栈与入栈。

  3. 链表的删除、插入、反向。

  4. 字符串操作。

  5. Hash表的hash函数,冲突解决方法有哪些。

  6. 各种排序:冒泡、选择、插入、希尔、归并、快排、堆排、桶排、基数的原理、平均时间复杂度、最坏时间复杂度、空间复杂度、是否稳定。

  7. 快排的partition函数与归并的Merge函数。

  8. 对冒泡与快排的改进。

  9. 二分查找,与变种二分查找。

  10. 二叉树、B+树、AVL树、红黑树、哈夫曼树。

  11. 二叉树的前中后续遍历:递归与非递归写法,层序遍历算法。

  12. 图的BFS与DFS算法,最小生成树prim算法与最短路径Dijkstra算法。

  13. KMP算法。

  14. 排列组合问题。

  15. 动态规划、贪心算法、分治算法。(一般不会问到)

  16. 大数据处理:类似10亿条数据找出最大的1000个数………等等

算法的话其实是个重点,因为最后都是要你写代码,所以算法还是需要花不少时间准备,这里有太多算法题,写不全,我的建议是没事多在OJ上刷刷题(牛客网、leetcode等),剑指offer上的算法要能理解并自己写出来,编程之美也推荐看一看。

推荐书籍:《大话数据结构》《剑指offer》《编程之美》

Android

  1. Activity与Fragment的生命周期。

  2. Acitivty的四中启动模式与特点。

  3. Activity缓存方法。

  4. Service的生命周期,两种启动方法,有什么区别。

  5. 怎么保证service不被杀死。

  6. 广播的两种注册方法,有什么区别。

  7. Intent的使用方法,可以传递哪些数据类型。

  8. ContentProvider使用方法。

  9. Thread、AsycTask、IntentService的使用场景与特点。

  10. 五种布局: FrameLayout 、 LinearLayout 、 AbsoluteLayout 、 RelativeLayout 、 TableLayout 各自特点及绘制效率对比。

  11. Android的数据存储形式。

  12. Sqlite的基本操作。

  13. Android中的MVC模式。

  14. Merge、ViewStub的作用。

  15. Json有什么优劣势。

  16. 动画有哪两类,各有什么特点?

  17. Handler、Loop消息队列模型,各部分的作用。

  18. 怎样退出终止App。

  19. Asset目录与res目录的区别。

  20. Android怎么加速启动Activity。

  21. Android内存优化方法:ListView优化,及时关闭资源,图片缓存等等。

  22. Android中弱引用与软引用的应用场景。

  23. Bitmap的四中属性,与每种属性队形的大小。

  24. View与View Group分类。自定义View过程:onMeasure()、onLayout()、onDraw()。

  25. Touch事件分发机制。

  26. Android长连接,怎么处理心跳机制。

  27. Zygote的启动过程。

  28. Android IPC:Binder原理。

  29. 你用过什么框架,是否看过源码,是否知道底层原理。

  30. Android5.0、6.0新特性。

Android的话,多是一些项目中的实践,使用多了,自然就知道了,还有就是多逛逛一些名人的博客,书上能讲到的东西不多。另外android底层的东西,有时间的话可以多了解一下,加分项。

推荐书籍:《疯狂android讲义》《深入理解android》

其他综合性的书籍也需要阅读,推荐:《程序员面试笔试宝典》《程序员面试金典》。另外“牛客网www.newcoder.com”是个好地方,里面有各种面试笔试题,也有自己在线的OJ,强烈推荐,还有左程云老师的算法视屏课(已经出书了),反正我看了之后对我帮助很大(这不是植入广告)。

三、 项目

关于项目,这部分每个人的所做的项目不同,所以不能具体的讲。项目不再与好与不好,在于你会不会包装,有时候一个很low的项目也能包装成比较高大上的项目,多用一些专业名词,突出关键字,能使面试官能比较容易抓住重点。在聊项目的过程中,其实你的整个介绍应该是有一个大体的逻辑,这个时候是在考验你的表达与叙述能力,所以好好准备很重要。

面试官喜欢问的问题无非就几个点:

  1. XXX(某个比较重要的点)是怎么实现的?

  2. 你在项目中遇到的最大的困难是什么,怎么解决的?

  3. 项目某个部分考虑的不够全面,如果XXXX,你怎么优化?

  4. XXX(一个新功能)需要实现,你有什么思路?

其实你应该能够预料到面试官要问的地方,请提前准备好,如果被问到没有准备到的地方,也不要紧张,一定要说出自己的想法,对不对都不是关键,主要是有自己的想法,另外,你应该对你的项目整体框架和你做的部分足够熟悉。
四、 其他

你应该问的问题

面试里,最后面完之后一般面试官都会问你,你有没有什么要问他的。其实这个问题是有考究的,问好了其实是有加分的,一般不要问薪资,主要应该是:关于公司的、技术和自身成长的。

以下是我常问的几个问题,如果需要可以参考:

  1. 贵公司一向以XXX著称,能不能说明一下公司这方面的特点?

  2. 贵公司XXX业务发展很好,这是公司发展的重点么?

  3. 对技术和业务怎么看?

  4. 贵公司一般的团队是多大,几个人负责一个产品或者业务?

  5. 贵公司的开发中是否会使用到一些最新技术?

  6. 对新人有没有什么培训,会不会安排导师?

  7. 对Full Stack怎么看?

  8. 你觉得我有哪些需要提高的地方?

知识面

除了基础外,你还应该对其他领域的知识有多少有所涉猎。对于你所熟悉的领域,你需要多了解一点新技术与科技前沿,你才能和面试官谈笑风生。

软实力

什么是软实力,就是你的人际交往、灵活应变能力,在面试过程中,良好的礼节、流畅的表达、积极的交流其实都是非常重要的。很多公司可能不光看你的技术水平怎么样,而更看重的是你这个人怎么样的。所以在面试过程中,请保持诚信、积极、乐观、幽默,这样更容易得到公司青睐。

很多时候我们都会遇到一个情况,就是面试官的问题我不会,这时候大多数情况下不要马上说我不会,要懂得牵引,例如面试官问我C++的多态原理,我不懂,但我知道java的,哪我可以向面试官解释说我知道java的,类似的这种可以往相关的地方迁移(但是需要注意的是一定不要不懂装懂,被拆穿了是很尴尬的),意思就是你要尽可能的展示自己,表现出你的主动性,向面试官推销自己。

还有就是遇到智力题的时候,不要什么都不说,面试官其实不是在看你的答案,而是在看你的逻辑思维,你只要说出你自己的见解,有一定的思考过程就行。


2语言基础(C++)
(1) 指针和引用的区别
(2) 堆和栈的区别
(3) new和delete是如何实现的,new 与 malloc的异同处
(4) C和C++的区别
(5) C++、Java的联系与区别,包括语言特性、垃圾回收、应用场景等(java的垃圾回收机制)
(6) Struct和class的区别
(7) define 和const的区别(编译阶段、安全性、内存占用等)
(8) 在C++中const和static的用法(定义,用途)
(9) const和static在类中使用的注意事项(定义、初始化和使用)
(10)C++中的const类成员函数(用法和意义)
(11) 计算下面几个类的大小:
class A {};: sizeof(A) = 1;
class A { virtual Fun(){} };: sizeof(A) = 4(32位机器)/8(64位机器);
class A { static int a; };: sizeof(A) = 1;
class A { int a; };: sizeof(A) = 4;
class A { static int a; int b; };: sizeof(A) = 4;
(12) 给一个代码,求输出结果
class A
{
public:
A(int x){}
}
问:A a = 1;是否正确, 如果正确, 那么它调用了哪些函数?
这类题目更常见的是在基类和子类有不同实现方法。(虚函数相关,栗子很多,不多说了)
(13) C++的STL介绍(这个系列也很重要,建议侯捷老师的这方面的书籍与视频),其中包括内存管理allocator,函数,实现机理,多线程实现等
(14) STL源码中的hash表的实现
(15) STL中unordered_map和map的区别
(16) STL中vector的实现
(17) vector使用的注意点及其原因,频繁对vector调用push_back()对性能的影响和原因。
(18) C++中的重载和重写的区别:
(19) C ++内存管理(热门问题)
(20) 介绍面向对象的三大特性,并且举例说明每一个。
(21) 多态的实现(和下个问题一起回答)
(22) C++虚函数相关(虚函数表,虚函数指针),虚函数的实现原理(热门,重要)
(23) 实现编译器处理虚函数表应该如何处理
(24) 析构函数一般写成虚函数的原因
(25) 构造函数为什么一般不定义为虚函数
(26) 构造函数或者析构函数中调用虚函数会怎样
(27) 纯虚函数
(28) 静态绑定和动态绑定的介绍
(29) 引用是否能实现动态绑定,为什么引用可以实现
(30) 深拷贝和浅拷贝的区别(举例说明深拷贝的安全性)
(31) 对象复用的了解,零拷贝的了解
(32) 介绍C++所有的构造函数
(33) 什么情况下会调用拷贝构造函数(三种情况)
(34) 结构体内存对齐方式和为什么要进行内存对齐?
(35) 内存泄露的定义,如何检测与避免?
(36) 手写实现智能指针类(34-37我没遇见过)
(37) 调试程序的方法
(38) 遇到coredump要怎么调试
(39) 内存检查工具的了解
(40) 模板的用法与适用场景
(41) 成员初始化列表的概念,为什么用成员初始化列表会快一些(性能优势)?
(42) 用过C11吗,知道C11新特性吗?(有面试官建议熟悉C11)
(43) C++的调用惯例(简单一点C++函数调用的压栈过程)
(44) C++的四种强制转换
2计算机网络(TCP/IP)
(1) 建立TCP服务器的各个系统调用
(2) 继上一题,说明socket网络编程有哪些系统调用?其中close是一次就能直接关闭的吗,半关闭状态是怎么产生的?
(3) 对路由协议的了解与介绍。内部网关协议IGP包括RIP,OSPF,和外部网关协议EGP和BGP.
(4) 路由协议所使用的算法。
(5) TCP和UDP的区别
(6) TCP和UDP相关的协议与端口号
(7) TCP(UDP,IP)等首部的认识(http请求报文构成)
(8) 网页解析的过程与实现方法
(9) 在浏览器中输入URL后执行的全部过程(如www.baidu.com)
(10) 网络层分片的原因与具体实现
(11) TCP的三次握手与四次挥手的详细介绍(TCP连接建立与断开是热门问题)
(12) TCP握手以及每一次握手客户端和服务器端处于哪个状态(11种状态)
(13) 为什么使用三次握手,两次握手可不可以?
(14) TIME_WAIT的意义(为什么要等于2MSL)
(15) 超时重传机制(不太高频)
(16) TCP怎么保证可靠性(面向字节流,超时重传,应答机制,滑动窗口,拥塞控制,校验等)?
(17) 流量控制的介绍,采用滑动窗口会有什么问题(死锁可能,糊涂窗口综合征)?
(18) tcp滑动窗口协议
(19) 拥塞控制和流量控制的区别
(20) TCP拥塞控制,算法名字?(极其重要)
(21) http协议与TCP联系
(22) http/1.0和http/1.1的区别
(23) http的请求方法有哪些?get和post的区别。
(24) http的状态码
(25) http和https的区别,由http升级为https需要做哪些操作
(26) https的具体实现,怎么确保安全性
(27) http中浏览器一个URL的流程,这个过程中浏览器做了什么,URL包括哪三个部分?
(28) 一个机器能够使用的端口号上限是多少,为什么?可以改变吗?那如果想要用的端口超过这个限制怎么办?
(29) 对称密码和非对称密码体系
(30) 数字证书的了解(高频)
(31) 客户端为什么信任第三方证书
(32) RSA加密算法,MD5原理(MD5不算加密算法)
(33) 单条记录高并发访问的优化
(34) 介绍一下ping的过程,分别用到了哪些协议
(35) TCP/IP的分片粘包过程
(36) 有没有抓过TCP包,描述一下
(37) 一个ip配置多个域名,靠什么识别?
(38) 服务器攻击(DDos攻击)
3数据库(MySQL)
数据库我自身不是特别熟,面试的时候一般也都坦言了,所以面试官都只是问一些基础题目。
(1) 关系型和非关系型数据库的区别(各自优点)
(2) 常用SQL语句(DDL,DML,DCL,TCL)
(3) 数据库中join的类型与区别(inner join, outer join, cross join, natural join, self join),注意适用场景和sql语句的编写
(4) 数据库的索引类型
(5) 聚集索引和非聚集索引的区别(叶节点存储内容)
(6) 唯一性索引和主码索引的区别
(7) 索引的优缺点,什么时候使用索引,什么时候不能使用索引(重点)
(8) 索引的底层实现(B+树,为何不采用红黑树,B树)
(9) B树和B+树具体实现
(10) 索引最左前缀问题
(11) Mysql的优化(高频,索引优化,性能优化)
(12) 数据库引擎介绍,innodb和myisam的特点与区别
(13) 数据库中事务的ACID(四大特性都要能够举例说明,理解透彻,比如原子性和一致性的关联,隔离性不好会出现的问题)
(14) 数据库隔离性设置不同会出现的问题(脏读、不可重复读、丢失修改、幻读)
(15) 数据库的隔离级别,mysql和Oracle的隔离级别分别是什么
(16) 数据库连接池的作用
(17) Mysql的表空间方式,各自特点
(18) 分布式事务
(19) 数据库的范式
(20) 数据的锁的种类,加锁的方式
(21) 视图的作用与使用方法(如何删除等)
(22) 分库分表,主从复制,读写分离。(我不会,也没碰到过)
(23) 项目中哪里用到了数据库,怎么用的
4Linux基础
Linux这一块如果不太熟,可以直接说,但是因为开发岗位一般都是在Linux平台下的,所以几个基础问题还是要会的。
(1) Linux的I/O模型介绍以及同步异步阻塞非阻塞的区别(超级重要)
(2) 文件系统的理解(EXT4,XFS,BTRFS)
(3) 文件处理grep,awk,sed这三个命令必知必会
(4) IO复用的三种方法(select,poll,epoll)深入理解,包括三者区别,内部原理实现?
(5) Epoll的ET模式和LT模式(ET的非阻塞)
(6) 查询进程占用CPU的命令(注意要了解到used,buf,cache代表意义)
(7) linux的其他常见命令(kill,find,cp等等)
(8) shell脚本用法
(9) 硬连接和软连接的区别
(10) 文件权限怎么看(rwx)
(11) 文件的三种时间(mtime, atime,ctime),分别在什么时候会改变
(12) Linux监控网络带宽的命令,查看特定进程的占用网络资源情况命令
5操作系统
(1) 进程与线程的区别和联系
(2) 一个进程可以创建多少线程,和什么有关
(3) 一个程序从开始运行到结束的完整过程(四个过程)
(4) 进程通信方法(Linux和windows下),线程通信方法(Linux和windows下)
(5) 进程调度方法详细介绍
(6) 页面置换方法详细介绍
(7) 能否实现一个LRU算法
(8) 死锁的必要条件(怎么检测死锁,解决死锁问题)
(9) 哲学家就餐,银行家,读者写者,生产者消费者(怎么加锁解锁,伪代码)
(10) 海量数据的bitmap使用原理
(11) 布隆过滤器原理与优点
(12) 布隆过滤器处理大规模问题时的持久化,包括内存大小受限、磁盘换入换出问题
(13) 同步IO和异步IO
(14) 文件读写使用的系统调用
(15) 线程池的了解、优点、调度处理方式和保护任务队列的方式
(16) 怎么回收线程
(17) 僵尸进程问题
(18) 多线程同步(尤其是如果项目中用到了多线程,很大可能会结合讨论)
(19) memcache了解
(20) 异常和中断的区别
(21) 一般情况下在Linux/windows平台下栈空间的大小

6设计模式和算法
设计模式一般都不会考太多,除非你明确说自己懂。我基本上就不涉及到设计模式的东西,所以只是简要说说。当然,单例模式和简单工厂模式的概念和使用场景还是要知道的。
(1) 介绍熟悉的设计模式(单例,简单工厂模式)
(2) 写单例模式(饿汉模式和懒汉模式),线程安全版本
(3) MVC设计模式
算法这一块太过庞大,几乎都有可能,牛油们最好还是去刷剑指offer(level 1),leetcode(如果能够刷到最高难度,算法对你来说已经不是什么了,或者说面试对你来说简直就是吃饭喝水的难度),左神的书《程序源代码面试指南》(字符串,数组,dp,海量数据问题,搞定它们也就搞定面试的一半)。
下面还是简单的列举一些吧(包括一些数据结构题目,只列举简单的,面试的算法一半不会太难,但是现在一般都是需要比较好的思维,或者曾经接触过这方面的题,建议就是多刷题,做题感觉是刷出来的)
(1) 红黑树的了解(平衡树,二叉搜索树),使用场景
(2) 红黑树在STL上的应用
(3) 了解并查集吗?(低频)
(4) 贪心算法和动态规划的区别
(5) 判断一个链表是否有环,如何找到这个环的起点
(6) 实现一个strcpy函数(或者memcpy),如果内存可能重叠呢
(7) 实现一个循环队列
(8) 排序算法(写快排,归并排序,堆排序),算法的时间复杂度,空间复杂度,是否稳定等
(9) 快排存在的问题,如何优化
(10) 反转一个链表
(11) Top K问题(可以采取的方法有哪些,各自优点?)
(12) Bitmap的使用,存储和插入方法
(13) 二叉树的先序、中序、后序遍历(非递归实现)
(14) 二叉树的公共祖先(简单地说,剑指offer上的题大都是高频题)
(15) 1-n中有多少个1
(16) 字典树的理解以及在统计上的应用
(17) 数组的全排列
(18) N个骰子出现和为m的概率
(19) 海量数据问题(可参考左神的书)
(20) 一致性哈希
7智力题
我特别把智力题单独拿出来讲,是因为这一块其实有些公司很看重(例如腾讯),但是我基本上也没刷过这类题目,接触不多,牛油们自行补充吧。
(1) 100层楼,只有2个鸡蛋,想要判断出那一层刚好让鸡蛋碎掉,给出策略(滴滴笔试中两个铁球跟这个是一类题)
(2) 毒药问题,n拼毒药,要快速找出哪一瓶有毒,需要几只小白鼠
(3) 博弈论问题
(4) 先手必胜策略问题:n本书,每次能够拿X-X本,怎么拿必胜
(5) 放n只蚂蚁在一条树枝上,蚂蚁与蚂蚁之间碰到就各自往反方向走,问总距离或者时间。
(6) 瓶子换饮料问题:多少个瓶子能够换1瓶饮料,问最多能喝几瓶

坚持原创技术分享,您的支持将鼓励我继续创作!