Java面试复习大纲2.0(持续更新)

想要成为合格的Java程序员或工程师到底需要具备哪些专业技能,面试者在面试之前到底需要准备哪些东西呢?本文陈列的这些内容既可以作为个人简历中的内容,也可以作为面试的时候跟面试官聊的东西,你可以把这些内容写到你的简历中,当然更需要的是你在面试的时候向面试官展示这些专业技能。相信此文对正在寻觅Java程序员(Java工程师)职位的freshman以及希望成为中高级Java开发者的junior都会有所帮助。

专业技能

1. 熟练的使用Java语言进行面向对象程序设计,有良好的编程习惯,熟悉常用的Java API,包括集合框架、多线程(并发编程)、I/O(NIO)、Socket、JDBC、XML、反射等。[泛型]

2. 熟悉基于JSP和Servlet的Java Web开发,对Servlet和JSP的工作原理和生命周期有深入了解,熟练的使用JSTL和EL编写无脚本动态页面,有使用监听器、过滤器等Web组件以及MVC架构模式进行Java Web项目开发的经验。

3. 对Spring的IoC容器和AOP原理有深入了解,熟练的运用Spring框架管理各种Web组件及其依赖关系,熟练的使用Spring进行事务、日志、安全性等的管理,有使用Spring MVC作为表示层技术以及使用Spring提供的持久化支持进行Web项目开发的经验,熟悉Spring对其他框架的整合。

4. 熟练的使用Hibernate、MyBatis等ORM框架,熟悉Hibernate和MyBatis的核心API,对Hibernate的关联映射、继承映射、组件映射、缓存机制、事务管理以及性能调优等有深入的理解。

5. 熟练的使用HTML、CSS和JavaScript进行Web前端开发,熟悉jQuery和Bootstrap,对Ajax技术在Web项目中的应用有深入理解,有使用前端MVC框架(AngularJS)和JavaScript模板引擎(HandleBars)进行项目开发的经验。

6. 熟悉常用的关系型数据库产品(MySQL、Oracle),熟练的使用SQL和PL/SQL进行数据库编程。

7. 熟悉面向对象的设计原则,对GoF设计模式和企业应用架构模式有深入的了解和实际开发的相关经验,熟练的使用UML进行面向对象的分析和设计,有TDD(测试驱动开发)和DDD(领域驱动设计)的经验。

8. 熟悉Apache、NginX、Tomcat、WildFly、Weblogic等Web服务器和应用服务器的使用,熟悉多种服务器整合、集群和负载均衡的配置。

9. 熟练的使用产品原型工具Axure,熟练的使用设计建模工具PowerDesigner和Enterprise Architect,熟练的使用Java开发环境Eclipse和IntelliJ,熟练的使用前端开发环境WebStorm,熟练的使用软件版本控制工具SVN和Git,熟练的使用项目构建和管理工具Maven和Gradle。

说明:上面罗列的这些东西并不是每一项你都要烂熟于心,根据企业招聘的具体要求可以做相应的有针对性的准备。我个人觉得前6项应该是最低要求,是作为一个Java开发者必须要具备的专业技能。

项目经验

实际情况为主,适自己能力而定。

项目介绍

本系统是X委托Y开发的用于Z的系统,系统包括A、B、C、D等模块。系统使用了Java企业级开发的开源框架E以及前端技术F。表示层运用了G架构,使用H作为视图I作为控制器并实现了REST风格的请求;业务逻辑层运用了J模式,并通过K实现事务、日志和安全性等功能,通过L实现缓存服务;持久层使用了M封装CRUD操作,底层使用N实现数据存取。整个项目采用了P开发模型。

说明:上面的描述中,E通常指Spring(Java企业级开发的一站式选择);F最有可能是jQuery库及其插件或者是Bootstrap框架,当然如果要构建单页应用(SPA)最佳的方案是前端MVC框架(如AngularJS)和JavaScript模板引擎(如HandleBars);G显然是MVC(模型-视图-控制),最有可能的实现框架是Spring MVC,除此之外还有Struts 2、JSF以及Apache为JSF提供的MyFaces实现,可以使用JSP作为MVC中的V,也可使用模板引擎(如Freemarker和Velocity)来生成视图,还可以是各种文档或报表(如Excel和PDF等),而Servlet和自定义的控制器是MVC中的C,当然Spring MVC中提供了作为前端控制器的DispatcherServlet;J通常是事务脚本,K应该是AOP(面向切面编程)技术,L目前广泛使用的有memcached和Redis;M的选择方案很多,最有可能的是Hibernate和MyBatis,也可以两种技术同时运用,但通常是将增删改交给Hibernate来处理,而复杂的查询则由MyBatis完成,此外TopLink、jOOQ也是优秀的持久层解决方案;底层的数据存取传统上是使用关系型数据库,可以是MySQL、Oracle、SQLServer、DB2等,随着大数据时代的来临,也可以采用NoSQL(如MongoDB、MemBase、BigTable等)和其他大数据存取方案(如GFS、HDFS等);项目的开发模型P可以是瀑布模型、快速原型模型、增量模型、螺旋模型、喷泉模型、RAD模型等。

项目开发流程

1. 可行性分析 >>> 可行性分析报告 / 项目开发计划书

2. 需求分析 >>> 需求规格说明书

o OOAD(用例图、时序图、活动图)

o 界面原型:帮助理解需求、业务层设计时推导事务脚本

3. 设计 >>> 概要设计说明书/详细设计说明书

o 抽取业务实体(领域对象):类图、E-R图(概念设计阶段)

o 分层架构:确定各层的技术实现方案(具体到使用的框架、数据库服务器、应用服务器等)。

o 业务层设计:事务脚本模式(事务:用户发送一次请求就是一个事务;脚本:一个方法或一个函数;事务脚本:把一次请求封装为一个方法或一个函数;事务脚本模式:一个事务开始于脚本的打开,终止于脚本的关闭)。

o 业务层涉及的对象有三种类型:事务脚本类(封装了业务的流程)、数据访问对象(DAO,封装了持久化操作)、数据传输对象(DTO,封装了失血/贫血领域对象),三者之间的关系是事务脚本类组合(聚合)数据访问对象,这二者都依赖了数据传输对象

o 正向工程(UML类图生成Java代码)和逆向工程(Java代码生成UML类图)

o 数据库物理设计(ER图转换成表间关系图、建库和建表、使用工具插入测试数据)

4. 编码

5. 测试 >>> 测试报告 / 缺陷报告

o 单元测试:对软件中的最小可测试单元进行检查和验证,在Java中是对类中的方法进行测试,可以使用JUnit工具来实施。

o 集成测试:集成测试也叫组装测试或联合测试。在单元测试的基础上,将所有模块按照设计要求组装成为子系统进行测试。

o 系统测试:将已经确认的软件、硬件、外设、网络等元素结合在一起,进行信息系统的各种组装测试和确认测试,系统测试是针对整个产品系统进行的测试,目的是验证系统是否满足了需求规格的定义,找出与需求规格不符或与之矛盾的地方,从而提出更加完善的方案。

o 验收测试:在软件产品完成了单元测试、集成测试和系统测试之后,产品发布之前所进行的软件测试活动。它是技术测试的最后一个阶段,也称为交付测试。验收测试的目的是确保软件准备就绪,并且可以让最终用户将其用于执行软件的既定功能和任务。

6. 交付和维护 >>> 用户手册 / 操作手册

项目管理

· 版本控制:CVS/SVN/Git

· 自动构建:Ant/Maven/Ivy/Gradle

· 持续集成:Hudson/Jenkins

系统架构

· 负载均衡服务器:F5、A10

· 应用服务器:

§ HTTP服务器:Apache、NginX(HTTP、反向代理、邮件代理服务器)

§ Servlet容器:Tomcat、Resin

§ EJB容器:WildFly(JBoss Application Server)、GlassFish、Weblogic、Websphere

· 数据库服务器:MySQL、Oracle

第三方工具(插件)应用

· 图表工具:基于jQuery的图表插件(如jQchart、Flot、Charted等)、Chart.js、Highcharts等。[fusioncharts]

· 报表工具:Pentaho Reporting、iReport、DynamicReports等。

· 文档处理:POI、iText等。

· 工作流引擎:jBPM、OpenWFE、Snaker、SWAMP等。

· 作业调度:Quartz、JobServer、Oddjob等。

· 缓存服务:EhCache、memcached、SwarmCache等。

· 消息队列:Open-MQ、ZeroMQ等。

· 安全框架:Shiro、PicketBox等。

· 搜索引擎:IndexTank、Lucene、ElasticSearch等。

· Ajax框架:jQuery、ExtJS、DWR等。

· UI插件:EasyUI、MiniUI等。

· 富文本框:UEditor、CKEditor等。

面试提问

· 项目是为哪个公司开发的?项目的投入是多少?

· 有多少人参与了项目开发?整个团队中,测试人员、开发人员、项目经理比例是多少?

· 项目开发了多长时间?项目总的代码量有多少?你的代码量有多少?

· 项目采用了怎样的开发模型或开发流程?项目的架构是怎样的?项目的技术选型是怎样的?

· 你在项目中承担了怎样的职责?是否经常开会或加班?项目完成后有哪些收获或是经验教训?

· 项目中最困难的部分是什么?如何解决团队开发时遇到的各种冲突?

说明:对于没有实际项目经验的,可以在前程无忧、智联招聘、拉勾网等网站上搜索招聘Java程序员的公司,找到他们的官方网站了解他们做的项目,查看项目的详细介绍,然后尝试完成其中一部分功能,最好请教一下高人看看自己的设计和代码是否恰当,这样相当于积累了一定的项目经验。

面试题

  Java常见的面试题已经总结成《Java面试题集》、《Java面试题全集》以及《面试编程题拾遗》等文章陆续发布在我的CSDN博客,各大公司的面试题我会继续整理发布。

常见错误

1. 只在计算机上练习

2. 不做行为面试题演练

3. 不做模拟面试训练

4. 试图死记硬背答案

5. 不大声说出你的解题思路

6. 代码不够严谨

7. 不写测试代码

8. 轻言放弃

面试时可以反问面试官的问题

1. 我注意到你们使用了X技术,请问你们是如何解决Y问题的?

2. 为什么你们的产品使用了X技术而不是Y技术?据我所知,X技术虽然有A、B、C等好处,但也存在D和E问题,而Y技术可以解决D和E问题。

3. 我对您说的X技术不是太熟悉,但我感觉它是一个不错的解决方案,您能多讲讲它的工作原理吗?

4. 你们团队是如何进行项目规划的?一周会有几次例会?每周的代码量大概是多少?

5. 就X问题我能想到的解决方案目前就只有Y了,请问您会怎么解决这个问题?

S.A.R.法则

S.A.R法则是指先描述问题的场景,然后解释你采取的行动,最后陈述结果。

算法题的五种解法

1. 举例法:通过举例子发现其中的一般规则。

例子:圆内接三角形是锐角三角形的概率是多少?这是搜狗的一个面试题,可以在圆上随意画三个点连接成三角形就可以知道答案了。

2. 模式匹配法

例子:一个有序数组的元素经过循环移动,元素的顺序变成"3 4 5 6 1 2"。怎样找到数组中最小的那个元素,假设数组中的元素各不相同。这个题目和折半查找看起来是那么相似,因此可以借鉴折半查找的算法,最小元素显然出现在"mid > right"的转折点。

3. 简化推广法

说明:简化问题规模和数据类型,然后再发现通用的解法。

4. 简单构造法

例子:找出"abcde"的所有可能的排列组合。先考虑只有"a"的情况,再考虑"ab"的情况,以此类推。最终你可能会得到一个递归公式。这种方法往往会演变成递归法。

5. 数据结构头脑风暴法

例子:随机生成一些数字,并找出其中位数。这种问题可以在头脑中将你了解的数据结构过一遍,看看哪种是最合适的数据结构。上面的题目可以建立两个堆,一个大根堆和一个小根堆,较小的元素放在大根堆,较大的元素放在小根堆,如果两个堆不平衡,可以从其中一个堆取出元素放入另一个堆即可。最后中位数应该是两个堆的根之一。

录用谈判

1. 要理直气壮的提出具体的待遇要求

2. 开出比预期稍高的价码

3. 不要只盯着薪水(很多公司更愿意就薪水之外的条件做出让步)

4. 使用最合适的方法(可以尝试在电话或E-mail中谈判待遇)

自我评价

1. 学习能力(搞IT行业的人需要不断的了解新的技术、工具和方法)

2. 团队意识(相比个人英雄主义,IT行业更倡导团队合作)

3. 抗压能力(很多IT企业的工作强度相对来说还是比较大的)

分支详解


面试技巧

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执行过长的时间,你如何优化,从哪些方面?

答:

  1. 查看sql是否涉及多表的联表或者子查询,如果有,看是否能进行业务拆分,相关字段冗余或者合并成临时表(业务和算法的优化);
  2. 涉及链表的查询,是否能进行分表查询,单表查询之后的结果进行字段整合;
  3. 如果以上两种都不能操作,非要链表查询,那么考虑对相对应的查询条件做索引。加快查询速度;
  4. 针对数量大的表进行历史表分离(如交易流水表);
  5. 数据库主从分离,读写分离,降低读写针对同一表同时的压力,至于主从同步,MySQL有自带的binlog实现 主从同步;
  6. explain分析sql语句,查看执行计划,分析索引是否用上,分析扫描行数等等;
  7. 查看mysql执行日志,看看是否有其他方面的问题;

个人理解:从根本上来说,查询慢是占用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对这些中间件的连接器。不过异步处理中最关键的是事务保证的问题,这可能需要对事务的两步提交有所了解。

原文发布于微信公众号 - Java帮帮(javahelp)

原文发表时间:2018-02-26

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏大数据和云计算技术

新数仓系列:MongoDB关键能力和特性梳理

最近看一本书,铃木敏文的《零售的哲学》,里面提到一个很有意思的观点,711核心使命是提供便利,围绕便利场景,提供一系列食品、ATM服务等,而不是和超市去PK货物...

31660
来自专栏养码场

一位资深Java的阿里系公司实战面试经验,套路还是面试官的多

占小狼:一位奋斗在魔都的资深Java开发。去年6月在简书上发第一篇技术文章,已坚持发表76篇技术文章,粉丝数突破4000。

24470
来自专栏IT大咖说

华为:既满足用户体验,又节省功耗的App应用设计开发方法

18670
来自专栏恰童鞋骚年

操作系统核心原理-1.操作系统导论

PS:操作系统原理是大学计算机专业最为重要的一门专业基础课程之一,对于操作系统核心原理的理解对于一个合格的程序员来说十分重要,于是我继续我的“三大原理,两个协议...

12720
来自专栏温安适的blog

3个面试中遇到的问题

6月是个忙碌的月份,结完婚,处理完家事,也换了份工作。以至于6月都没有写blog,今天闲来无事,将之前面试的问题,以及一些感悟分享给大家。

18430
来自专栏csxiaoyao

USTC高级软件工程课程学习心得

394100
来自专栏Kirito的技术分享

一个DDD指导下的实体类设计案例

终于开通原创功能了,大家以后可以在文章下方留言了,欢迎交流。 1 前言 项目开发中的工具类代码总是随着项目发展逐渐变大,在公司诸多的公用代码中,笔者发现了一个...

40370
来自专栏架构说

如何阅读源码

从哪里开始读起,怎么读 这个问题简单,程序从哪里开始就哪里开始读起。譬如,C 代码,当然是从 main(),其他语言也是类似的。但阅读的时候,要带着问题去读。...

64550
来自专栏Linyb极客之路

你还在用if else吗?

面向过程设计和面向对象设计的主要区别是:是否在业务逻辑层使用冗长的if else判断。如果你还在大量使用if else,当然,界面表现层除外,即使你使用Java...

24240
来自专栏Java后端技术栈

记录一次壮烈牺牲的阿里巴巴面试!

今天本是一个阳光明媚,鸟语花香的日子。于是我决定在逛街中感受春日的阳光~结果晚上七点的时候,蚂蚁金服后端大佬来了电话,要进行一轮的技术面试。我一脸黑人问号???...

9710

扫码关注云+社区

领取腾讯云代金券