JAVA开发工程师面试笔试题(含答案)

Java、J2EE部分(100分)
1. hibernate对象有多少种状态?请具体描述每种状态的特点。(8分)
Hibernate的对象有3种状态,分别为:瞬时态(Transient)、持久态(Persistent)、脱管态(Detached).处于持久态的对象也称为PO(PersistenceObject),瞬时对象和脱管对象也称为VO(ValueObject).
瞬时态
由new命令开辟内存空间的java对象,
eg.Person person=new Person("xiaoxiao","女");
如果没有变量对该对象进行引用,它将被java虚拟机回收.
瞬时对象在内存孤立存在,它是携带信息的载体,不和数据库的数据有任何关联关系,在Hibernate中,可通过session的save()或saveOrUpdate()方法将瞬时对象与数据库相关联,并将数据对应的插入数据库中,此时该瞬时对象转变成持久化对象.
持久态
处于该状态的对象在数据库中具有对应的记录,并拥有一个持久化标识.如果是用hibernate的delete()方法,对应的持久对象就变成瞬时对象,因数据库中的对应数据已被删除,该对象不再与数据库的记录关联.
当一个session执行close()或clear()、evict()之后,持久对象变成脱管对象,此时持久对象会变成脱管对象,此时该对象虽然具有数据库识别值,但它已不在HIbernate持久层的管理之下.
持久对象具有如下特点:
1.和session实例关联;
2.在数据库中有与之关联的记录.
脱管态
当与某持久对象关联的session被关闭后,该持久对象转变为脱管对象.当脱管对象被重新关联到session上时,并再次转变成持久对象.
脱管对象拥有数据库的识别值,可通过update()、saveOrUpdate()等方法,转变成持久对象.
脱管对象具有如下特点:
1.本质上与瞬时对象相同,在没有任何变量引用它时,JVM会在适当的时候将它回收;
2.比瞬时对象多了一个数据库记录标识值.

2. hibernate查询对象集合有多少种方法?请列出具体方法名。(8分)
答:至少有以下4种:
1、session.createCriteria(Cat.class).list();
2、session.find("select https://www.360docs.net/doc/cf12377456.html, from Employee as employee " +
"where https://www.360docs.net/doc/cf12377456.html,=? ",name,Hibernate.STRING);
3、Query q = sess.createQuery("select https://www.360docs.net/doc/cf12377456.html, from Employee as employee where https://www.360docs.net/doc/cf12377456.html,=:name");
q.setString("name", "Jplateau");
//当有多个参数的时候在此逐一定义
Iterator employees = q.iterate();
4、Query qu =session.createSQLQuery("select user_account.NID, user_archive.* from user_account left outer join user_archive on user_account.NID = user_archive.NUSER_ID where user_account.NID = "+userId);

3. jsp有哪些内置对象?作用分别是什么?(9分)
答:JSP共有以下9种基本内置组件(可与ASP的6种内部组件相对应):
 request 用户端请求,此请求会包含来自GET/POST请求的参数
response 网页传回用户端的回应
pageContext 网页的属性是在这里管理
session 与请求有关的会话期
application servlet 正在执行

的内容
out 用来传送回应的输出
config servlet的构架部件
page JSP网页本身
exception 针对错误网页,未捕捉的例外

4. 如何将struts和spring结合起来,请给出具体的示例配置方法和说明。(10分)
答:struts+spring整合有3种方式,将servlet action 委托给spring来管理的这种方式优势最为显著.本次struts+spring整合测试就是采用委托的方法。
实施步聚:
首先在struts-config.xml文件中注册spring插件,如下所示。







其次将所有action标签中type属性设为org.springframework.web.struts.DelegatingActionProxy 也就是将action委托给了spring
因而在spring上下文applicationContext.xml中配置一个于action标签path属性对应的bean(也就是bean的name值等于action的path值),如:
struts-config.xml代码片段 :

path="/user" scope="request"
type="org.springframework.web.struts.DelegatingActionProxy"
validate="false" />

applicationContext.xml代码片段 :










到此基本的配置工作完成了。

5. Hibernate中的update()和saveOrUpdate()的区别,session的load()和get()的区别是什么?(8分)
答:saveOrUpdate()方法可以实现update()的功能,但会多些步骤,具体如下:
如果对象在该session中已经被持久化,不进行操作;
对象的标识符属性(identifier property)在数据库中不存在或者是个暂时的值,调用save()方法保存它;
如果session中的另一个对象有相同的标识符抛出一个异常;
以上皆不符合则调用update()更新之。

Session.load/get方法均可以根据指定的实体类和id从数据库读取记录,并返回与之对应的实体对象。其区别在于:
如果未能发现符合条件的记录,get方法返回null,而load方法会抛出一个ObjectNotFoundException;
load方法可返回实体的代理类实例,而get方法永远直接返回实体类;
load方法可以充分利用内部缓存和二级缓存中的现有数据,而get方法则仅仅在内部缓存中进行数据查找,如没有发现对应数据,将越过二级缓存,直接

调用SQL完成数据读取。

6. 给我至少两个你最常见到的runtime exception。(4分)
答:ArithmeticException, ArrayStoreException, BufferOverflowException, BufferUnderflowException, CannotRedoException, CannotUndoException, ClassCastException, CMMException, ConcurrentModificationException, DOMException, EmptyStackException, IllegalArgumentException, IllegalMonitorStateException, IllegalPathStateException, IllegalStateException, ImagingOpException, IndexOutOfBoundsException, MissingResourceException, NegativeArraySizeException, NoSuchElementException, NullPointerException, ProfileDataException, ProviderException, RasterFormatException, SecurityException, SystemException, UndeclaredThrowableException, UnmodifiableSetException, UnsupportedOperationException。

7. 给出spring事务管理中propagation的至少两个可选值,并说明他们的作用。(4分)
答:PROPAGATION_REQUIRED:如果当前没有事务,就新建一个事务,如果已经存在一个事务中,加入到这个事务中。这是最常见的选择。
PROPAGATION_SUPPORTS:支持当前事务,如果当前没有事务,就以非事务方式执行。 PROPAGATION_MANDATORY: 使用当前的事务,如果当前没有事务,就抛出异常。 PROPAGATION_REQUIRED_NEW:新建事务,如果当前存在事务,把当前事务挂起。PROPAGATION_NOT_SUPPORTED:以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
PROPAGATION_NEVER: 以非事务方式执行,如果当前存在事务,则抛出异常。 PROPAGATION_NESTED: 如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则执行与PROPAGATION_REQUIRED类似的操作。

8. struts2的拦截器类需要实现什么接口,该接口提供了哪些方法?(6分)
答:所有的Struts 2的拦截器都直接或间接实现接口com.opensymphony.xwork2.interceptor.Interceptor。该接口提供了三个方法:
1) void init(); 在该拦截器被初始化之后,在该拦截器执行拦截之前,系统回调该方法。对于每个拦截器而言,此方法只执行一次。
2) void destroy();该方法跟init()方法对应。在拦截器实例被销毁之前,系统将回调该方法。
3) String intercept(ActionInvocation invocation) throws Exception; 该方法是用户需要实现的拦截动作。该方法会返回一个字符串作为逻辑视图。

9. 请列出常用的4种hibernate的主键生成方式,并描述其机制。(8分)
答:1)assigned
主键由外部程序负责生成,无需Hibernate参与。

2) hilo
通过hi/lo 算法实现的主键生成机制,需要额外的数据库表保存主
键生成历史状态。

3) seqhilo
与hilo 类似,通过hi/lo 算法实现的主键生成机制,只是主键历史
状态保存在Sequence中,适用于支持Sequence的数据库,如Oracle。

4) increment
主键按数值顺序递增。此方式的实现机制为在当

前应用实例中维持
一个变量,以保存着当前的最大值,之后每次需要生成主键的时候
将此值加1作为主键。
这种方式可能产生的问题是:如果当前有多个实例访问同一个数据
库,那么由于各个实例各自维护主键状态,不同实例可能生成同样
的主键,从而造成主键重复异常。因此,如果同一数据库有多个实
例访问,此方式必须避免使用。

5) identity
采用数据库提供的主键生成机制。如DB2、SQL Server、MySQL
中的主键生成机制。

6) sequence
采用数据库提供的sequence 机制生成主键。如Oralce 中的
Sequence。

7) native
由Hibernate根据底层数据库自行判断采用identity、hilo、sequence
其中一种作为主键生成方式。

8) uuid.hex
由Hibernate基于128 位唯一值产生算法生成16 进制数值(编码后
以长度32 的字符串表示)作为主键。

9) uuid.string
与uuid.hex 类似,只是生成的主键未进行编码(长度16)。在某些
数据库中可能出现问题(如PostgreSQL)。

10) foreign
使用外部表的字段作为主键。
一般而言,利用uuid.hex方式生成主键将提供最好的性能和数据库平台适
应性。

另外由于常用的数据库,如Oracle、DB2、SQLServer、MySql 等,都提
供了易用的主键生成机制(Auto-Increase 字段或者Sequence)。我们可以在数
据库提供的主键生成机制上,采用generator-class=native的主键生成方式。
不过值得注意的是,一些数据库提供的主键生成机制在效率上未必最佳,
大量并发insert数据时可能会引起表之间的互锁。
数据库提供的主键生成机制,往往是通过在一个内部表中保存当前主键状
态(如对于自增型主键而言,此内部表中就维护着当前的最大值和递增量),
之后每次插入数据会读取这个最大值,然后加上递增量作为新记录的主键,之
后再把这个新的最大值更新回内部表中,这样,一次Insert操作可能导致数据
库内部多次表读写操作,同时伴随的还有数据的加锁解锁操作,这对性能产生
了较大影响。
因此,对于并发Insert要求较高的系统,推荐采用uuid.hex 作为主键生成
机制。

10. 请给出一个分页器框架的设计思路,包括查询条件展现及查询验证、后台数据生成,列表数据展示等。并详细描述实现方法(10分)。
答:可以使用查询模板的制作方法,将查询条件,数据库执行的sql语句,结果列表的字段和中文属性等配制在一个xml文档中。然后通过统一自定义标签读取相关信息。具体参考网资查询模板的相关文档。

11. 请谈一下你对线程安全的理解,并描述如何实现线程安全?(10分)
答:如果你的代码所在的进程中有多个线程在同时运行,而这些线程可能会同时运行这

段代码。如果每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线程安全的。
解决方法或过程:
1) 如果对象是immutable,则是线程安全的,例如:String,可以放心使用。
2) 如果对象是线程安全的,则放心使用。
3) 有条件线程安全,对于Vector和Hashtable一般情况下是线程安全的,但是对于某些特殊情况,需要通过额外的synchronized保证线程安全。
4) 使用synchronized关键字;
12. struts如何配置转发,如果需要有多个转发,则如何处理?(8)
答:struts1系列:struts首先会在元素中找对应的,若找不到,则到全局转发配置中找。它包含0个或多个元素,格式如下所示:

Eg.




元素还有一个redirect属性,其默认值为false,如果redirect设为true的时候,则用HttpServletResponse.sendRedirect()方法,否则用RequestDispatcher.forward()方法,缺省为false。
如果需要有多个转发,则配置多个forward,并写不同的name属性。
Strtus2系列:struts首先会在元素中找对应的,若找不到,则到全局转发配置中找,它包含0个或多个元素,格式如下所示:



/nologin.jsp
/nopermission.jsp
/error.jsp

如果需要有多个转发,则配置多个result,并写不同的name属性。

13. 编程题: 写一个Singleton出来。(7分)
答:Singleton模式主要作用是保证在Java应用程序中,一个类Class只有一个实例存在。
一般Singleton模式通常有几种种形式:
第一种形式: 定义一个类,它的构造函数为private的,它有一个static的private的该类变量,在类初始化时实例话,通过一个public的getInstance方法获取对它的引用,继而调用其中的方法。
public class Singleton {
private Singleton(){}
//在自己内部定义自己一个实例,是不是很奇怪?
//注意这是private 只供内部调用
private static Singleton instance = new Singleton();
//这里提供了一个供外部访问本class的静态方法,可以直接访问
public static Singleton getInstance() {
return instance;
}
}
第二种形式:
public class Singleton {
private static Singleton instance = null;
public static synchronized S

ingleton getInstance() {
//这个方法比上面有所改进,不用每次都进行生成对象,只是第一次
//使用时生成实例,提高了效率!
if (instance==null)
instance=new Singleton();
return instance; }
}
其他形式:
定义一个类,它的构造函数为private的,所有方法为static的。
一般认为第一种形式要更加安全些
Oracle部分(20分)
14. 现有表A,列名及数据如下:
Rq shengfu
2005-5-9 胜
2005-5-9 胜
2005-5-9 负
2005-5-9 负
2005-5-10 胜
2005-5-10 负
2005-5-10 负
如果要生成下列结果, 该如何写sql语句?
日期 胜 负
2005-5-9 2 2
2005-5-10 1 2
(4分)
答:1)select rq 日期, sum(case when shengfu='胜' then 1 else 0 end) 胜,sum(case when shengfu='负' then 1 else 0 end) 负 from A group by rq
2) select N.rq 日期,N.胜,M.负from (
select rq, count(*) from A where shengfu='胜'group by rq胜)N inner join
(select rq, count(*) from #tmp where shengfu='负'group by rq 负)M on N.rq=M.rq。

15. 解释FUNCTION,PROCEDURE和PACKAGE区别。(6分)
答:function 和procedure是PL/SQL代码的集合,通常为了完成一个任务。procedure 不需要返回任何值而function将返回一个值在另一方面,Package是为了完成一个商业功能的一组function和proceudre的集合。

16. 解释索引有什么优点,是否可以给表上的每个字段都创建索引以提高效率,为什么?(10分)
答:创建索引可以大大提高系统的性能。第一,通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。第二,可以大大加快数据的检索速度,这也是创建索引的最主要的原因。第三,可以加速表和表之间的连接,特别是在实现数据的参考完整性方面特别有意义。第四,在使用分组和排序子句进行数据检索时,同样可以显著减少查询中分组和排序的时间。第五,通过使用索引,可以在查询的过程中,使用优化隐藏器,提高系统的性能。
一般情况下不会给标上的所有字段创建索引,增加索引也有许多不利的一个方面。第一,创建索引和维护索引要耗费时间,这种时间随着数据量的增加而增加。第二,索引需要占物理空间,除了数据表占数据空间之外,每一个索引还要占一定的物理空间,如果要建立聚簇索引,那么需要的空间就会更大。第三,当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,这样就降低了数据的维护速度。


相关文档
最新文档