1、背熟你的简历
原因:面试的第一个问题,一般都是让你简单介绍下你自己,或者介绍一下你最近的项目,而一个面试者,如果连自己的简历都无法熟知,对里面提到的项目、技术都无法描述清楚的话,我想没有哪家公司会接受这样的,哪怕你是超级人才,你自我表述不行,估计也会为此头疼,所以,切记:一定要背好自己的简历,不要求你能全部记下,至少要熟记你最近所待过的两家公司,这两家公司里面你做过的项目,你负责的模块,项目里面用到的技术以及相对应的技术实现方案(这个尤为重要)。
2、深入了解并熟记部分Java基础知识
原因:大部分公司无论面试初级还是高级,无论是笔试还是面试,都会问到一系列基础题,这些基础题大概涵括jvm、字符串、集合、线程等等,如果说每一个让你死记硬背你肯定记不住,那么就是理解中记忆了,拿jvm来说 ,如果让你谈谈你对jvm的理解, 那么你首先得知道JVM有哪些结构组成,每个结构用来做什么的,然后考虑一个Java对象从创建到回收,如何途径JVM这些结构的。如果你从这些方面来综合记忆,相信事半功倍,并且你理解的更透彻。
至于如果让你谈集合,举例List集合下面ArryList、LinkedList、Vector等集合的区别,那么同样的方法,你需要理解每一个的结构组成是什么,你才能知道他有什么作用,这样你在平时的用法上会更精炼,而且在面试过程中,也不至于哑口无言。
3、保持自信心和沉重冷静的心态
原因:面试过程中,自信是少不了的,相信你可以, 面试的路上可以自己对自己说一句: I belive I can ! 反正我就是这么做的,自我的心里暗示吧,其实面对面试官的时候,你自信的状态也会让面试官觉得你是个很有底气的人,至少从感觉上会给你打个高分。
另外还有就是保持沉重冷静,如果是让你提供技术方案或者说说某个技术原理,没必要一紧张一咕噜的什么都说,你可以对面试官说:我先想想,然后自己组装记忆中的知识,组装下语言,有条理的说出来,这样能更好的表现你的才能,不是吗? 面试谁都会紧张,我也会紧张,有时候明明记得的知识点忘了,没关系,大胆的说忘了,或者直接说不知道。 要记住,有部分不知道没关系,如果全都知道,那你应该是CTO级别了(开个玩笑)。
4、尽量记住面试过程中你回答不出来或者存在不妥的问题
原因:面试失败了没关系,毕竟每个公司的要求不一样,问的问题和你擅长的方面可能有所出入,但是请记住一点:面试过程中那些你回答不出来问题,或者你自己感觉回答不太准确的问题,自己记下来,如果不会的,你可以当场问问面试官有没有好的解答,如果面试官不愿意告诉你(一般是基础方面面试官就懒得答你),那么你就自己回家慢慢查资料,如果是某些特定的技术,也可以自己写写案例什么的,毕竟知识点就那么多,问题百变,原理不变,面试也是一个学习知识的过程,让你了解大部分公司目前需要或者要求的技术。这次不知道,下次就知道了。
5、去面试之前,最好先了解你要去面试公司的情况
原因:俗话说,知己知彼,百战不殆,面试就是一场战斗,你需要了解你面试公司基本情况,包括岗位要求,这样你就能大概知道你需要面试的这家公司的技术要求情况。 为何让你去了解这家公司的主营产品和项目呢,就是让你大概了解这家公司的一个技术架构的情况,包括你可能对他们的一种实现方式提出质疑和疑惑,相信面试官很愿意帮你解答这些问题的。这样你既图了表现,也学到了知识,何乐而不为。
6、合理安排你的面试时间
原因:估计很多人都不理解这个,可能大部分的人对于如何安排面试时间比较迷茫,随意安排。可是这里有个技巧,如果同时有多个面试机会,你把你最想去的公司放到最末尾去面试,这样你经历过了前面的这些公司筛选,如果成功了是个机会,如果没成功,也是为最后做铺垫。
不过这里就需要考虑两点:1、你需要记住你投简历的公司和基本情况(这说明你不是海投的) 2、如果记不住,那么可以先应答一个时间,后续了解公司信息之后,通过邮件或者其他方式与其约定,调整面试时间。而且建议安排一天的面试公司不要超过两家,最好的是上午一家,下午一家,这样你能有充足的时间调整状态。
Java基础
1.数组中的排序问题(笔试或者机试,前者可能性更大)
2.面向对象的理解
面向对象主要有四个特性:
封装、抽象、继承和多态。
封装:在面向对象语言中,封装特性是由类来体现的,我们将现实生活中的一类实体定义成类,其中包括属性和行为(在Java中就是方法),就好像人类,可以具有name,sex,age等属性,同时也具有eat(),sleep()等行为,我们在行为中实现一定的功能,也可操作属性,这是面向对象的封装特性;
抽象:抽象就是将一类实体的共同特性抽象出来,封装在一个抽象类中,所以抽象在面向对象语言是由抽象类来体现的。比如鸟就是一个抽象实体,因为抽象实体并不是一个真正的对象,它的属性还不能完全描述一个对象,所以在语言中体现为抽象类不能实例化;
继承:继承就像是我们现实生活中的父子关系,儿子可以遗传父亲的一些特性,在面向对象语言中,就是一个类可以继承另一个类的一些特性,从而可以代码重用,其实继承体现的是is-a关系,父类同子类在本质上还是一类实体;
多态:多态就是通过传递给父类对象引用不同的子类对象从而表现出不同的行为
3.集合相关的问题
比如:Set与List的区别。ArrayList与Linkedlist区别。HashMap与HashTable区别。搞清楚每个集合对象的特性就欧了。
Map或者HashMap的储存原理
答:HashMap是由数组+链表的一个结构组成,具体参照:HashMap的实现原理。
4.多线程问题
多线程启动方式,以及产生死锁的原因和解决办法,乐观锁悲观锁,线程同步,创建方法jdk1.5之前/之后【多线程问题不是很常问,有精力就复习这块内容】
SimpleDataFormat是非线程安全的,如何更好的使用而避免风险呢?
答:关于SimpleDateFormat安全的时间格式化线程安全问题。
5.IO流
了解常见的几个流对象以及基本的流操作即可,被机试的可能性比较小。
6.数据结构
例如:集合,枚举 7.设计模式
单例,工厂,MVC等
如何看待设计模式,并简单说说你对观察者模式的理解
设计模式有神马用
观察者模式类图及实现。
8.排序算法
冒泡,快速,基数,插入,希尔等
9.JVM JVM结构原理、GC工作机制详情
GC回收,调优,内存溢出
答:具体参照:JVM结构、GC工作机制详解,说到GC,记住两点:1、GC是负责回收所有无任何引用对象的内存空间。 注意:垃圾回收回收的是无任何引用的对象占据的内存空间而不是对象本身,2、GC回收机制的两种算法,a、引用计数法 b、可达性分析算法( 这里的可达性,大家可以看基础2 Java对象的什么周期),至于更详细的GC算法介绍,大家可以参考:Java GC机制算法。
10、Java对象的生命周期
答:创建阶段 、 应用阶段 、不可见阶段 、不可达阶段 、收集阶段 、终结阶段、 对象空间重新分配阶段等等,具体参照:Java 对象的生命周期。
11、JavaObject类中有哪些方法?
答:Object有哪些方法。
JavaWeb
1.http协议
(定义、常见的请求头以及响应头<功能>、状态码)
HTTP协议,GET和POST 的区别
2.Tomcat
(目录结构<存放的内容以及配置文件里面能做哪些工作>、常见配置;有能力者可以了解一下tomcat的原理<启动加载问题>)
3.jdbc
(编程步骤、与hibernate以及mybatis的区别)
4.servlet
(概念的理解;生命周期、线程安全问题、接口相关类型、体系结构<区别>、request以及response的用途、servletContext对象的功能、编码以及路径问题)
5.filter
(生命周期、常见应用、dofilter里面的参数、应用场景)
6.jsp
(隐式对象、常见标签<指令、动作>、EL以及JSTL)
内置对象
名称 | 类型 | 描述 |
---|---|---|
out | javax.servlet.jsp.JspWriter | 用于页面输出 |
request | javax.servlet.http.HttpServletRequest | 得到用户请求信息, |
response | javax.servlet.http.HttpServletResponse | 服务器向客户端的回应信息 |
config | javax.servlet.ServletConfig | 服务器配置,可以取得初始化参数 |
session | javax.servlet.http.HttpSession | 用来保存用户的信息 |
application | javax.servlet.ServletContext | 所有用户的共享信息 |
page | java.lang.Object | 指当前页面转换后的Servlet类的实例 |
pageContext | javax.servlet.jsp.PageContext | JSP的页面容器 |
exception | java.lang.Throwable | 表示JSP页面所发生的异常,在错误页中才起作用 |
作用域范围
PageContext常量名 | 描述 | 作用域名称 | 域对象类型 |
---|---|---|---|
PageScope | 当前页面中有效 | pageContext | PageContext |
RequestScope | 一次请求范围 | request | HttpServletRequest |
SessionScope | 一次会话范围 | session | HttpSession |
ApplicationScope | 应用范围 | application | ServletContext |
静态包含/动态包含
7.cookie/session
(概念的理解;生命周期,session创建的时期,相关方法的使用)
8.Xml定义文档的形式,都有什么区别
a: 两种定义形式 dtd(文档类型定义) schema(XML模式);
b: XML Schema和DTD都用于文档验证,但二者还有一定区别;
本质区别:schema本身是xml的,可以被XML解析器解析(这也是从DTD上发展schema的根本目的)。另外:
XML Schema是内容开放模型,可扩展,功能性强;而DTD可扩展性差;
XML Schema支持丰富的数据类型,而DTD不支持元素的数据类型,对属性的类型定义也很有限;
XML Schema支持命名空间机制,而DTD不支持;
XML Schema可针对不同情况对整个XML文档或文档局部进行验证;而DTD缺乏这种灵活性;
XML Schema完全遵循XML规范,符合XML语法,可以和DOM结合使用,功能强大;而DTD语法本身有自身的语法和要求,难以学习;
c:有DOM(文档对象模型),SAX(Simple API for XML),STAX等
DOM:文档驱动,处理大型文件时其性能下降的非常厉害。这个问题是由DOM的树结构所造成的,这种结构占用的内存较多,而且DOM必须在解析文件之前把整个文档装入内存,适合对XML的随机访问
SAX:不同于DOM,SAX是事件驱动型的XML解析方式。它顺序读取XML文件,不需要一次全部装载整个文件。当遇到像文件开头,文档结束,或者标签开头与标签结束时,它会触发一个事件,用户通过在其回调事件中写入处理代码来处理XML文件,适合对XML的顺序访问,且是只读的。当前浏览器不支持SAX
SAXParserFactory factory= SAXParserFactory.newInstance();
SAXParser saxparser= factory.newSAXParser();//创建SAX解析器
MyHandler handler=new MyHandler();//创建事件处理器
saxParser.parse(new File(“Sax_1.xml”),handler);//绑定文件和事件处理者
STAX:Streaming API for XML (StAX) Streaming API for XML (StAX)
是用 Java™ 语言处理 XML 的最新标准。StAX 与其他方法的区别就在于应用程序能够把 XML 作为一个事件流来处理。StAX 允许应用程序代码把这些事件逐个拉出来,而不用提供在解析器方便时从解析器中接收事件的处理程序。
框架
1.struts2
(action相关的问题<书写方式[区别]、接受请求参数的方式、相关配置、访问servletAPI的方式>;值栈相 关问题<定义、内部结构、如何获取值栈对象、EL为什么能访问值栈中的数据>;struts2与springMVC的区别;拦截器与过滤器的 区别;struts2工作原理<执行流程>)
2.hibernate
(核心思想要了解;开发流程<加载文件的过程>;查询方式;如何优化;sql与hql的区别;update与 saveOrUpdate的区别;get和load的区别;Java对象三种状态的特征以及转换、核心API、一级缓存和二级缓存、延迟加载)
3.spring
(springIOC和DI;生命周期;Bean注入属性的方式;aop极其相关名词解释;核心类;applicationContext与beanFactory的区别;bean实例化有哪些方式)
4.springMVC
(工作流程;与struts2的区别;乱码问题如何处理;各组件的扩展类型)
5.mybatis
(与jdbc/hibernate的区别;)
脚本
1.JavaScript核心对象
2.浏览器BOM对象
3.文档对象模型DOM
4.常见事件
5.Ajax编程
(web交互2种方式的对比)
6.传统Ajax编程的步骤以及从服务器端返回的数据格式(之间的差别)
7.JSON数据格式的转换操作
8.jQuery选择器
9.jQuery的Ajax编程(常见方法)
10.其余的问题都是一些笔试题,让你直接写javascript代码实现某一功能
数据库缓存
数据库这一块几乎都是一些概念性的问答题(存储过程、函数、事务、索引、触发器、视图、游标以及一些优化操作),笔试100%会出现,一般考察的都是多表联合查询
比如:
1、当数据表中A、B字段做了组合索引,那么单独使用A或单独使用B会有索引效果吗?(使用like查询如何有索引效果)
答:看A、B两字段做组合索引的时候,谁在前面,谁在后面,如果A在前,那么单独使用A会有索引效果,单独使用B则没有,反之亦然。同理,使用like模糊查询时,如果只是使用前面%,那么有索引效果,如果使用双%号匹配,那么则无索引效果。
2、数据库存储日期格式时,如何考虑时区转换问题?
答:使用TimeStamp , 原因参照:Java编程中遇到的时区转换问题。
3、一条sql执行过长的时间,你如何优化,从哪些方面?
答:
个人理解:从根本上来说,查询慢是占用mysql内存比较多,那么可以从这方面去酌手考虑。
4、集群环境中,session如何实现共享
答:1、Java集群之session共享2、session多服务器共享方案,还有一种方案就是使用一个固定的服务器专门保持session,其他服务器共享。
5、分布式、集群环境中,缓存如何刷新,如何保持同步?
答:A、缓存如何刷新?
1、定时刷新 2、主动刷新覆盖,每个缓存框架都有自带的刷新机制,或者说缓存失效机制,就拿Redis和 Ehcache举例, 他们都有自带的过期机制,另外主动刷新覆盖时,只需获取对应的key进行数据的覆盖即可。
B、缓存如何保持同步?
这个redis有自带的集群同步机制,即复制功能,具体参考:基于Redis分布式缓存实现,Ehcache也有分布式缓存同步的配置,只需要配置不同服务器地址即可,参照:Ehcache分布式缓存同步。
人事相关
1.自我介绍(注重的是你之前在公司里面工作内容,特别是最近在公司里面做的项目<回答思路参考项目相关问题一>)
2.简单的介绍一下上一家公司的情况/评价
3.你为什么来北京工作,怎样看待跳槽?
4.你对我们公司了解吗?
5.你如果有幸进入我们公司,有什么规划吗?
6.你上一家公司的薪资大概是多少?有哪些组成部分?
7.你有没有投其它公司?如果其它公司也给了offer,你会如何抉择?
8.你有对象吗?打算什么时候结婚生孩子?
9.你对薪资待遇有什么要求?能再低一点吗?
10.你还有什么问题要问我吗?
项目相关
1.请介绍一下你最近做的这一个项目吧
【思路:项目给谁做的、项目涉及的领域、系统的架构(功能&技术)、系统的用途、系统的部署、使用了哪些比较新颖的技术】
2.谈谈你对电商行业的了解
【思路:电商行业的发展、行业技术特点、行业的一些概念】
3.你这个项目大概有哪些功能,你负责了哪些核心功能?
【拥有的功能尽可能说多一点,建议10个左右,自己负责的3个大(如商品管理、订单、购物车),其余的都是其他组员开发的任务】
4.谈谈xx(具体的,比如商品管理、订单、购物车)模块/功能的实现思路?实现的过程中涉及到了哪些技术,这些技术能介绍下吗?
5.你们公司有多少人?有测试吗?有美工吗?整个项目组人员配置是怎么样的?项目开发的流程大概是什么样子的?
【检验是否有工作经验的一个问题】
6.这个项目使用了什么构建工具没有?有的话,多模块之间是如何划分的?为什么要这么划分?
7.在这个项目中是如何设计商品规格的?
8.这个系统中你是如何实现跨系统调用的?
9.在这个项目中,CMS系统是如何设计的,简单的说一下设计思路
10.在这个项目中,你们主要使用什么样的数据格式来进行数据的传输的?
11.单点系统的设计思想你了解吗?他在系统架构中的作用是什么?位置如何?
12.你们这个项目中订单ID是怎么生成的?我们公司最近打算做一个电商项目,如果让你设计这块,你会考虑哪些问题?
13.各个服务器的时间不统一怎么办?
14.你们线上部署时什么样的,能画一下吗?
15.你们生产环境的服务器有多少台?
16.你们使用什么做支付的?如果使用易宝做支付,请求超时了怎么处理?
17.你刚才不是说付款成功后易宝会有数据返回吗?如果付款后易宝没有返回,或者返回超时了,但是钱又已经扣了,你怎么办?
18.你们怎么做退款功能的,要多长时间才能把钱退回给用户?
19.你购物车存cookie里边可以实现不登录就可以使用购物车,那么我现在没有登录把商品存购物车了,然后登录了, 然后我换台电脑并且登录了还能不能看见我购物车的信息?如果看不到怎么做到cookie同步,就是在另外一台电脑上可以看到购物车信息
20.如果用户一直向购物车添加商品怎么办?并且他添加一次你查询一次数据库?互联网上用户那么多,这样会对数据库造成很大压力你怎么办?
21.购物车的设计细节问题
其他技术
1.权限控制
(一般情况,在公司必须有一定工作经验的开发者才会被分配该功能模块的开发,这意味着学员在刚开始参加工作的那个项目里面绝对不能写的内容。) 这里一般都会提及shiro技术,在这块需要掌握shiro相关的几个组件以及他们的调用关系,然后就是权限设计的几张数据库表(表之间的关系以及每张表里面的重要字段)
2.搜索系统
(普通的查询会让面试官问及效率问题,那么势必要提到全文检索技术,由于刚学不是很熟,根据自己掌握的情况进行选择)
3.浏览器跨域问题
(前台系统调用可以使用jsonp来实现浏览器跨域问题,去年有学员花几个小时学习这个,仅凭此技术入职8K。)
4.webservice
(该技术已有替代技术,如果不会,可以不用花时间去复习)
5.Linux
(水太深,只谈自己在项目中就部署的时候用了一下即可)
6.redis
(根据自己的能力看是否需要提及次技术,毕竟购物车的实现方式比较多。)
设计方案相关
面试还会问到一些关于设计方案相关的问题,比如:
1、你的接口服务数据被人截包了,你如何防止数据恶意提交?
答:我们可以在接口传输参数里面设置一个业务编号,这个编号用来区分是否重复提交。这样即使数据被抓包了,对方也无法区分每个字段你的含义,这时,这个业务编号的作用就来了。
2、假设服务器经常宕机,你从哪些方面去排查问题?
答:这个就留个各位看官补充了。
总而言之该看的还是得看,还学的还是得学。再次强调,基础很重要!面试技巧同样很重要,还是那句话:祝愿各位看官都能找到心仪的工作吧~~
另外,奉劝大家不要频繁跳槽,这些知识点能提升固然好,不要盲目跳槽,找工作很累的,而且没有哪家公司喜欢频繁跳槽的员工。
跳槽应该学的技术
互联网产品、大型企业级项目常会用到的:
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对这些中间件的连接器。不过异步处理中最关键的是事务保证的问题,这可能需要对事务的两步提交有所了解。