java面试题(二)

本文深入讲解Java中的核心概念和技术,包括JVM类加载机制、多线程状态管理、JSP内置对象与动作、Servlet生命周期等内容。同时介绍了数据库连接、XML解析技术及MVC架构实现方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.JVM加载class文件

1) java中的所有类,必须被加载到JVM中才能运行,这个装载工作是由JVM中的类装载器完成的。类装载器嗦做的工作实质是把类文件从硬盘读取到内存中。
2) java中的类大致分为三种:
a) 系统类
b) 扩展类
c) 由程序员自定义的类
3) 装载类的方法有两种:
a) 隐式装载:程序运行中当通过new等方式生成对象时,隐式调用类装载器加载对应的类到jvm中。
b) 显式装载:通过class.forname()等方法,显式加载需要的类。
4) 类加载的动态性体现
一个应用程序总是由n多个类组成,Java程序启动时,并不是一次性把所有的类全部加载后再运行。它总是先保证程序运行的基础类一次性加载到jvm中,其它类等到jvm用到的时候再加载,这样的好处是节省了内存的开销。
5) java类装载器
Java中的类装载器实质上也是类,功能是把类载入jvm中,值得注意的是jvm的类装载器并不是一个,而是三个,层次结构如下:
BootstrapLoader —负责加载系统类
|
– ExtClassLoader —负责加载扩展类
|
–AppClassLoader —负责加载应用类
一方面是分工,各自负责各自的区块,另一方面为了实现委托模型。
6) 类加载器之间是如何协调工作的

http://hwhuang.iteye.com/blog/808214

7) 预先加载与依需求加载
Java 运行环境为了优化系统,提高程序的执行速度,在 JRE 运行的开始会将 Java 运行所需要的基本类采用预先加载( pre-loading )的方法全部加载要内存当中,因为这些单元在 Java 程序运行的过程当中经常要使用的,主要包括 JRE 的 rt.jar 文件里面所有的 .class 文件。
当 java.exe 虚拟机开始运行以后,它会找到安装在机器上的 JRE 环境,然后把控制权交给 JRE , JRE 的类加载器会将 lib 目录下的 rt.jar 基础类别文件库加载进内存,这些文件是 Java 程序执行所必须的,所以系统在开始就将这些文件加载,避免以后的多次 IO 操作,从而提高程序执行效率。
8) 自定义类加载机制
利用java提供的java.net.URLClassLoader类就可以实现。
try{
URL url = new URL(“file:/d:/test/lib/”);
URLClassLoader urlCL = new URLClassLoader(new URL[]{url});
Class c = urlCL.loadClass(“TestClassA”);
TestClassA object = (TestClassA)c.newInstance();
object.method();
}catch(Exception e){
e.printStackTrace();
}
9)类加载器的阶层体系
Java的类加载器的工作原理:
当执行 java ***.class 的时候, java.exe 会帮助我们找到 JRE ,接着找到位于 JRE 内部的 jvm.dll ,这才是真正的 Java 虚拟机器 , 最后加载动态库,激活 Java 虚拟机器。虚拟机器激活以后,会先做一些初始化的动作,比如说读取系统参数等。一旦初始化动作完成之后,就会产生第一个类加载器―― Bootstrap Loader , Bootstrap Loader 是由 C++ 所撰写而成,这个 Bootstrap Loader 所做的初始工作中,除了一些基本的初始化动作之外,最重要的就是加载 Launcher.java 之中的 ExtClassLoader ,并设定其 Parent 为 null ,代表其父加载器为 BootstrapLoader 。然后 Bootstrap Loader 再要求加载 Launcher.java 之中的 AppClassLoader ,并设定其 Parent 为之前产生的 ExtClassLoader 实体。这两个加载器都是以静态类的形式存在的。这里要请大家注意的是, Launcher$ExtClassLoader.class 与 Launcher$AppClassLoader.class 都是由 Bootstrap Loader 所加载,所以 Parent 和由哪个类加载器加载没有关系。

2.多线程有哪些状态?
1)新状态:线程已被创建但未执行(start()未被调用)
2)可执行状态:线程可以执行,虽然不一定正在执行。CPU时间随时可能被分配给该线程,从而使得它执行。
3)死亡状态:正常情况下run() 返回使得线程死亡。调用stop() 或 destroy() 亦有同样效果,但是不被推荐,前者会产生异常,后者是强制终止,不会释放锁。
4)阻塞状态:线程不会被分配CPU时间,无法执行。

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

4.jsp有哪些动作?作用分别是什么?

答:JSP共有以下6种基本动作

jsp:include:在页面被请求的时候引入一个文件。
jsp:useBean:寻找或者实例化一个JavaBean。
jsp:setProperty:设置JavaBean的属性。
jsp:getProperty:输出某个JavaBean的属性。
jsp:forward:把请求转到一个新的页面。
jsp:plugin:根据浏览器类型为Java插件生成OBJECT或EMBED标记

5.JSP中动态INCLUDE与静态INCLUDE的区别?

答:动态INCLUDE用jsp:include动作实现

<jsp:include page="included.jsp" flush="true" />它总是会检查所含文件中的变化,适合用于包含动态页面,并且可以带参数

静态INCLUDE用include伪码实现,定不会检查所含文件的变化,适用于包含静态页面
<%@ include file="included.htm" %>

6.两种跳转方式分别是什么?有什么区别?

答:有两种,分别为:

<jsp:include page="included.jsp" flush="true">
<jsp:forward page= "nextpage.jsp"/>
前者页面不会转向include所指的页面,只是显示该页的结果,主页面还是原来的页面。执行完后还会回来,相当于函数调用。并且可以带参数.后者完全转向新页面,不会再回来。相当于go to 语句。

7.说一说Servlet的生命周期?

答:servlet有良好的生存期的定义,包括[color=darkred]加载和实例化、初始化、处理请求以及服务结束[/color]。这个生存期由javax.servlet.Servlet接口的init,service和destroy方法表达。

8.JAVA SERVLET API中forward() 与redirect()的区别?

答:前者仅是[color=darkred]容器中控制权的转向[/color],在客户端浏览器地址栏中不会显示出转向后的地址;后者则是[color=darkred]完全的跳转,浏览器将会得到跳转的地址,并重新发送请求链接。[/color]这样,从浏览器的地址栏中可以看到跳转后的链接地址。所以,前者更加高效,在前者可以满足需要时,尽量使用forward()方法,并且,这样也有助于隐藏实际的链接。在有些情况下,比如,需要跳转到一个其它服务器上的资源,则必须使用sendRedirect()方法。

9.Servlet的基本架构

public class ServletName extends HttpServlet {
public void doPost(HttpServletRequest request, HttpServletResponse response)throws
ServletException, IOException {

}

public void doGet(HttpServletRequest request, HttpServletResponse response) throws
ServletException, IOException {

}

}

10.Class.forName的作用?为什么要用?

答:调用该访问返回一个以字符串指定类名的类的对象

11.xml有哪些解析技术?区别是什么?

答:有DOM,SAX,STAX等

DOM:处理大型文件时其性能下降的非常厉害。这个问题是由DOM的树结构所造成的,这种结构占用的内存较多,而且DOM必须在解析文件之前把整个文档装入内存,适合对XML的随机访问SAX:不现于DOM,SAX是事件驱动型的XML解析方式。它顺序读取XML文件,不需要一次全部装载整个文件。当遇到像文件开头,文档结束,或者标签开头与标签结束时,它会触发一个事件,用户通过在其回调事件中写入处理代码来处理XML文件,适合对XML的顺序访问

STAX:Streaming API for XML (StAX)

12.public class jdbc

{

String dbUrl="jdbc:oracle:thin:@127.0.0.1:1521:orcl";

String theUser="admin";

String thePw="manager";

Connection c=null;

Statement conn;

ResultSet rs=null;

public jdbc()

{

try{

Class.forName("oracle.jdbc.driver.OracleDriver").newInstance();

c = DriverManager.getConnection(dbUrl,theUser,thePw);

conn=c.createStatement();

}catch(Exception e){

e.printStackTrace();

}

}


13.一种分页方法

<%

int i=1;

int numPages=14;

String pages = request.getParameter("page") ;

int currentPage = 1;

currentPage=(pages==null)?(1):{Integer.parseInt(pages)}

sql = "select count(*) from tables";

ResultSet rs = DBLink.executeQuery(sql) ;

while(rs.next()) i = rs.getInt(1) ;

int intPageCount=1;

intPageCount=(i%numPages==0)?(i/numPages):(i/numPages+1);

int nextPage ;

int upPage;

nextPage = currentPage+1;

if (nextPage>=intPageCount) nextPage=intPageCount;

upPage = currentPage-1;

if (upPage<=1) upPage=1;

rs.close();

sql="select * from tables";

rs=DBLink.executeQuery(sql);

i=0;

while((i<numPages*(currentPage-1))&&rs.next()){i++;}

%>

14.MVC的各个部分都有那些技术来实现?如何实现?

答:MVC是Model-View-Controller的简写。"Model" 代表的是应用的业务逻辑(通过JavaBean,EJB组件实现), "View" 是应用的表示面(由JSP页面产生),"Controller" 是提供应用的处理过程控制(一般是一个Servlet),通过这种设计模型把应用逻辑,处理过程和显示逻辑分成不同的组件实现。这些组件可以进行交互和重用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值