think in java interview-高级开发人员面试宝典(九)

think in java interview-高级开发人员面试宝典(九)

目录(?)[+]

  1. 模拟面试

  2. 进入面试官的头脑

    1. CORE JAVA的一些基础是肯定逃不掉的如

    2. 多线程

    3. 问点J2EE问题吧

    4. 再问一些Hibernate吧

    5. 哦还有人撑到现在没有say 88好下面继续

    6. 从简历上看oracle用了48个月4年我还看到过用了6年7年的呢我们问点Oracle相关的问题吧

    7. 智力题这块我们放在第十天中来讲

  3. 结束语

模拟面试

今天来谈一下出于面试官的角度,他是会如何去考虑给一个侯选人面试的。


下面先来看一份简历的摘要。


熟练掌握SPRING, STRUTS1, 2, HIBERNATE;

J2EE方面5年工作经验;

ORACLE使用经验48个月;

熟练掌握JAVA缓存机制;

了解工作流、ERP、EAI工作机制并有实际项目经验;


老实说,一般面试官看到上面的简历就会想让这个人来面试了,因为真的你SSH,ORACLE,ERP或者是EAI等工作过5年很利害了已经,于是面试官在F2F(Face To Face)面试前会先准备一些题目。

一般他会做一些下面的准备,大家来看看这些题目,然后自己不用GOOGLE和书,试着去回答一下,就当是一次面试。


进入面试官的头脑

面试官会想,这个人J2EE有5年工作经验,JAVA一定很熟,我会先从JAVA方面入手。


1. CORE JAVA的一些基础是肯定逃不掉的,如


a) HashMap, TreeMap的机制、源码片段这个侯选人肯定应该能够分析、了解和掌握了。


b) Comparable与Comparator接口的使用。


c) stack的原理,如:计算({[<>]}这样的左边括号和右边的括号是否匹配,就可能通过stack的pop, push原理去实现。


d) 单向链表,双向链表的完型填空。


e) 序列化与反序列化的具体用法


f) HashCode Equals的原理,怎么写,算法,为什么要HashCode Equals,两个对象如果Equals了是不是HashCode一定相等,反之呢?


g) GOF设计模式考个2-3道,主要是问侯选人碰到这样的情形用什么设计模式;装饰模式和工厂模式和侯选人搞一下脑子,什么是ITERATOR模式。

让侯选人自己写一个ITERATOR看看,去一个饭店点菜,每个饭店里都有一个菜单,然后顾客根据这个菜单点菜,这是一个什么设计模式?能否写一个菜单和顾客点菜的这样的一个设计模式来呢(享元设计模式)。


h) JAVA垃圾回收机制


i) 从《深入理解JAVA虚拟机》这本书里抽一道关于JDK平台的架构问题如:JAVA的新生代和老年代怎么安排他们的比例较好,新生代里放的是什么,老年代里放的又是什么?


j) 最后来两道数据结构,排序是肯定要考的,如果这个侯选人开价较高,给他一道归并排序,归并排序归并排序归并排序,有没有,大家还记得吗?呵呵呵!

除了排序后,给侯选人来一道较难的,如:约瑟夫环问题,汉诺塔问题,傅立叶级数问题,求极限问题,迷宫问题(有如何生成迷宫和走出迷宫两种问题)。


2. 多线程

a)两个线程间如何通讯(不是WAIT, NOTIFY这种简单的哦),比如说一个线程如何传一个含有复杂结构的对象到另一个线程,对于批量数据如:读一个含有数百万行记录的.txt文本文件看看侯选人有什么实际能力。


b)线程锁的机制, synchronized关键字的用法,作用在method上,作用在method内以 synchronized(this){}开头的用法,synchronized(Object)的用法;

public synchronized static method(){}又是如何使用的它和public synchronized method()有何区别?

在JDK1.6中有什么好的方法可以代替synchronized,lock关键字的使用。


c)阻塞队列的作用?JDK1.5后的阻塞队列是怎么用的,用阻塞队列来模拟一个可以执行100个TASK的TASK POOL,即我有一个工作池,里面可以同时处理100条任务。

此时我有一个客户端,不断的往工作池里加任务,能否给出你的核心设计,拿支mark笔在黑板上画出。

同时请给出你认为比较优化的task pool的设计,并且给面试官解释一下你的设计 。


3. 问点J2EE问题吧

a) 侯选人用过Spring,Spring中AOP, IOC举个实际应用场景吧


b) 我在SPRING里把一个PROPERTIES文件注入,然后我在SPRING框架Coding时只要通过get properties文件中的一个key就可以得到这个value,相当于我不需要每次在读写properties文件时要输入或算出properties文件当前所在的入径,通过spring的context就可以得到这个properties文件的内容了。


c) 在spring中,一个类child继承自一个abstract的parent类,该child类要作为@Service到处注入的,在spring的配置文件中如何写法?


d) 切面,SPRING的事务管理用过吧?用过,说一下SPRING中“事务的传播性”,有没有,有没有!事务切在Dao层,切在Service层,为什么要切在Dao层,为什么要切在Service层。


e) 除了事务你还作过哪些Spring方面的AOP编程? 不要和我说对操作的method进行日志记录这个例子,因为SPRING出来时就是拿这两个例子来讲它的特性,是个JAVA程序员都知道。


你可以说说看Spring Batch里的“event" "flow",不知大家看过没;

你可以说说看Spring与Ehcache的结合,利用AOP来模拟Hibernate里的二有缓存;


f) Spring JdbcTemplate的用法,这个肯定要考到的吧,对吧


g) 说一下jsp中有哪些”隐式对象“,以及他们的用法

总之九大隐式对象:
输入输出的:request,response,out
作用域的:session,application,pageContext
Servlet的:page,config,exception


h) servlet的生命周期

Servlet生命周期分为三个阶段:

  1,初始化阶段  调用init()方法

  2,响应客户请求阶段  调用service()方法

  3,终止阶段  调用destroy()方法

Servlet初始化阶段:

  在下列时刻Servlet容器装载Servlet:

    1、Servlet容器启动时自动装载某些Servlet,实现它只需要在web.XML文件中的<Servlet></Servlet>之间添加如下代码:

<loadon-startup> 1 </loadon-startup>

    2、在Servlet容器启动后,客户首次向Servlet发送请求

    3、Servlet类文件被更新后,重新装载Servlet

  Servlet被装载后,Servlet容器创建一个Servlet实例并且调用Servlet的init()方法进行初始化。在Servlet的整个生命周期内,init()方法只被调用一次。


Servlet工作原理:

  首先简单解释一下Servlet接收和响应客户请求的过程,首先客户发送一个请求,Servlet是调用service()方法对请求进行响应的,通过源代码可见,service()方法中对请求的方式进行了匹配,选择调用doGet,doPost等这些方法,然后再进入对应的方法中调用逻辑层的方法,实现对客户的响应。在Servlet接口和GenericServlet中是没有doGet,doPost等等这些方法的,HttpServlet中定义了这些方法,但是都是返回error信息,所以,我们每次定义一个Servlet的时候,都必须实现doGet或doPost等这些方法。

  每一个自定义的Servlet都必须实现Servlet的接口,Servlet接口中定义了五个方法,其中比较重要的三个方法涉及到Servlet的生命周期,分别是上文提到的init(),service(),destroy()方法。GenericServlet是一个通用的,不特定于任何协议的Servlet,它实现了Servlet接口。而HttpServlet继承于GenericServlet,因此HttpServlet也实现了Servlet接口。所以我们定义Servlet的时候只需要继承HttpServlet即可。

  Servlet接口和GenericServlet是不特定于任何协议的,而HttpServlet是特定于HTTP协议的类,所以HttpServlet中实现了service()方法,并将请求ServletRequest,ServletResponse强转为HttpRequest和HttpResponse。

public void service(ServletRequest req,ServletResponse res)
throws ServletException,IOException
{
HttpRequest request;
HttpResponse response;
try
{
req = (HttpRequest)request;
res = (HttpResponse)response;
} catch (ClassCastException e)
{
throw new ServletException( "non-HTTP request response" );
}
service(request,response);
}

   代码的最后调用了HTTPServlet自己的service(request,response)方法,然后根据请求去调用对应的doXXX方法,因为HttpServlet中的doXXX方法都是返回错误信息,

protected void doGet(HttpServletRequest res,HttpServletResponse resp)
throws ServletException,IOException
{
String protocol = req.getProtocol();
String msg = IStrings.getString( "http.method_get_not_supported" );
if (protocol.equals( "1.1" ))
{
resp.sendError(HttpServletResponse.SC.METHOD.NOT.ALLOWED,msg);
}
esle
{
resp.sendError(HttpServletResponse.SC_BAD_REQUEST,msg);
}
}

所以需要我们在自定义的Servlet中override这些方法!


源码面前,了无秘密!

---------------------------------------------------------------------------------------------------------------------------------

Servlet响应请求阶段:

  对于用户到达Servlet的请求,Servlet容器会创建特定于这个请求的ServletRequest对象和ServletResponse对象,然后调用Servlet的service方法。service方法从ServletRequest对象获得客户请求信息,处理该请求,并通过ServletResponse对象向客户返回响应信息。

  对于Tomcat来说,它会将传递过来的参数放在一个Hashtable中,该Hashtable的定义是:


private Hashtable<String String[]> paramHashStringArray = new Hashtable<String String[]>();


  这是一个String-->String[]的键值映射。

  HashMap线程不安全的,Hashtable线程安全。

-----------------------------------------------------------------------------------------------------------------------------------

Servlet终止阶段:

  当WEB应用被终止,或Servlet容器终止运行,或Servlet容器重新装载Servlet新实例时,Servlet容器会先调用Servlet的destroy()方法,在destroy()方法中可以释放掉Servlet所占用的资源。


-----------------------------------------------------------------------------------------------------------------------------------

Servlet何时被创建:

  1,默认情况下,当WEB客户第一次请求访问某个Servlet的时候,WEB容器将创建这个Servlet的实例。

  2,当web.xml文件中如果<servlet>元素中指定了<load-on-startup>子元素时,Servlet容器在启动web服务器时,将按照顺序创建并初始化Servlet对象。

  注意:在web.xml文件中,某些Servlet只有<serlvet>元素,没有<servlet-mapping>元素,这样我们无法通过url的方式访问这些Servlet,这种Servlet通常会在<servlet>元素中配置一个<load-on-startup>子元素,让容器在启动的时候自动加载这些Servlet并调用init()方法,完成一些全局性的初始化工作。


Web应用何时被启动:

  1,当Servlet容器启动的时候,所有的Web应用都会被启动

  2,控制器启动web应用

-----------------------------------------------------------------------------------------------------------------------------------------------

Servlet与JSP的比较:

  有许多相似之处,都可以生成动态网页。

  JSP的优点是擅长于网页制作,生成动态页面比较直观,缺点是不容易跟踪与排错。

  Servlet是纯Java语言,擅长于处理流程和业务逻辑,缺点是生成动态网页不直观。

i) Struts1和Struts2的核心区别

可以参看之前关于Strus1的相关博客

j) Strutss2中常用的几个拦截器的用法(面试官可是会问里面的关键方法的使用的哦,因此你光会背STURTS2里有几个拦截器也是没有用的)


k) 改变一个request中的值,然后把改变的值再放回该request

request.getParamater("sdf")


L) 你说你用过缓存,如果我的应用布署在一个集群运用中,你的缓存是怎么设计的?每个集群节点一个缓存?那你有没有全局缓存,全局缓存你是怎么用在集群上的?


4. 再问一些Hibernate吧

a) 哦,你用过Hibernate,和我说一下Hibernate里我要对一张表进行锁定是怎么做的

乐观锁悲观锁,这个在Hibernate博客里面有详细的介绍;


b) 说一下Hibernate里evict, flush两个关键方法的区别

evict是将缓存里面的东东全部清除掉

flush是将缓存里面的东东全部放到DB里面


c) 用Hibernate插入1万条数据,怎么做,有什么好的优化方法吗

有3种优化方案:

1、采用批处理,每次批量插入30或50条就执行以下SQL的提交查询

2、采用JDBC API来执行大量数据的插入

3、调用存储过来来执行大量数据的插入

详细请看关于Hibernate的博客


d) Hibernate的sessionFactory是怎么管理的,ThreadLocal的SessionFactory和非ThreadLocal的SessionFactory。


e) Hibernate和Spring结合后为什么我们就不用手动关闭SessionFactory了,不要和我说因为Spring帮我们关了,废话,是个人都知道,但原理是什么?是Spring里在哪边并且是怎么去帮我们关的?


一般来说spring内部已经封装了对Hibernate的session的开启和关闭,但是是它是在你用到super.getHibernateTemplate()时就会开启session,用完session就会关闭

f) Hibernate里 lazy loading的用法,由其是fetch关键字是怎么用的


5. 哦!!!还有人撑到现在?没有say 88?好,下面继续

基本上,我们的问题问到这边,有些本来很自信的侯选人,应该有几个已经动怒了。

这些侯选人本来准备好的面试问题,结果在我们这边面到现在这个地步已经一塌糊涂了,这时可以问一下他们有什么问题,或者问一下他为什么要离开上家公司,然后基本可以和他们say 88了。


6. 从简历上看oracle用了48个月,4年(我还看到过用了6年,7年的呢),我们问点Oracle相关的问题吧

a) 什么叫数据库设计范式,来,把5个范式说一下,然后给你几个例题,让你说出,这样的设计是符合第一、第二、第三还是第四、第五范式,光背可没有用哦,呵呵呵。


b) 说过了数据库设计范式,什么叫反范式呢?


c) 做了48个月的Oracle了,对于日志归档,flashrecovery,SGA, PGA的设置管理及原理因该很知道了


e) 在plsql中选取100万条数据写成txt文件怎么做?只依赖于plsql


f) orace中的索引有几种,分别应用在何种场景


g) 给出一个sql,请用plsql的分析器即analyze来分析一下这条SQL的性能如何,有哪几个关键指标是你需要看的,什么叫hashjoin, 什么叫nestedloop


h) 用exist, not exist代替in的写法


i) 从我上次写的面试宝典第6天和第7天的那近百道SQL里选2道让侯选人写写看,以此来看侯选人的SQL能力


j) ORACLE中的bitmap 和 btree索引,说一下原理


k) 有没有必要对FK建索引啊?如果建和不建分别在ORACLE中会是什么样啊?


7. 智力题(这块我们放在”第十天“中来讲)


结束语:


基本到此为止,相信50个侯选人里可能真正能够满足:


第一部分CORE JAVA答对70%以上


第二部分多线程答对60%以上


第三和第四部分合起来 答对70%以上


第六部分能够答对50%以上(但2道SQL题必须有一道是全答出,另一道复杂的可以写出思路和核心语句,不一定全答出)


第七部分智力题中,能够给出自己的想法,思路的,不一定得出最后答案(因为这种题很特别,有些侯选人没有这种思考习惯或者是准备过的是基本答不出的)。


另外对于一些500强内的公司,侯选人面临的还可能是第一部分、第二部分、第三、第四部分是全英语问答!


能够满足上述条件的大概人不多,50个里可能有1,2个满足吧,这点我没有夸张,这1,2个人,才是真正符合JAVA高级程序员资格的(当然,我指的是真的搞纯技术的一些公司、职位或者是部门),我的“面经”也是对于真正搞技术的,纯技术开发人员而言的,是这样的。


因此高级程序员不是这么好做的,面试也不是这么好准备的,不是靠一、两天突击背背维基百科上根据名词搜到的理论就行的,是要靠长期的积累,准备的。


在此我也只是给出一个准备的范围,要准备哪些东西,哪些方面是大家平时容易疏忽的。


今天就到这吧,第十天将集中探讨一些和任何语言无关的智力题,一些知名企业是必考这些的。


你可能感兴趣的:(java,in,think)