java面试常见问题.docx
- 文档编号:17963063
- 上传时间:2023-08-05
- 格式:DOCX
- 页数:24
- 大小:76.15KB
java面试常见问题.docx
《java面试常见问题.docx》由会员分享,可在线阅读,更多相关《java面试常见问题.docx(24页珍藏版)》请在冰点文库上搜索。
java面试常见问题
56、多线程有几种实现方法?
同步有几种实现方法?
多线程有两种实现方法,分别是继承Thread类与实现Runnable接口
同步的实现方面有两种,分别是synchronized,wait与notify
wait():
使一个线程处于等待状态,并且释放所持有的对象的lock。
sleep():
使一个正在运行的线程处于睡眠状态,是一个静态方法,调用此方法要捕捉InterruptedException异常。
notify():
唤醒一个处于等待状态的线程,注意的是在调用此方法的时候,并不能确切的唤醒某一个等待状态的线程,而是由JVM确定唤醒哪个线程,而且不是按优先级。
Allnotity():
唤醒所有处入等待状态的线程,注意并不是给所有唤醒线程一个对象的锁,而是让它们竞争。
3、ArrayList和Vector的区别
(1)同步性:
Vector是线程安全的,也就是说是它的方法之间是线程同步的,而ArrayList是线程序不安全的,它的方法之间是线程不同步的。
如果只有一个线程会访问到集合,那最好是使用ArrayList,因为它不考虑线程安全,效率会高些;如果有多个线程会访问到集合,那最好是使用Vector,因为不需要我们自己再去考虑和编写线程安全的代码。
(2)数据增长:
ArrayList与Vector都有一个初始的容量大小,当存储进它们里面的元素的个数超过了容量时,就需要增加ArrayList与Vector的存储空间,每次要增加存储空间时,不是只增加一个存储单元,而是增加多个存储单元,每次增加的存储单元的个数在内存空间利用与程序效率之间要取得一定的平衡。
Vector默认增长为原来两倍,而ArrayList的增长策略在文档中没有明确规定(从源代码看到的是增长为原来的1.5倍)。
ArrayList与Vector都可以设置初始的空间大小,Vector还可以设置增长的空间大小,而ArrayList没有提供设置增长空间的方法。
4、HashMap和Hashtable的区别
就HashMap与HashTable主要从三方面来说。
一.历史原因:
Hashtable是基于陈旧的Dictionary类的,HashMap是Java1.2引进的Map接口的一个实现
二.同步性:
Hashtable是线程安全的,也就是说是同步的,而HashMap是线程序不安全的,不是同步的
三.值:
只有HashMap可以让你将空值作为一个表的条目的key或value
5、List和Map区别?
一个是存储单列数据的集合,另一个是存储键和值这样的双列数据的集合,List中存储的数据是有顺序,并且允许重复;Map中存储的数据是没有顺序的,其键是不能重复的,它的值是可以有重复的。
35、List,Set,Map是否继承自Collection接口?
List,Set是,Map不是
109、List、Map、Set三个接口,存取元素时,各有什么特点?
List以特定次序来持有元素,可有重复元素。
Set无法拥有重复元素,内部排序。
Map保存key-value值,value可多值。
3、SERVLETAPI中forward()与redirect()的区别?
答:
前者仅是容器中控制权的转向,在客户端浏览器地址栏中不会显示出转向后的地址;后者则是完全的跳转,浏览器将会得到跳转的地址,并重新发送请求链接。
这样,从浏览器的地址栏中可以看到跳转后的链接地址。
所以,前者更加高效,在前者可以满足需要时,尽量使用forward()方法,并且,这样也有助于隐藏实际的链接。
在有些情况下,比如,需要跳转到一个其它服务器上的资源,则必须使用
sendRedirect()方法。
66、Request对象的主要方法:
setAttribute(Stringname,Object):
设置名字为name的request的参数值
getAttribute(Stringname):
返回由name指定的属性值
getAttributeNames():
返回request对象所有属性的名字集合,结果是一个枚举的实例
getCookies():
返回客户端的所有Cookie对象,结果是一个Cookie数组
getCharacterEncoding():
返回请求中的字符编码方式
getContentLength():
返回请求的Body的长度
getHeader(Stringname):
获得HTTP协议定义的文件头信息
getHeaders(Stringname):
返回指定名字的requestHeader的所有值,结果是一个枚举的实例
getHeaderNames():
返回所以requestHeader的名字,结果是一个枚举的实例
getInputStream():
返回请求的输入流,用于获得请求中的数据
getMethod():
获得客户端向服务器端传送数据的方法
getParameter(Stringname):
获得客户端传送给服务器端的有name指定的参数值
getParameterNames():
获得客户端传送给服务器端的所有参数的名字,结果是一个枚举的实例
getParametervalues(Stringname):
获得有name指定的参数的所有值
getProtocol():
获取客户端向服务器端传送数据所依据的协议名称
getQueryString():
获得查询字符串
getRequestURI():
获取发出请求字符串的客户端地址
getRemoteAddr():
获取客户端的IP地址
getRemoteHost():
获取客户端的名字
getSession([Booleancreate]):
返回和请求相关Session
getServerName():
获取服务器的名字
getServletPath():
获取客户端所请求的脚本文件的路径
getServerPort():
获取服务器的端口号
removeAttribute(Stringname):
删除请求中的一个属性
19、forward和redirect的区别
forward是服务器请求资源,服务器直接访问目标地址的URL,把那个URL的响应内容读取过来,然后把这些内容再发给浏览器,浏览器根本不知道服务器发送的内容是从哪儿来的,所以它的地址栏中还是原来的地址。
redirect就是服务端根据逻辑,发送一个状态码,告诉浏览器重新去请求那个地址,一般来说浏览器会用刚才请求的所有参数重新请求,所以session,request参数都可以获取。
1.jsp有哪些内置对象?
作用分别是什么?
分别有什么方法?
答:
JSP共有以下9个内置的对象:
request用户端请求,此请求会包含来自GET/POST请求的参数
response网页传回用户端的回应
pageContext网页的属性是在这里管理
session与请求有关的会话期
applicationservlet正在执行的内容
out用来传送回应的输出
configservlet的构架部件
pageJSP网页本身
exception针对错误网页,未捕捉的例外
request表示HttpServletRequest对象。
它包含了有关浏览器请求的信息,并且提供了几个用于获取cookie,header,和session数据的有用的方法。
response表示HttpServletResponse对象,并提供了几个用于设置送回浏览器的响应的方法(如cookies,头信息等)
out对象是javax.jsp.JspWriter的一个实例,并提供了几个方法使你能用于向浏览器回送输出结果。
pageContext表示一个javax.servlet.jsp.PageContext对象。
它是用于方便存取各种范围的名字空间、servlet相关的对象的API,并且包装了通用的servlet相关功能的方法。
session表示一个请求的javax.servlet.http.HttpSession对象。
Session可以存贮用户的状态信息
applicaton表示一个javax.servle.ServletContext对象。
这有助于查找有关servlet引擎和servlet环境的信息
config表示一个javax.servlet.ServletConfig对象。
该对象用于存取servlet实例的初始化参数。
2.jsp有哪些动作?
作用分别是什么?
(这个问题似乎不重要,不明白为何有此题)
答:
JSP共有以下6种基本动作
jsp:
include:
在页面被请求的时候引入一个文件。
jsp:
useBean:
寻找或者实例化一个JavaBean。
jsp:
setProperty:
设置JavaBean的属性。
jsp:
getProperty:
输出某个JavaBean的属性。
jsp:
forward:
把请求转到一个新的页面。
jsp:
plugin:
根据浏览器类型为Java插件生成OBJECT或EMBED标记
68、我们在web应用开发过程中经常遇到输出某种编码的字符,如iso8859-1等,如何输出一个某种编码的字符串?
PublicStringtranslate(Stringstr){
StringtempStr="";
try{
tempStr=newString(str.getBytes("ISO-8859-1"),"GBK");
tempStr=tempStr.trim();
}
catch(Exceptione){
System.err.println(e.getMessage());
}
returntempStr;
1、说出一些数据库优化方面的经验?
sql语句全部大写,特别是列名和表名都大写。
特别是sql命令的缓存功能,更加需要统一大小写,sql语句à发给oracle服务器à语法检查和编译成为内部指令à缓存和执行指令。
根据缓存的特点,不要拼凑条件,而是用?
和PreparedStatment
3.分页语句
取出sql表中第31到40的记录(以自动增长ID为主键)
sqlserver方案1:
selecttop10*fromtwhereidnotin(selecttop30idfromtorderbyid)ordebyid
sqlserver方案2:
selecttop10*fromtwhereidin(selecttop40idfromtorderbyid)orderbyiddesc
mysql方案:
select*fromtorderbyidlimit30,10
oracle方案:
select*from(selectrownumr,*fromtwherer<=40)wherer>30
2、Class.forName的作用?
为什么要用?
答:
按参数中指定的字符串形式的类名去搜索并加载相应的类,如果该类字节码已经被加载过,则返回代表该字节码的Class实例对象,否则,按类加载器的委托机制去搜索和加载该类,如果所有的类加载器都无法加载到该类,则抛出ClassNotFoundException。
加载完这个Class字节码后,接着就可以使用Class字节码的newInstance方法去创建该类的实例对象了。
有时候,我们程序中所有使用的具体类名在设计时(即开发时)无法确定,只有程序运行时才能确定,这时候就需要使用Class.forName去动态加载该类,这个类名通常是在配置文件中配置的,例如,spring的ioc中每次依赖注入的具体类就是这样配置的,jdbc的驱动类名通常也是通过配置文件来配置的,以便在产品交付使用后不用修改源程序就可以更换驱动类名。
4、用JDBC查询学生成绩单,把主要代码写出来(考试概率极大).
Connectioncn=null;
PreparedStatementpstmt=null;
Resultsetrs=null;
try
{
Class.forname(driveClassName);
cn=DriverManager.getConnection(url,username,password);
pstmt=cn.prepareStatement(“selectscore.*fromscore,student“+
“wherescore.stuId=student.idandstudent.name=?
”);
pstmt.setString(1,studentName);
Resultsetrs=pstmt.executeQuery();
while(rs.next())
1、xml有哪些解析技术?
区别是什么?
答:
有DOM,SAX,STAX等
DOM:
处理大型文件时其性能下降的非常厉害。
这个问题是由DOM的树结构所造成的,这种结构占用的内存较多,而且DOM必须在解析文件之前把整个文档装入内存,适合对XML的随机访问SAX:
不现于DOM,SAX是事件驱动型的XML解析方式。
它顺序读取XML文件,不需要一次全部装载整个文件。
当遇到像文件开头,文档结束,或者标签开头与标签结束时,它会触发一个事件,用户通过在其回调事件中写入处理代码来处理XML文件,适合对XML的顺序访问
STAX:
StreamingAPIforXML(StAX)
讲解这些区别是不需要特别去比较,就像说传智播客与其他培训机构的区别时,我们只需说清楚传智播客有什么特点和优点就行了,这就已经间接回答了彼此的区别。
70、XML文档定义有几种形式?
它们之间有何本质区别?
解析XML文档有哪几种方式?
a:
两种形式dtdschema,b:
本质区别:
schema本身是xml的,可以被XML解析器解析(这也是从DTD上发展schema的根本目的),c:
有DOM,SAX,STAX等
DOM:
处理大型文件时其性能下降的非常厉害。
这个问题是由DOM的树结构所造成的,这种结构占用的内存较多,而且DOM必须在解析文件之前把整个文档装入内存,适合对XML的随机访问
SAX:
不现于DOM,SAX是事件驱动型的XML解析方式。
它顺序读取XML文件,不需要一次全部装载整个文件。
当遇到像文件开头,文档结束,或者标签开头与标签结束时,它会触发一个事件,用户通过在其回调事件中写入处理代码来处理XML文件,适合对XML的顺序访问
STAX:
StreamingAPIforXML(StAX)
3、J2EE是什么?
答:
Je22是Sun公司提出的多层(multi-diered),分布式(distributed),基于组件(component-base)的企业级应用模型(enterprieseapplicationmodel).在这样的一个应用系统中,可按照功能划分为不同的组件,这些组件又可在不同计算机上,并且处于相应的层次(tier)中。
所属层次包括客户层(clietntier)组件,web层和组件,Business层和组件,企业信息系统(EIS)层。
67、J2EE是技术还是平台还是框架?
什么是J2EE
J2EE本身是一个标准,一个为企业分布式应用的开发提供的标准平台。
J2EE也是一个框架,包括JDBC、JNDI、RMI、JMS、EJB、JTA等技术。
95、请对以下在J2EE中常用的名词进行解释(或简单描述)
web容器:
给处于其中的应用程序组件(JSP,SERVLET)提供一个环境,使JSP,SERVLET直接更容器中的环境变量接口交互,不必关注其它系统问题。
主要有WEB服务器来实现。
例如:
TOMCAT,WEBLOGIC,WEBSPHERE等。
该容器提供的接口严格遵守J2EE规范中的WEBAPPLICATION标准。
我们把遵守以上标准的WEB服务器就叫做J2EE中的WEB容器。
EJB容器:
Enterprisejavabean容器。
更具有行业领域特色。
他提供给运行在其中的组件EJB各种管理功能。
只要满足J2EE规范的EJB放入该容器,马上就会被容器进行高效率的管理。
并且可以通过现成的接口来获得系统级别的服务。
例如邮件服务、事务管理。
JNDI:
(JavaNaming&DirectoryInterface)JAVA命名目录服务。
主要提供的功能是:
提供一个目录系统,让其它各地的应用程序在其上面留下自己的索引,从而满足快速查找和定位分布式应用程序的功能。
JMS:
(JavaMessageService)JAVA消息服务。
主要实现各个应用程序之间的通讯。
包括点对点和广播。
JTA:
(JavaTransactionAPI)JAVA事务服务。
提供各种分布式事务服务。
应用程序只需调用其提供的接口即可。
JAF:
(JavaActionFrameWork)JAVA安全认证框架。
提供一些安全控制方面的框架。
让开发者通过各种部署和自定义实现自己的个性安全控制策略。
RMI/IIOP:
(RemoteMethodInvocation/internet对象请求中介协议)他们主要用于通过远程调用服务。
例如,远程有一台计算机上运行一个程序,它提供股票分析服务,我们可以在本地计算机上实现对其直接调用。
当然这是要通过一定的规范才能在异构的系统之间进行通信。
RMI是JAVA特有的。
3、EJB与JAVABEAN的区别?
JavaBean是可复用的组件,对JavaBean并没有严格的规范,理论上讲,任何一个Java类都可以是一个Bean。
但通常情况下,由于JavaBean是被容器所创建(如Tomcat)的,所以JavaBean应具有一个无参的构造器,另外,通常JavaBean还要实现Serializable接口用于实现Bean的持久性。
JavaBean实际上相当于微软COM模型中的本地进程内COM组件,它是不能被跨进程访问的。
EnterpriseJavaBean相当于DCOM,即分布式组件。
它是基于Java的远程方法调用(RMI)技术的,所以EJB可以被远程访问(跨进程、跨计算机)。
但EJB必须被布署在诸如Webspere、WebLogic这样的容器中,EJB客户从不直接访问真正的EJB组件,而是通过其容器访问。
EJB容器是EJB组件的代理,EJB组件由容器所创建和管理。
客户通过容器来访问真正的EJB组件。
{
system.out.println(rs.getInt(“subject”)+“”+rs.getFloat(“score”));
}
}catch(Exceptione){e.printStackTrace();}
finally
{
if(rs!
=null)try{rs.close()}catch(exceptione){}
if(pstmt!
=null)try{pstmt.close()}catch(exceptione){}
if(cn!
=null)try{cn.close()}catch(exceptione){}
}
page表示从该页面产生的一个servlet实例
········struts1和struts2的区别
—在Action实现类方面的对比:
Struts1要求Action类继承一个抽象基类;Struts1的一个具体问题是使用抽象类编程而不是接口。
Struts2Action类可以实现一个Action接口,也可以实现其他接口,使可选和定制的服务成为可能。
Struts2提供一个ActionSupport基类去实现常用的接口。
即使Action接口不是必须实现的,只有一个包含execute方法的POJO类都可以用作Struts2的Action。
—线程模式方面的对比:
Struts1Action是单例模式并且必须是线程安全的,因为仅有Action的一个实例来处理所有的请求。
单例策略限制了Struts1Action能做的事,并且要在开发时特别小心。
Action资源必须是线程安全的或同步的;Struts2Action对象为每一个请求产生一个实例,因此没有线程安全问题。
—Servlet依赖方面的对比:
Struts1Action依赖于ServletAPI,因为Struts1Action的execute方法中有HttpServletRequest和HttpServletResponse方法。
Struts2Action不再依赖于ServletAPI,从而允许Action脱离Web容器运行,从而降低了测试Action的难度。
当然,如果Action需要直接访问HttpServletRequest和HttpServletResponse参数,Struts2Action仍然可以访问它们。
但是,大部分时候,Action都无需直接访问HttpServetRequest和HttpServletResponse,从而给开发者更多灵活的选择。
—可测性方面的对比:
测试Struts1Action的一个主要问题是execute方法依赖于ServletAPI,这使得Action的测试要依赖于Web容器。
为了脱离Web容器测试Struts1的Action,必须借助于第三方扩展:
StrutsTestCase,该扩展下包含了系列的Mock对象(模拟了HttpServetRequest和HttpServletResponse对象),从而可以脱离Web容器测试Struts1的Action类。
Struts2Action可以通过初始化、设置属性、调用方法来测试。
—封装请求参数的对比:
Struts1使用ActionForm对象封装用户的请求参数,所有的ActionForm必须继承一个基类:
ActionForm。
普通的JavaBean不能用作ActionForm,因此,开发者必须创建大量的ActionForm类封装用户请求参数。
虽然Struts1提供了动态ActionForm来简化ActionForm的开发,但依然需要在配置文件中定义ActionForm;Struts2直接使用Action属性来封装用户请求属性,避免了开发者需要大量开发ActionForm类的烦琐,实际上,这些属性还可以是包含子属性的Rich对象类型。
如果开发者依然怀念Struts1ActionForm的模式,Struts2提供了ModelDriven模式,可以让开发者使用单独的Model对象来封装用户请求参数,但该Model对象无需继承任何Struts2基类,是一个POJO,从而降低了代码污染。
—表达式语言方面的对比:
Struts1整合了JSTL,因此可以使用JSTL表达式语言。
这种表达式语言有基本对象图遍历,但在对集合和索引属性的支持上则功能不强;Struts2可以使用JSTL,但它整合了一种更强大和灵活的表达式语言:
OGNL(ObjectGraphNotationLanguage),因此,Struts2下的表达式语言功能更加强大。
—绑定值到视图的对比:
Struts1使用标准JSP机制把对象绑定到视图页
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- java 面试 常见问题