面经面试基本流程
Posted SYF
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了面经面试基本流程相关的知识,希望对你有一定的参考价值。
写在前面
和别的行业不同
计算机行业是一个继续把面试经常列入行程的行业,即便不打算转行
也必须多去几家公司去面试了解现在的行情,不然坐久了技术便会落后
所以请各位同学务必重视
本页博客会不断完善,大家可以当做在此模拟练习的地方
面试流程
第一阶段:投简历
这个大家上招聘网站上投就行啦,就不用教了
当然由于博主经验还很少,简历怎么写,仅仅给几个要点
【1】推荐平台:牛客网,力扣,前程无忧,猎聘,智联,拉钩
【2】计算机的简历和别的行业不同,是可以反应学习成果的,自己在下班或者课下学了什么技术只管网上写,配合自己的实战经验作为证明更好
【3】照片一定要好看,正所谓人要衣装,佛要金装嘛,个人推荐在天之蓝拍
【4】例如参加学生会,歌唱比赛这些乱七八糟的别往上写,不仅没用还会减分
【5】简历可以润色但务必真实,不可瞎编乱造,不要把公司当傻瓜,人家会做背调的,吹牛吹过头了肯定会穿帮
第二阶段:简历筛选通过
这时候会有三种面试:电话面试,共享桌面远程面试、现场面试
电话面试
顾名思义,电话面试是面试官以打电话的形式考查应聘者。
优势:
【1】对于社恐的同学比较友好,看不到真人
【2】问问题不会过于深奥,毕竟电话里很多事情说不清楚
【3】不用出远门
考点:
【1】容易突然袭击,造成在不方便接电话的时候面试
【2】没有肢体语言,对语言的表述要求较高
【3】如果有外语面试,会增加外语听力的难度
提示:
【1】应聘者在电话面试的时候应尽可能用形象的语言把细节说清楚。
【2】如果在英语面试时没有听清或没有听懂面试官的问题,则应聘者要敢于说Pardon,当然中文也是一个道理,不要害怕提问,面试官不会吃人,如果会那种公司也没必要去。
共享桌面远程面试
共享桌面远程面试是指利用一些共享桌面的软件(如微软的Skype、思科的WebEx等),应聘者把自己电脑的桌面共享给远程的面试官。
优势:
【1】对于社恐的同学比较友好,不用脸对脸
【2】可以在自己熟悉的环境下进行面试
【3】不用出远门
【4】一般是大公司才有
考点:
【1】思考清楚再开始敲代码,不要一下笔就做,这个所有的考试都有
【2】为了让面试官留下好印象,要有良好的命名习惯
【3】能够进行单元测试,能做到测试在前开发在后的程序员,那基本上面试官得跪下叫爸爸了【开个玩笑哈】
【4】所有的代码都不可能一帆风顺,哪怕照抄也一样,如果偶尔有,那是老天的恩惠【本人就有过一次哈哈】,写代码遇到问题后程序员的反应能力,这些书上是学不到的,只有实战才会懂
提示:
【1】在共享桌面远程面试过程中,面试官最关心的是应聘者的编程习惯及调试能力。
现场面试
优势
【1】对于擅长社交的同学来说,这个难度不会很高
【2】对于颜值高的同学【当然我不是】,这也是个加分项哈哈哈
考点【下节讨论】
现场面试是整个面试流程中的重头戏。由于是坐在面试官的对面,应聘者的一举一动都看在面试官的眼里。面试官通过应聘者的语言和行动考查他的沟通能力、学习能力、编程能力等综合实力。
提示:
【1】规划好着装得体出行路线和时间,千万不要迟到,你想想看面试都迟到,上班不得天天迟到早退呀
【2】注意面试流程,有时候面试是挺漫长的要持续几个小时,建议带一些提神的装备
【3】事先准备好几个问题,有些面试官会在最后让你问问还有没有什么问题需要咨询的,一般是薪资,五险一金之类的,当然大厂可能不同,以后再补充吧
第三阶段:现场面试的三个环节
基本面试环节
时间:5—10分钟
内容:
【1】应聘者的性格特点
【2】深入了解简历中的项目经历【可以事先准备好】
【3】技术问题一般不涉及
【4】自我介绍30s-60s【可以事先准备好,主要是学习和工作经历】,注意没用的经历【学校里做志愿者,学生会之类的的少说,面试官不是跟你唠家常】
提示:这段时间可以调整自己的情绪,让自己进入状态
拓展:面试官深入追问
【1】应聘者的项目经验
可以从以下四个方面介绍【STAR】
Situation:简短的项目背景。【这里内容比较少】
Task:自己完成的任务。【这里务必详细,面试官会不停地追问,别只写了几行代码就说自己负责的,一个不诚信的人找工作基本不可能成功】
Action:为完成任务自己做了哪些工作,是怎么做的。
Result:自己的贡献。【这方面也最好具体,最好能用数字加以说明,参与开发功能,则可以说暗示完成了多少功能,如果做优化,可以说性能提高百分比多少,如果修BUG可以说修改了多少BUG】
如果在应聘者的简历中上述4类信息还不够清晰,则面试官可能会追问相关的问题。除此之外,面试官针对项目经验最常问的问题包括如下几个类型:
- 你在该项目中碰到的最大问题是什么,你是怎么解决的?
- 从这个项目中你学到了什么?
- 什么时候会和其他团队成员(包括开发人员、测试人员、设计人员、项目经理等)有什么样的冲突,你们是怎么解决冲突的?
因此在准备简历的时候最好把这些问题都说清楚
【2】应聘者掌握的技能
可以给大家一些简历术语
了解:上过课看过书,没有项目经验
熟悉:实战项目中适用某项技术已经有较长的时间,通过查阅文档可以解决大部分问题
精通:无论什么人问问题都能回答,能够回答同学或者同事的绝大多数问题
【3】为什么跳槽
这个时候是说漂亮话的时候,这个大家都能自己编了,就不多写了
规避以下几个原因:老板太苛刻,同事难相处,加班太频繁,工资太低廉
推荐原因:想挑战更有挑战性的工作
技术面试环节
时间:40-50分钟【重头戏】
内容:
【1】基础知识扎实全面,包括编程语言、数据结构、算法等
【2】能写出正确的、完整的、鲁棒的高质量代码【注意特殊输入】
【3】能思路清晰地分析、解决复杂问题
【4】能从时间、空间复杂度两方面优化算法效率
【5】具备优秀的沟通能力、学习能力、发散思维能力等
这些内容都可以做足准备
最简单的就是去刷LeetCode,牛客网之类的
可能有同学认为面试官不要你可能是因为性格不适合,态度不够诚恳,其实大家都是程序员,都是直来直去的,他们只认题目做不做的对
如果题目简单了但是被拒了,十有八九就是代码没写好
往往越简单,面试官给出的数据越刁钻
但如果有些问题比较复杂,面试官就会考虑面试者能否在很短的时间里给出清晰地思路,因为如果要求面试者在很短的时间里解决很复杂的问题着实有些强人所难
所以这个时候不要惧怕做不出来,要让自己能否给出一个完整地思路
另外往往你做出来以后面试官会提醒你有更好的办法,不要放弃思考,毕竟我们编程序就像造武器,最终就是为了火力又猛又轻巧
最后就是软技能
很多同学看我置顶首页会发现我考法考,学辩论,这其实就是练一下嘴,增加点社交能力
毕竟现在是团伙作案,三个臭皮匠顶个诸葛亮
另外也要不断增强自己的学习能力,毕竟计算机行业更新迭代太快了
应聘者提问
时间:5-10分钟
要点:
【1】这里可以事先准备好,因为这往往是最后的环节
【2】如果操作得好这里是加分项
【3】和自己的职位有关
【4】不要问薪水【不是说全程不问,技术面试的时候不要问】
【5】不要打听面试结果
推荐问题:
【1】与应聘岗位和项目相关【建议在面试前就做足功课】
【2】注意面试官介绍的时候说的话,往往可以成为提问的要点
第四阶段:收尾工作
不管成功不成功,相见即是缘分,即便最终不成功也要注意基本的礼貌,毕竟做什么都是先做人
艾跃进教授说过,一切失败都是因为做人的失败
成功了不要狂喜过头【免得入职以后给你加工作】
失败了也不要过分沮丧甚至骂街【这样会无形中影响下一次面试】
咱们要努力告诉面试官,不留爷是你的损失哈哈哈
模拟实战
基本面试环节
java集合框架:
【Q】介绍一下java的集合框架
【A】
集合框架分为三块:List列表、Set集合、Map映射
【1】List列表在数据结构上可以被看做线性表,常用的有ArrayList和LinkList(不常用的有Vector(类似于ArrayList)),他们的底层存储结构有所不同,一个是数组,一个是链表;这两个是注重数据存储结构的区分和数据结构数据操作方法上的区分,也就是栈和队列;即Stack和Queue,Stack是一个继承了Vector的类,Queue是一个继承于Collection的接口(因为队列可以分很多种),LinkedList实现了Deque接口,Deque继承了Queue接口,常用的有ArrayBlockingQueue(基于数组),LinkedBlockingQueue(基于链表),PriorityBlockingQueue(实现优先级排序)等。
【2】Map是一种映射,用于存储关系型数据,保存着两种值,一组用于保存key,另外一组用于保存valeu,并且key不能重复。\\
【3】Set集合,存储的元素不能重复,其通过equals的方法,来判断元素是否重复;
【Q】HashMap遇见哈希冲突会如何怎么办?
【A】通过在数组中创建一个链表,来解决哈希冲突
【Q】HashMap是线程安全的吗?
【A】不是
【Q】HashMap在高并发下会有什么问题?
【A】死循环,丢数据
【Q】然后引入ConcurrentHashMap的原理?
【Q】Hahtable和concurrentHashMap的区别?
【Q】数组和ArrayList的区别?
【Q】Arraylist是如何扩容的?
【Q】线程池中的阻塞队列一般会选择哪种队列?为什么?
【Q】RetreenLock的原理?
【Q】AQS的原理?
【Q】HashMap的容量为什么推荐是2的幂次方?
框架类:
【Q】mybatis的二级缓存有什么问题?
【A】mybatis二级缓存对于细粒度的数据级别的缓存实现不好
【Q】mybaits中的mapper的#和$有什么区别?哪种可以防止sql注入?
【Q】我们知道mybatis的mapper和接口之间是没有对象的,那么它是如何映射的?
【Q】说说springmvc的注解有哪些?他们的原理是什么?
【Q】springmvc的控制器是单例的吗?是线程安全的吗?
【A】不是,多线程访问下,有安全问题
【Q】struts1和struts2的区别?是线程安全的吗?
【A】
1、Action 类:
Struts1要求Action类继承一个抽象基类。Struts1的一个普遍问题是使用抽象类编程而不是接口。
Struts 2 Action类可以实现一个Action接口,也可实现其他接口,使可选和定制的服务成为可能。Struts2提供一个ActionSupport基类去实现 常用的接口。Action接口不是必须的,任何有execute标识的POJO对象都可以用作Struts2的Action对象。
2、线程模式:
Struts1 Action是单例模式并且必须是线程安全的,因为仅有Action的一个实例来处理所有的请求。单例策略限制了Struts1 Action能作的事,并且要在开发时特别小心。Action资源必须是线程安全的或同步的。
Struts2 Action对象为每一个请求产生一个实例,因此没有线程安全问题。(实际上,servlet容器给每个请求产生许多可丢弃的对象,并且不会导致性能和垃圾回收问题)
3、Servlet 依赖:
Struts1 Action 依赖于Servlet API ,因为当一个Action被调用时HttpServletRequest 和 HttpServletResponse 被传递给execute方法。
Struts 2 Action不依赖于容器,允许Action脱离容器单独被测试。如果需要,Struts2 Action仍然可以访问初始的request和response。但是,其他的元素减少或者消除了直接访问HttpServetRequest 和 HttpServletResponse的必要性。
【Q】spring如何解析它的xml文件?
【Q】spring的核心是什么?Aop的原理是什么?
redis相关:
【Q】redis数据类型有哪些?
【Q】zset数据类型是如何排序的?
【Q】redis如何做项目的中间缓存层?
【Q】redis的Hash的时间复杂度是多少?
数据库:
【Q】数据库索引分为哪几种?组合索引有什么要注意的问题?
【Q】什么是悲观锁 什么是乐观锁?如何实现悲观锁?
【Q】数据库关键字的执行顺序是什么?
【Q】如何进行sql优化?
【Q】有没有进行过分库分表操作?分库之后如何保持事务一致?
分布式和微服务:
【Q】微服务要克服那些问题?微服务系统是怎样通信的?
【Q】分布式环境下如何解决session不一致的问题?
【Q】分布式下如何保证id一致?
【Q】你在dubbo的使用过程中遇到什么问题?
【Q】zookeeper的负载均衡算法有哪些?
jdk源码相关
【Q】synchronized的原理?它该怎么用?
【Q】如何一个方法是synchronized的,其他的非synchronzied线程能进入吗?
【Q】cvs中的ABA问题如何解决?
【Q】volatile的原理是什么?volatile一定是线程安全的吗?
【Q】ThreadLocal是什么?它的原理是什么?
【Q】CountDowanLatch有没有用过?适合在什么样的场景下用?
设计模式相关:
【Q】实现两种单例模式
【Q】讲一下观察者模式
【Q】spring中都用到哪些设计模式?
【Q】动态代理模式是如何实现的?
算法相关:
【Q】快速排序的时间复杂度?手写快速排序(注意递归式和非递归式的实现方式)
【Q】手写二分查找
【Q】手写堆排序
【Q】一个int数组如何进行奇数和偶数分离?
【Q】用算法实现String转double
jvm相关:
【Q】jvm的垃圾回收算法有哪些?分别解释一下?
【A】
标记-清除、复制、标记-整理和分代收集。
【1】标记-清除算法
从算法的名称上可以看出,这个算法分为两部分,标记和清除。首先标记出所有需要被回收的对象,然后在标记完成后统一回收掉所有被标记的对象。
这个算法简单,但是有两个缺点:一是标记和清除的效率不是很高;二是标记和清除后会产生很多的内存碎片,导致可用的内存空间不连续,当分配大对象的时候,没有足够的空间时不得不提前触发一次垃圾回收。
【2】复制算法
这个算法将可用的内存空间分为大小相等的两块,每次只是用其中的一块,当这一块被用完的时候,就将还存活的对象复制到另一块中,然后把原已使用过的那一块内存空间一次回收掉。这个算法常用于新生代的垃圾回收。
复制算法解决了标记-清除算法的效率问题,以空间换时间,但是当存活对象非常多的时候,复制操作效率将会变低,而且每次只能使用一半的内存空间,利用率不高。
【3】标记-整理算法
这个算法分为三部分:一是标记出所有需要被回收的对象;二是把所有存活的对象都向一端移动;三是把所有存活对象边界以外的内存空间都回收掉。
标记-整理算法解决了复制算法多复制效率低、空间利用率低的问题,同时也解决了内存碎片的问题。
【4】分代收集算法
根据对象生存周期的不同将内存空间划分为不同的块,然后对不同的块使用不同的回收算法。一般把Java堆分为新生代和老年代,新生代中对象的存活周期短,只有少量存活的对象,所以可以使用复制算法,而老年代中对象存活时间长,而且对象比较多,所以可以采用标记-清除和标记-整理算法。
【Q】新生代为什么要设置两个survior区?
【A】设置两个Survivor区最大的好处就是解决了碎片化
【Q】如何通过一个.class文件获取它的jdk版本?
【A】javap -verbose classname(一定要是class文件)
【Q】jvm的内存模型?哪些是线程私有的?哪些是公共的?
【A】
详解 JVM 内存模型
JVM 内存模型主要指运行时的数据区,包括 5 个部分,如下图所示
栈也叫方法栈,是线程私有的,线程在执行每个方法时都会同时创建一个栈帧,用来存储局部变量表、操作栈、动态链接、方法出口等信息。调用方法时执行入栈,方法返回时执行出栈。
本地方法栈与栈类似,也是用来保存线程执行方法时的信息,不同的是,执行 Java 方法使用栈,而执行 native 方法使用本地方法栈。
程序计数器保存着当前线程所执行的字节码位置,每个线程工作时都有一个独立的计数器。程序计数器为执行 Java 方法服务,执行 native 方法时,程序计数器为空。
栈、本地方法栈、程序计数器这三个部分都是线程独占的。
堆是JVM管理的内存中最大的一块,堆被所有线程共享,目的是为了存放对象实例,几乎所有的对象实例都在这里分配。当堆内存没有可用的空间时,会抛出OOM异常。根据对象存活的周期不同,JVM把堆内存...
方法区也是各个线程共享的内存区域,又叫非堆区。用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据,JDK1.7中的永久代和JDK1.8中的Metaspace都是...
其他:
【Q】秒杀场景如何削峰?
【A】
【1】对于秒杀业务这样的高并发业务场景,最基本的原则就是要将请求拦截在系统的上游,降低下游的压力。如果不在前端拦截,就很可能会造成数据库读写锁冲突,甚至导致死锁,最终还有可能出现服务宕机的结果。
【2】划分好动静资源,静态资源使用CDN进行服务分发,提高访问性能。
【3】充分利用缓存(Redis等),增加QPS,从而加大整个集群的吞吐量。
【4】高峰流量是压垮系统的一个重要原因,所以需要Kafka等消息队列在一端承接瞬时的流量洪峰,在另一端平滑地将消息推送出去。
【Q】http和udp的区别是什么?
【A】
1. 连接类型:TCP是面向连接的协议,要传输数据必须先进行连接,就是常说的“三次握手”,握手成功建立连接之后才能进行数据的传输交互,如同微信视频聊天需要对方接受才能彼此看到。UDP是非面向连接的协议,发送数据时不管对方状态直接发送,无需建立连接,如同微信发送一个消息或者语音信息,对面在不在线无所谓。
2. 传输开销: 由于二者特性的差异,TCP在传输数据过程中,接收方接收数据包时也会向发送方反馈数据包,因为会造成额外通信开销。UDP接收方则不会进行反馈,因此不会有这方面的额外开销。
3. 速度:TCP相较于UDP较慢,这也主要是因为TCP有一个连接的过程而UDP没有。
【Q】ajax的跨域问题
【A】
(1)浏览器限制:发生ajax跨域的问题的时候后端是正常执行的,从后台打印的日志可以看出,而且后台也会正常返回数据。浏览器为了安全进行了限制,说白了就是浏览器多管闲事。
(2)跨域:当协议、域名、端口不一致浏览器就会认为是跨域问题。
(3)XHR(XMLHttpRequest)请求,也就是ajax请求:如果不是ajax请求,不存在跨域问题(这个我们应该可以理解,浏览器直接访问以及a标签跳转等方式都不会产生跨域问题)。
【Q】nio与io的区别?什么情况下适合用nio
【A】
IO |
NIO |
面向流 |
面向缓冲 |
阻塞IO |
非阻塞IO |
无 |
选择器 |
【Q】说说常见的linux命令?
【A】ls,pwd,cd,tree命令
【Q】linux查看内存的命令是什么
【A】top,free
【Q】git遇见代码冲突了怎么办?
【A】
情景一:多个分支代码合并到一个分支时;
情景二:多个分支向同一个远端分支推送代码时;
情景一:在当前分支上,直接修改冲突代码--->add--->commit。
情景二:在本地当前分支上,修改冲突代码--->add--->commit--->push
【Q】说几个常见的maven命令,maven如何排除一个jar包的冲突?
【A】
【1】maven clean。对项目进行清理,清理的过程中会删除删除target目录下编译的内容。
【2】maven compile。编译项目源代码。
【3】maven test。对项目的运行测试。
【4】maven packet。可以打包后的文件存放到项目的 target 目录下,打包好的文件通常都是编译后生成的class文件。
【5】maven install。在本地仓库生成仓库的安装包可以供其他项目引用,同时打包后的文件存放到项目的 target 目录下。
结语:今天就暂时和大家聊到这里,祝大家收获理想的Offer
以上是关于面经面试基本流程的主要内容,如果未能解决你的问题,请参考以下文章
Android 基础掌握好,面试基本不会倒!(Android 开发面经基础部分知识点整理)
京东后端Java高级架构师面经+面试题:Spring+多线程+NIO+MySQL