java开发面试技巧.docx
《java开发面试技巧.docx》由会员分享,可在线阅读,更多相关《java开发面试技巧.docx(20页珍藏版)》请在冰点文库上搜索。
java开发面试技巧
java开发面试技巧
【篇一:
java工程师面试题大全-100%公司笔试题你都能碰到几个】
1.hibernate中离线查询去除重复项怎么加条件?
?
dc.setresulttransformer(criteria.distinct_root_entity);
2.http协议及端口,smtp协议及端口
http:
超文本传输协议端口80
smtp:
简单邮件传输协议端口25
3.编写程序,完成文件复制功能
4.servlet创建过程及生命周期servlet在容器中运行时,其实例的创建及销毁等是由容器进行控制。
servlet的创建有两种方法。
1).客户端请求对应的servlet时,创建servlet实例;大部分servlet都是这种servlet。
2).通过在web.xml中设置load-on-startup来创建servlet实例,这种实例在web应用启动时,立即
创建servlet实例
servlet的运行都遵循如下生命周期:
1).创建servlet实例。
2).web容器调用servlet的init()方法,对servlet进行初始化。
3).servlet初始化后,将一直存在于容器中,用于响应客户端请求。
根据客户端的请求方式通过servlet
中service()方法去相应的doxxx()方法;
4).web容器销毁servlet时,调用servlet的destroy()方法,通常在关闭web容器之时销毁
servlet。
5.用sql语句分页:
mysql数据库:
selecttop页大小*fromtable1whereidnotin(
selecttop页大小*(页数-1)idfromtable1orderbyid
)orderbyid
oracle数据库:
在oracle大数据量下的分页解决方法。
一般用截取id方法,还有是三层嵌套方法。
截取id的方法
select*fromempa,(selectempno,rownumasnumfromemp)bwherea.empno=b.empnoandb.numbetween5and7;
三层嵌套
select*from(selecta.*,rownumrfrom(select*fromemp)awhererownum=7)bwherer5;
6.list.map.set的存储特点?
list以特定次序来持有元素,可有重复元素.
set无法拥有重复元素,内部排序.
map保存key-value值,value可多值
7.final,finally,finaliz的区别
final—修饰符(关键字)如果一个类被声明为final,意味着它不能再派生出新的子类,不能作为父类被继承。
因此一个类不能既被声明为abstract的,又被声明为final的。
将变量或方法声明为final,可以保证它们在使用中不被改变。
被声明为final的变量必须在声明时给定初值,而在以后的引用中只能读取,不可修改被声明为final的方法也同样只能使用,不能重载。
finally—再异常处理时提供finally块来执行任何清除操作。
如果抛出一个异常,那么相匹配的catch子句就会执行,然后控制就会进入finally块(如果有的话)。
finalize—方法名。
java技术允许使用finalize()方法在垃圾收集器将对象从内存中清除出去之前做必要的清理工作。
这个方法是由垃圾收集器在确定这个对象没有被引用时对这个对象调用的。
它是在object类中定义的,因此所有的类都继承了它。
子类覆盖;finalize()方法以整理系统资源或者执行其他清理工作finalize()方法是在垃圾收集器删除对象之前对这个对象调用的。
8.arraylist和vector的区别?
1).同步性:
vector是线程安全的,也就是说是同步的,而arraylist是线程不安全的,不是同步的
2).数据增长:
当需要增长时,vector默认增长为原来一培,而arraylist却是原来的一半
9.说出arraylist,vector,linkedlist的存储性能和特性?
1).arraylist采用的是数组形式来保存对象的,这种方式将对象放在连续的位置中,所以最大的缺点就是
插入删除时非常麻烦linkedlist采用的将对象存放在独立的空间中,而且在每个空间中还保存下一个链接的索引但是缺点就是查找非常麻烦要丛第一个索引开始
2).arraylist和vector都是用数组方式存储数据,此数组元素数要大于实际的存储空间以便进行元素增加
和插入操作,他们都允许直接用序号索引元素,但是插入数据元素涉及到元素移动等内存操作,所以索引数据快而插入数据慢.
3).vector使用了sychronized方法(线程安全),所以在性能上比arraylist要差些.
4).linkedlist使用双向链表方式存储数据,按序号索引数据需要前向或后向遍历数据,所以索引数据慢,是
插入数据时只需要记录前后项即可,所以插入的速度快.
10.hashmap,hashtable区别
1.hashtable是dictionary的子类,hashmap是map接口的一个实现类;
2.hashtable中的方法是同步的,而hashmap中的方法在缺省情况下是非同步的。
3.在hashmap中,null可以作为键,这样的键只有一个;可以有一个或多个键所对应的值为null。
11..描述cookie和session的作用,区别和各自的应用范围,session工作原理
session用于保存每个用户的专用信息.每个客户端用户访问时,服务器都为每个用户分配一个唯一的会话id(sessionid).她的生存期是用户持续请求时间再加上一段时间(一般是20分钟左右).session
中的信息保存在web服务器内容中,保存的数据量可大可小.当session超时或被关闭时将自动释放保存的数据信息.由于用户停止使用应用程序后它仍然在内存中保持一段时间,因此使用session对象使保存用户数据的方法效率很低.对于小量的数据,使用session对象保存还是一个不错的选择
cookie用于保存客户浏览器请求服务器页面的请求信息,程序员也可以用它存放非敏感性的用户信息,信息保存的时间可以根据需要设置.如果没有设置cookie失效日期,它们仅保存到关闭浏览器程序为止.如果将cookie对象的expires属性设置为minvalue,则表示cookie永远不会过期.cookie存储的数据量很受限制,大多数浏览器支持最大容量为4k,因此不要用来保存数据集及其他大量数据.由于并非所有的浏览器都支持cookie,并且数据信息是以明文文本的形式保存在客户端的计算机中,因此最好不要保存敏感的,未加密的数据,否则会影响网站的安全性
session工作原理
(1)当有session启动时,服务器生成一个唯一值,称为sessionid(好像是通过取进程id的方式取得的)。
(2)然后,服务器开辟一块内存,对应于该sessionid。
(3)服务器再将该sessionid写入浏览器的cookie。
(4)服务器内有一进程,监视所有session的活动状况,如果有session超时或是主动关闭,服务器就释放改内存块。
(5)当浏览器连入iis时并请求的asp内用到session时,iis就读浏览器cookie中的sessionid。
(6)然后,服务检查该sessionid所对应的内存是否有效。
(7)如果有效,就读出内存中的值。
(8)如果无效,就建立新的session。
12.string和stringbuffer进行字符串连接时的区别?
string对项内容是不可改变的,stringbuffer是可以改变的,且高效;
13.什么叫项目?
用有限的资源、有限的时间为特定客户完成特定目标的一次性工作
14..j2eej是什么意思?
2是什么意思ee是什么意思?
struts的拦截器你是怎么做的,是独立开发的,能
够独立开发的到。
然后问有哪几种拦截?
java2platform,enterpriseedition
继承abstractinterceptor类,覆盖intercept()方法
有struts自己的拦截器如timer,i18n,scop,servletconfig,token
还有自定义拦截器
15.简单介绍下java?
spring的aop,ioc的讲述对struts2的了解,1,2的比较xml的了解j2ee的
webserviced的协议?
springaop:
代理机制spring提供的自动代理机制
spring的ioc来实组件之间的依赖关系注入,使控制层与业务实现分离,即客户通过
调用业务委托接口来调用具体的业务组件的实例,避免控制层与业务层的藕合带来的维护
或升级困难。
由spring为dao生成代理对象来为dao添加事务服务,由ioc容器dao的代理实例注入到业务组件中,业务组件通过dao的委托接口调用dao对象,使得上层组件不直接依赖于dao的实现类,使得持久层更换或修改不影响上层组件。
16.collections,collection的区别
collection是个java.util下的接口,它是各种集合结构的父接口。
collections是个java.util下的普通类,它包含有各种有关集合操作的静态方法。
collections是针对集合类的一个帮助类,它提供一系列的静态方法实现对各种集合的搜索,排序,线程安全化等操作
17.如何释放过度使用的undo表空间
1.启动sqlplus,并用sys登陆到数据库。
2.查找数据库的undo表空间名3.确认undo表空间;sqlselectnamefromv$tablespace;4.检查数据库undo表空间占用空间情况以及数据文件存放位置;5.查
看回滚段的使用情况,哪个用户正在使用回滚段的资源,如果有用户最好更换时间6.检查undosegment状态
18.数据库里面游标,索引是怎么用的?
在oracle数据库中,用get和load方法这2个方法来查没有的数
据那么分别会反馈什么样的结果?
declarecurcursorkeysetfor
get返回null,loadclassnotfoundexception
19..在oracle中数据库中的一个表中,这个表没有主键id也没有特定标示来查数据,怎么查?
rowid
20.简述private、proteced、public、internal修饰符的访问权限
同一个类同一个包不同包的子类不同包非子类
private*
default**
protected***
public****
21.概述反射和序列化
reflection是java被视为动态(或准动态)语言的一个关键性质。
这个机制允许程序在运行时透过reflectionapis取得任何一个已知名称的class的内部信息,包括其modifiers(诸如public,static等等)、superclass(例如object)、实现之interfaces(例如cloneable),也包括fields和methods的所有信息,并可于运行时改变fields内容或唤起methods。
本文借由实例,大面积示范reflectionapis。
22.序列化就是一种用来处理对象流的机制,所谓对象流也就是将对象的内容进行流化。
可以对流化后的对象
进行读写操作,也可将流化后的对象传输于网络之间。
序列化是为了解决在对对象流进行读写操作时所引发的问题。
序列化的实现:
将需要被序列化的类实现serializable接口,该接口没有需要实现的方法,implementsserializable只是为了标注该对象是可被序列化的,然后使用一个输出流(如:
fileoutputstream)来构造一个objectoutputstream(对象流)对象,接着,使用objectoutputstream对象的writeobject(objectobj)方法就可以将参数为obj的对象写出(即保存其状态),要恢复的话则用输入流
23.oracle中not和and和or优先级由高到低?
notandor
24.java是如何进行异常处理的
java通过面向对象的方法进行异常处理,把各种不同的异常进行分类,并提供了良好的接口。
在java中,每个异常都是一个对象,它是throwable类或其它子类的实例。
当一个方法出现异常后便抛出一个异常对象,该对象中包含有异常信息,调用这个对象的方法可以捕获到这个异常并进行处理。
java的异常处理是通过5个关键词来实现的:
try、catch、throw、throws和finally。
一般情况下是用try来执行一段程序,如果出现异常,系统会抛出(throws)一个异常,这时候你可以通过它的类型来捕捉(catch)它,或最后(finally)由缺省处理器来处理
25.struts2必备包
commons-fileupload-1.2.1.jar
freemarker-2.3.13.jar
ognl-2.6.11.jar
struts2-core-2.1.6.jar
xwork-2.1.2.jar
26.dao是什么及作用
dao是数据访问对象dao负责管理与数据源的连接来获取和储存其中的数据
27.ibatis中的#与$的区别在ibatis中我们使用sqlmap进行sql查询时需要引用参数,在参数引用中遇到的符号#和$之间的区分为,#可以进行与编译,进行类型匹配,而$不进行数据类型匹配,例如:
select*fromtablewhereid=#id#,其中如果字段id为字符型,那么#id#表示的就是id类型,如果id为整型,那么#id#就是id类型。
select*fromtablewhereid=$id$,如果字段id为整型,sql语句就不会出错,但是如果字段id为字符型,那么sql语句应该写成select*fromtablewhereid=$id$
28.struts2的实现原理
1、客户端初始化一个指向servlet容器(例如tomcat)的请求
2、这个请求经过一系列的过滤器(filter)(这些过滤器中有一个叫做actioncontextcleanup的可选过滤器,这个过滤器对于struts2和其他框架的集成很有帮助,例如:
sitemeshplugin);
3、接着filterdispatcher被调用,filterdispatcher询问actionmapper来决定这个请求是否需要调用某个action;
4、如果actionmapper决定需要调用某个action,filterdispatcher把请求的处理交给actionproxy;
5、actionproxy通过configurationmanager询问框架的配置文件,找到需要调用的action类;
6、actionproxy创建一个actioninvocation的实例。
7、actioninvocation实例使用命名模式来调用,在调用action的过程前后,涉及到相关拦截器(intercepter)的调用。
8、一旦action执行完毕,actioninvocation负责根据struts.xml中的配置找到对应的返回结果。
返回结果通常是(但不总是,也可能是另外的一个action链)一个需要被表示的jsp或者freemarker的模版。
在表示的过程中可以使用struts2框架中继承的标签。
在这个过程中需要涉及到actionmapper
29.简述spring的事务传播行为和隔离级别
spring的事务传播行为:
spring在transactiondefinition接口中规定了7种类型的事务传播行为,它们规定了事务方法和事务方法发生嵌套调用时事务如何进行传播:
propagation_required:
如果当前没有事务,就新建一个事务,如果已经存在一个事务中,加入到这个事务中。
这是最常见的选择。
propagation_supports:
支持当前事务,如果当前没有事务,就以非事务方式执行。
propagation_mandatory:
使用当前的事务,如果当前没有事务,就抛出异常。
propagation_requires_new:
新建事务,如果当前存在事务,把当前事务挂起。
propagation_not_supported:
以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
propagation_never:
以非事务方式执行,如果当前存在事务,则抛出异常。
propagation_nested:
如果当前存在事务,则在嵌套事务内执行。
如果当前没有事务,则执行与propagation_required类似的操作。
spring的隔离级别
1、serializable:
最严格的级别,事务串行执行,资源消耗最大;
2、repeatableread:
保证了一个事务不会修改已经由另一个事务读取但未提交(回滚)的数据。
避免了“脏读取”和“不可重复读取”的情况,但是带来了更多的性能损失。
3、readcommitted:
大多数主流数据库的默认事务等级,保证了一个事务不会读到另一个并行事务已修改但未提交的数据,避免了“脏读取”。
该级别适用于大多数系统。
4、readuncommitted:
保证了读取过程中不会读取到非法数据。
30.写一段把本地文件formfile拷贝到本地文件tofile的程序
publicclasschangejtdtojava{
publicstaticvoidmain(string[]args){
filedir=newfile(f:
/jtd);
【篇二:
java常见面试题及解答2015版】
java常见面试题及解答(精华)
1)transient和volatile是java关键字吗?
(瞬联)
如果用transient声明一个实例变量,当对象存储时,它的值不需要维持。
例如:
classt
{
transientinta;//不需要维持
intb;//需要维持
}
这里,如果t类的一个对象写入一个持久的存储区域,a的内容不被保存,但b的将被保存。
volatile修饰符告诉编译器被volatile修饰的变量可以被程序的其他部分改变。
在多线程程序中,有时两个或更多的线程共享一个相同的实例变量。
考虑效率问题,每个线程可以自己保存该共享变量的私有拷贝。
实际的变量副本在不同的时候更新,如当进入synchronized方法时。
用strictfp修饰类或方法,可以确保浮点运算(以及所有切断)正如早期的java版本那样准确。
切断只影响某些操作的指数。
当一个类被strictfp修饰,所有的方法自动被strictfp修饰。
strictfp的意思是fp-strict,也就是说精确浮点的意思。
在java虚拟机进行浮点运算时,如果没有指定strictfp关键字时,java的编译器以及运行环境在对浮点运
算的表达式是采取一种近似于我行我素的行为来完成这些操作,以致于得到的结果往往无法令你满意。
而一旦使用了strictfp来声明一个类、接口或者方法时,那么所声明的范围内java的编译器以及运行环境会完全依照浮点规范ieee-754来执行。
因此如果你想让你的浮点运算更加精确,而且不会因为不同的硬件平台所执行的结果不一致的话,那就请用关键字strictfp。
你可以将一个类、接口以及方法声明为strictfp,但是不允许对接口中的方法以及构造函数声明strictfp关键字,例如下面的代码:
strictfpinterfacea{}
publicstrictfpclassfpdemo1{
strictfpvoidf(){}
}
2.错误的使用方法
interfacea{
strictfpvoidf();
}
publicclassfpdemo2{
strictfpfpdemo2(){}
}
一旦使用了关键字strictfp来声明某个类、接口或者方法时,那么在这个关键字所声明的范围内所有浮点运算都是精确的,符合ieee-754规范
的。
例如一个类被声明为strictfp,那么该类中所有的方法都是strictfp的。
2)抽象类和接口有什么区别?
(瞬联)
1.abstractclass在java语言中表示的是一种继承关系,一个类只能使用一次继承关系。
但是,一个类却可以实现多个interface。
2.在abstractclass中可以有自己的数据成员,也可以有非abstarct的成员方法,而在interface中,只能够有静态的不能被修改的数据成员(也就是必须是staticfinal的,不过在interface中一般不定义数据成员),所有的成员方法都是abstract的。
3.abstractclass和interface所反映出的设计理念不同。
其实abstractclass表示的是is-a关系,interface表示的是like-a关系。
4.实现抽象类和接口的类必须实现其中的所有方法。
抽象类中可以有非抽象方法。
接口中则不能有实现方法。
5.接口中定义的变量默认是publicstaticfinal型,且必须给其初值,所以实现类中不能重新定义,也不能改变其值。
6.抽象类中的变量默认是friendly型,其值可以在子类中重新定义,也可以重新赋值。
7.接口中的方法默认都是public,abstract类型的。
3)能说一下java的反射(reflection)机制吗?
(瞬联)
开放性和原因连接(causally-connected)是反射系统的两大基本要素
4)在java中怎样实现多线程?
(瞬联)
extendsthread
implementrunnable
方法一:
继承thread类,覆盖方法run(),我们在创建的thread类的子类中重写run(),加入线程所要执行的代码即可。
下面是一个例子:
publicclassmythreadextendsthread
{
intcount=1,number;
publicmythread(intnum)
{
number=num;
system.out.println
(创建线程+number);
}
publicvoidrun(){
while(true){
system.out.println