一个Java高级工程师的面试总结,真实的面试流程与面试题与答案

1、面试技巧

一、背熟你的简历

缘由:面试的第一个问题,通常都是让你简单介绍下你本身,或者介绍一下你最近的项目,而一个面试者,若是连本身的简历都没法熟知,对里面提到的项目、技术都没法描述清楚的话,我想没有哪家公司会接受这样的,哪怕你是超级人才,你自我表述不行,估计也会为此头疼,因此,切记:必定要背好本身的简历,不要求你能所有记下,至少要熟记你最近所待过的两家公司,这两家公司里面你作过的项目,你负责的模块,项目里面用到的技术以及相对应的技术实现方案(这个尤其重要)。java

因为文章篇幅限制,不可能将全部面试题以文字形式把大厂面试题展现出来,本篇为你们精选了一些面试题,若是你须要这份完整版的面试笔记,获取面试资料只需:点击这里领取!!! 暗号:CSDN
在这里插入图片描述mysql

二、深刻了解并熟记部分Java基础知识

缘由:大部分公司不管面试初级仍是高级,不管是笔试仍是面试,都会问到一系列基础题,这些基础题大概涵括jvm、字符串、集合、线程等等,若是说每个让你死记硬背你确定记不住,那么就是理解中记忆了,拿jvm来讲 ,若是让你谈谈你对jvm的理解, 那么你首先得知道JVM有哪些结构组成,每一个结构用来作什么的,而后考虑一个Java对象从建立到回收,如何途径JVM这些结构的。若是你从这些方面来综合记忆,相信事半功倍,而且你理解的更透彻。程序员

至于若是让你谈集合,举例List集合下面ArryList、LinkedList、Vector等集合的区别,那么一样的方法,你须要理解每个的结构组成是什么,你才能知道他有什么做用,这样你在平时的用法上会更精炼,并且在面试过程当中,也不至于哑口无言。web

三、保持自信心和沉重冷静的心态

缘由:面试过程当中,自信是少不了的,相信你能够, 面试的路上能够本身对本身说一句: I belive I can ! 反正我就是这么作的,自个人内心暗示吧,其实面对面试官的时候,你自信的状态也会让面试官以为你是个颇有底气的人,至少从感受上会给你打个高分。面试

另外还有就是保持沉重冷静,若是是让你提供技术方案或者说说某个技术原理,不必一紧张一咕噜的什么都说,你能够对面试官说:我先想一想,而后本身组装记忆中的知识,组装下语言,有条理的说出来,这样能更好的表现你的才能,不是吗? 面试谁都会紧张,我也会紧张,有时候明明记得的知识点忘了,不要紧,大胆的说忘了,或者直接说不知道。 要记住,有部分不知道不要紧,若是全都知道,那你应该是CTO级别了(开个玩笑)。redis

四、尽可能记住面试过程当中你回答不出来或者存在不妥的问题

缘由:面试失败了不要紧,毕竟每一个公司的要求不同,问的问题和你擅长的方面可能有所出入,可是请记住一点:面试过程当中那些你回答不出来问题,或者你本身感受回答不太准确的问题,本身记下来,若是不会的,你能够当场问问面试官有没有好的解答,若是面试官不肯意告诉你(通常是基础方面面试官就懒得答你),那么你就本身回家慢慢查资料,若是是某些特定的技术,也能够本身写写案例什么的,毕竟知识点就那么多,问题百变,原理不变,面试也是一个学习知识的过程,让你了解大部分公司目前须要或者要求的技术。此次不知道,下次就知道了。算法

五、去面试以前,最好先了解你要去面试公司的状况

缘由:俗话说,知己知彼,百战不殆,面试就是一场战斗,你须要了解你面试公司基本状况,包括岗位要求,这样你就能大概知道你须要面试的这家公司的技术要求状况。 为什么让你去了解这家公司的主营产品和项目呢,就是让你大概了解这家公司的一个技术架构的状况,包括你可能对他们的一种实现方式提出质疑和疑惑,相信面试官很愿意帮你解答这些问题的。这样你既图了表现,也学到了知识,何乐而不为。spring

六、合理安排你的面试时间

缘由:估计不少人都不理解这个,可能大部分的人对于如何安排面试时间比较迷茫,随意安排。但是这里有个技巧,若是同时有多个面试机会,你把你最想去的公司放到最末尾去面试,这样你经历过了前面的这些公司筛选,若是成功了是个机会,若是没成功,也是为最后作铺垫。sql

不过这里就须要考虑两点:一、你须要记住你投简历的公司和基本状况(这说明你不是海投的) 二、若是记不住,那么能够先应答一个时间,后续了解公司信息以后,经过邮件或者其余方式与其约定,调整面试时间。并且建议安排一天的面试公司不要超过两家,最好的是上午一家,下午一家,这样你能有充足的时间调整状态。docker

2、面试题基础总结

一、JVM结构原理、GC工做机制详情

答:具体参照:JVM结构、GC工做机制详解,说到GC,记住两点:一、GC是负责回收全部无任何引用对象的内存空间。 注意:垃圾回收回收的是无任何引用的对象占据的内存空间而不是对象自己,二、GC回收机制的两种算法,a、引用计数法 b、可达性分析算法( 这里的可达性,你们能够看基础2 Java对象的什么周期),至于更详细的GC算法介绍,你们能够参考:Java GC机制算法。

二、Java对象的生命周期

答:建立阶段 、 应用阶段 、不可见阶段 、不可达阶段 、收集阶段 、终结阶段、 对象空间从新分配阶段等等,具体参照:Java 对象的生命周期。

三、Map或者HashMap的储存原理

答:HashMap是由数组+链表的一个结构组成,具体参照:HashMap的实现原理。

四、当数据表中A、B字段作了组合索引,那么单独使用A或单独使用B会有索引效果吗?(使用like查询如何有索引效果)

答:看A、B两字段作组合索引的时候,谁在前面,谁在后面,若是A在前,那么单独使用A会有索引效果,单独使用B则没有,反之亦然。同理,使用like模糊查询时,若是只是使用前面%,那么有索引效果,若是使用双%号匹配,那么则无索引效果。

五、数据库存储日期格式时,如何考虑时区转换问题?

答:使用TimeStamp , 缘由参照:Java编程中遇到的时区转换问题。

六、JavaObject类中有哪些方法?

答:Object有哪些方法。

七、HTTP协议,GET和POST 的区别

答:浅谈HTTP中GET和POST的区别。

3、线程、设计模式、缓存方面

一、SimpleDataFormat是非线程安全的,如何更好的使用而避免风险呢?

答:关于SimpleDateFormat安全的时间格式化线程安全问题。

二、如何看待设计模式,并简单说说你对观察者模式的理解

答:一、设计模式有神马用二、观察者模式类图及实现。

三、集群环境中,session如何实现共享

答:一、Java集群之session共享二、session多服务器共享方案,还有一种方案就是使用一个固定的服务器专门保持session,其余服务器共享。

四、分布式、集群环境中,缓存如何刷新,如何保持同步?

答:A、缓存如何刷新?一、定时刷新 二、主动刷新覆盖,每一个缓存框架都有自带的刷新机制,或者说缓存失效机制,就拿Redis和 Ehcache举例, 他们都有自带的过时机制,另外主动刷新覆盖时,只需获取对应的key进行数据的覆盖便可。

B、缓存如何保持同步? 这个redis有自带的集群同步机制,即复制功能,具体参考:基于Redis分布式缓存实现,Ehcache也有分布式缓存同步的配置,只须要配置不一样服务器地址便可,参照:Ehcache分布式缓存同步。

五、一条sql执行过长的时间,你如何优化,从哪些方面?

答:一、查看sql是否涉及多表的联表或者子查询,若是有,看是否能进行业务拆分,相关字段冗余或者合并成临时表(业务和算法的优化);

二、涉及链表的查询,是否能进行分表查询,单表查询以后的结果进行字段整合;

三、若是以上两种都不能操做,非要链表查询,那么考虑对相对应的查询条件作索引。加快查询速度;

四、针对数量大的表进行历史表分离(如交易流水表);

五、数据库主从分离,读写分离,下降读写针对同一表同时的压力,至于主从同步,MySQL有自带的binlog实现 主从同步;

六、explain分析sql语句,查看执行计划,分析索引是否用上,分析扫描行数等等;

七、查看mysql执行日志,看看是否有其余方面的问题;

我的理解:从根本上来讲,查询慢是占用mysql内存比较多,那么能够从这方面去酌手考虑。

4、设计方案相关

面试还会问到一些关于设计方案相关的问题,好比:

一、你的接口服务数据被人截包了,你如何防止数据恶意提交?

答:咱们能够在接口传输参数里面设置一个业务编号,这个编号用来区分是否重复提交。这样即便数据被抓包了,对方也没法区分每一个字段你的含义,这时,这个业务编号的做用就来了。

二、假设服务器常常宕机,你从哪些方面去排查问题?

答:这个就留个各位看官补充了。

总而言之该看的仍是得看,还学的仍是得学。再次强调,基础很重要!面试技巧一样很重要,仍是那句话:祝愿各位看官都能找到心仪的工做吧~~

另外,奉劝你们不要频繁跳槽,这些知识点能提高当然好,不要盲目跳槽,找工做很累的,并且没有哪家公司喜欢频繁跳槽的员工。

5、Java程序员跳槽应该学哪些方面的技术

互联网产品、大型企业级项目常会用到的:

1.并发处理技术。

具体到Java上一般是涉及java.util.concurrent、并发锁机制、NIO等方面,固然最近比较火爆的Netty框架也能够做为高并发处理的备选方案之一,这须要对Java的线程调度机制有着比较深的理解。不过这些可能会涉及并发控制的对象(好比reentrantlock等)只能存在于一个JVM里的问题,一旦系统规模大到须要部署多个JVM来处理并发的状况,则须要采用共享session的技术(好比spring-session),或者尽量将系统后台设计为无状态的服务,这须要对RESTful有着较深的理解。

2.高可用、负载均衡技术。

互联网产品、企业级应用一般要求一年里的Downtime控制在很小的范围内,这须要足够的高可用和负载均衡架构来支撑,这个通常和Java技术自己没太大关系,但倒是一名初级程序员向高级程序员甚至是架构师CIO进阶的必备技术,所以能够适当了解一下Nginx、HAProxy等对这方面的支持。另外如今最“时髦”的作法是将应用docker化,配合ETCD、kubernetes等工具在容器的层面上实现高可用和负载均衡,固然这须要看实际的需求,最时髦的不见得是最适用的,要考虑构建成本。

3.缓存技术。

缓存应该是大型系统中或高并发条件下提升响应速度的亘古不变的真理(虽然也看到过淘宝搜索商品功能采用的大数据处理技术实现的零缓存的文章,但能达到淘宝的体量和技术水平通常不太可能),这方面的工具太多了,ehcache、memcached、redis……从Java的角度来说,须要了解的一是Java对这些工具的链接器,二是缓存技术背后的JSR-107标准,能够参考spring-cache的实现,阅读一下源码加深理解。

4.异步处理技术。

这一般也是抵消高并发的处理手段之一,从Java的角度看最简单的异步处理就是新启动一个异步线程,这一样也须要对Java的线程调度有所了解,固然也可以使用Spring中的@Async之类的也能够简单实现异步线程的处理。若是是很是消耗资源的业务处理,简单的异步线程是知足不了需求的,这就须要一些消息中间件来作这些异步处理了,消息中间件有不少,activemq、rabbitmq、kafka……须要了解的是Java对这些中间件的链接器。不过异步处理中最关键的是事务保证的问题,这可能须要对事务的两步提交有所了解。