JAVA程序员笔试面试题汇总及答案_第1页
JAVA程序员笔试面试题汇总及答案_第2页
JAVA程序员笔试面试题汇总及答案_第3页
JAVA程序员笔试面试题汇总及答案_第4页
JAVA程序员笔试面试题汇总及答案_第5页
已阅读5页,还剩121页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、面向对象的特征有哪些方面(1)抽象:抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面。抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用部分细节。抽象包括两个方面,一是过程抽象,二是数据抽象。(2)继承:继承是一种联结类的层次模型,并且允许和鼓励类的重用,它提供了一种明确表述共性的方法。对象的一个新类可以从现有的类中派生,这个过程称为类继承。新类继承了原始类的特性,新类称为原始类的派生类(子类),而原始类称为新类的基类(父类)。派生类可以从它的基类那里继承方法和实例变量,并且类可以修改或增加新的方法使之更适合特殊的需要。(3)封装:封装是把过程和数据包围起来,对数据的访问只能通过已定义的界面。面向对象计算始于这个基本概念,即现实世界可以被描绘成一系列完全自治、封装的对象,这些对象通过一个受保护的接口访问其他对象。(4)多态性:多态性是指允许不同类的对象对同一消息作出响应。多态性包括参数化多态性和包含多态性。多态性语言具有灵活、抽象、行为共享、代码共享的优势,很好的解决了应用程序函数同名问题。2、String是最基本的数据类型吗?基本数据类型包括byte、int、char、long、float、double、boolean和short。java.lang.String类是final类型的,因此不可以继承这个类、不能修改这个类。为了提高效率节省空间,我们应该用StringBuffer类3、int和Integer有什么区别Java提供两种不同的类型:引用类型和原始类型(或内置类型)。Int是java的原始数据类型,Integer是java为int提供的封装类。

Java为每个原始类型提供了封装类。原始类型封装类booleanBooleancharCharacterbyteByteshortShortintIntegerlongLongfloatFloatdoubleDouble引用类型和原始类型的行为完全不同,并且它们具有不同的语义。引用类型和原始类型具有不同的特征和用法,它们包括:大小和速度问题,这种类型以哪种类型的数据结构存储,当引用类型和原始类型用作某个类的实例数据时所指定的缺省值。对象引用实例变量的缺省值为null,而原始类型实例变量的缺省值与它们的类型有关。4、String和StringBuffer的区别JAVA平台提供了两个类:String和StringBuffer,它们可以储存和操作字符串,即包含多个字符的字符数据。这个String类提供了

数值不可改变的字符串。而这个StringBuffer类提供的字符串进行修改。当你知道字符数据要改变的时候你就可以使用StringBuffer

。典型地,你可以使用StringBuffers来动态构造字符数据。5、运行时异常与一般异常有何异同?(1)基本概念异常表示程序运行过程中可能出现的非正常状态,运行时异常表示虚拟机的通常操作中可能遇到的异常,是一种常见运行错误。java编译器要求方法必须声明抛出可能发生的非运行时异常,但是并不要求必须声明抛出未被捕获的运行时异常。(2)运行时异常与非运行时异常有什么区别参考网址:/space.php?uid=122120&do=blog&id=12723(Java提供了两类主要的异常:runtimeexception和checkedexception

。checked异常也就是我们经常遇到的IO异常,以及SQL异常都是这种异常。对于这种异常,JAVA编译器强制要求我们必需对出现的这些异常进行catch。所以,面对这种异常不管我们是否愿意,只能自己去写一大堆catch块去处理可能的异常。但是另外一种异常:runtimeexception,也称运行时异常,我们可以不处理。当出现这样的异常时,总是由虚拟机接管。比如:我们从来没有人去处理过NullPointerException异常,它就是运行时异常,并且这种异常还是最常见的异常之一。)(3)每个类型的异常的特点

1、Error体系

Error类体系描述了Java运行系统中的内部错误以及资源耗尽的情形.应用程序不应该抛出这种类型的对象(一般是由虚拟机抛出).假如出现这种错误,除了尽力使程序安全退出外,在其他方面是无能为力的.所以,在进行程序设计时,应该更关注Exception体系.

2、Exception体系

Exception体系包括RuntimeException体系和其他非RuntimeException的体系

2.1RuntimeException(程序逻辑错误)

RuntimeException体系包括错误的类型转换、数组越界访问和试图访问空指针等等.处理RuntimeException的原则是:假如出现RuntimeException,那么一定是程序员的错误.例如,可以通过检查数组下标和数组边界来避免数组越界访问异常.

2.2其他(IOException等等)

这类异常一般是外部错误,例如试图从文件尾后读取数据等,这并不是程序本身的错误,而是在应用环境中出现的外部错误.(4)异常的使用方法

参考网址:

/jiaocheng/2008-09/1452.htm1、声明方法抛出异常

1.1语法:throws(略)

1.2为什么要声明方法抛出异常?

方法是否抛出异常与方法返回值的类型一样重要.假设方法抛出异常确没有声明该方法将抛出异常,那么客户程序员可以调用这个方法而且不用编写处理异常的代码.那么,一旦出现异常,那么这个异常就没有合适的异常控制器来解决.

1.3为什么抛出的异常一定是已检查异常?

RuntimeException与Error可以在任何代码中产生,它们不需要由程序员显示的抛出,一旦出现错误,那么相应的异常会被自动抛出.而已检查异常是由程序员抛出的,这分为两种情况:客户程序员调用会抛出异常的库函数(库函数的异常由库程序员抛出);客户程序员自己使用throw语句抛出异常.碰到Error,程序员一般是无能为力的;碰到RuntimeException,那么一定是程序存在逻辑错误,要对程序进行修改(相当于调试的一种方法);只有已检查异常才是程序员所关心的,程序应该且仅应该抛出或处理已检查异常.6、说出Servlet的生命周期,并说出Servlet和CGI的区别。(1)总括:Servlet被服务器实例化后,容器运行其init方法,请求到达时运行其service方法,service方法自动派遣运行与请求对应的doXXX方法(doGet,doPost)等,当服务器决定将实例销毁的时候调用其destroy方法。与cgi的区别在于servlet处于服务器进程中,它通过多线程方式运行其service方法,一个实例可以服务于多个请求,并且其实例一般不会销毁,而CGI对每个请求都产生新的进程,服务完成后就销毁,所以效率上低于servlet。

服务方法

答:1)每当服务接收到对Servlet的请求时,服务器就会产生一个新线程,并调用Service。service方法检查HTTP请求类型(GET、POST、PUT、DELETE等),并相应地调用doGet、doPost、doPut、doDelete等。

2)doGet/doPost方法接收HttpServletRequest和HttpServletResponse对象。

3)99%的时间里,只需注意GET和/或POST请求;

4)没有任何doHead方法。(2)sevlet学习摘要/sevlet-Learning-Summary.html

2.1什么是servlet:1)在web容器中运行的服务器端JAVA程序,主要用于响应HTTP请求。Servlet一般用于MVC中的控制器部分。2)模块化的程序,运行在服务器端,增强了请求/响应导向服务;

3)应用示例:

a.访问远端对象;

b.跟踪大量信息;

c.多用户协作

2.2JSP构架模型

Model1:纯jsp维护难,代码可复用性差

Model2:jsp+javabean在jsp中使用usebean标签,代码在jsp中本质同Model1

Mvc:jsp+servlet+javabean

2.3

servlet中如何

1)

从HTML表单中获得参数

request.getParameterNames();enumer;

request.getParameter();String

2)

如何获得请求头部的信息

Enumerationenumer=request.getHeaderNames();

While(enumer.HasMoreElements())

{

Stringheader=enumer.next();

Stringresult=request.getHeader(header);

Out.print(result);

}

3)

如何获得客户cookie的信息

request.getCookies();array[]

4)

如何设置response的头部信息

response.setHeader();

5)

如何设置响应的contenttype

response.setContentType(“text/htmlcharset=utf-8”);

6)

如何获得I/O流、text流、二进制流

7)

如何从当前的servlet重定向到其他的URL

response.sendRedirect(“url”)

RequstDispatcherrd=request.getRequstDispatcher(“url”)

Rd.forword(request,response);

8)

如何向客户端写cookie

Cookiecookie=newCookie(“object”,”jklj”);

Cookie.setMaxAge(时间);

Response.addCookie(cookie);

2.4

如何创建RequestDispatcher对象,如何将请求转发给其它的web资源(包含其它的web资源),描述如何利用request来存状态,以及与其它保存状态方法有什么区别

RequstDispatcherrd=request.getRequstDispatcher(“url”)

Rd.forword(request,response);

Request.setAttribute(“object”,”内容”);

一旦产生响应request的生命周期就结束了

2.5

描述servlet的生命周期,谁来控制servlet的生命周期,servlet生命周期在J2EE规范中是如何来定义的

服务器实例化一个servlet对象,容器运行其init方法,请求到达时运行其service方法,service方法根据请求的类型调用(doGet,doPost)方法,当服务器决定将实例销毁时调用其destory方法。

2.6

如何创建RequestDispatcher对象,如何将请求转发给其它的web资源(包含其它的web资源),描述如何利用request来存状态,以及与其它保存状态方法有什么区别

RequstDispatcherrd=request.getRequstDispatcher(“url”)

Rd.forword(request,response);

Request.setAttribute(“object”,”内容”);

一旦产生响应request的生命周期就结束了

2.7

如何在web.xml中配置servlet

定义

<servlet>

<servlet-name>name</servlet-name>

<servlet-class>package</servlet-class>

</servlet>

映射

<servlet-mapping>

<servlet-name>name</servlet-name>

<url-patten>/patten</url-patten>

</servlet-mapping>

2.8

获得ServletConfig对象

ServletConfigsc=getServletConfig();

2.9

如何获得servletContext对象

servletContextsc=getservletContext();

18.

<html><body>

<ahref=”/servlet/HelloServlet”>POST</a>

</body></html>

调用servlet时采用了doPost、doGet、doForm、doHref中的哪个方法

doGet方法

2.10

doGet:

PrintWriterout=res.getWriter();

Out.println(“<html><body>Hello</body></html>”);

If(!res.isCommitted())判断是否response提交了

If(reg.getParameter(”name”)==null)

{

res.sendError(HttpServletResponse.SC_UNAUTHORIZED);

}

2.11

说明如下的web的资源应该放在web容器中的什么目录下,静态页面JSP、servletclass、web.xml、Taglibraries、JARFile、javaclass以及需要保护的资源文件tomcat容器

web.xml,Taglibraries:\webapps\工程名\WEB-INF

servlet,javaclass:\webapps\工程名\WEB-INF\classes\

jar:\webapps\工程名\WEB-INF\lib\

2.12

如何打war包

将web项目压缩成rar文件然后将后缀名改为war。

2.13

如何利用ServletContext对象获得初始化参数

servletContextsc=getservletContext();

Strings=sc.getInitParameter(key);

2.14

如何在配置文件中配置ServletContext初始化参数

<init-param>

<param-name>name</param-name>

<param-value>vlaue</param-value>

</init-param>

2.15

写代码来将对象放入ServletContext中以及取出对象

servletContextsc=getservletContext();

sc.setAttribute(key,value);

2.16

描述requestsessionwebapplication的区别,创建监听器类来监听每个scope的生命周期

生命周期不同。request产生响应时生命周期结束,session在web.xml中设置生命周期时间、手动清除web容器重启生命周期结束。Webapplication容器重启、手动清除2.17start

26.

如何配置listener

27.

如何来写以及配置filter

28.

创建一个request或response对象的包装类

29.

写一段servlet代码,用来将对象存入session以及从session中取出该对象

HttpSessionsession=request.getSession();

session.setAttribute(key,value);

30.

描述用来访问session对象的API

31.

说明session对象的生命周期

session在web.xml中设置生命周期时间、手动清除web容器重启生命周期结束

32.

写一段代码来响应当对象加入session时的事件

33.

描述web容器使用了什么机制来管理session

34.

如何使session失效

session在web.xml中设置生命周期时间、手动清除web容器重启生命周期结束

35.

描述将session与客户端Birding的流程及方法

36.

当client不支持cookie时,如何使用session

37.

什么是Authentication(识别(用户)):识别用户是谁?什么是Authorization(授权)对识别后的用户给予什么样的权限。数据的完整性:提交数据,操作数据,数据库数据。数据的机密性:加密,HTTPS

38.

JSP中指令标签的形式

JSP中声明标签的形式

JSP中代码段标签的形式

JSP中动作标签的形式

JSP中注释标签的形式

JSP中的表达式标签的形式

39.

指令标签有哪些?

40.

action标签有哪些?

41.

page的属性

42.

<%!inti;%>→成员变量

<%intj;%>→局部变量

<%=i++%><%=j++%>

43.

JSP中的内置对象

44.

<%@includefile=””%>与<jsp:includepage=””/>不同

45.

jsp:useBean(id,scope,type,type,class)的使用end7、说出ArrayList,Vector,LinkedList的存储性能和特性ArrayList和Vector都是使用数组方式存储数据,此数组元素数大于实际存储的数据以便增加和插入元素,它们都允许直接按序号索引元素,但是插入元素要涉及数组元素移动等内存操作,所以索引数据快而插入数据慢,Vector由于使用了synchronized方法(线程安全),通常性能上较ArrayList差,而LinkedList使用双向链表实现存储,按序号索引数据需要进行前向或后向遍历,但是插入数据时只需要记录本项的前后项即可,所以插入速度较快。8、EJB是基于哪些技术实现的?并说出SessionBean和EntityBean的区别,StatefulBean和StatelessBean的区别。EJBEJB是sun的服务器端组件模型,最大的用处是部署分布式应用程序当然,还有许多方式可以实现分布式应用,类似微软的.net技术。凭借java跨平台的优势,用EJB技术部署的分布式系统可以不限于特定的平台。EJB(EnterpriseJavaBean)是J2EE的一部分,定义了一个用于开发基于组件的企业多重应用程序的标准。其特点包括网络服务支持和核心开发工具(SDK)。在J2EE里,EnterpriseJavaBeans(EJB)称为Java企业Bean,是Java的核心代码,分别是会话Bean(SessionBean),实体Bean(EntityBean)和消息驱动Bean(MessageDrivenBean)。EJB简介1.SessionBean用于实现业务逻辑,它可以是有状态的,也可以是无状态的。每当客户端请求时,容器就会选择一个SessionBean来为客户端服务。SessionBean可以直接访问数据库,但更多时候,它会通过EntityBean实现数据访问。2.EntityBean是域模型对象,用于实现O/R映射,负责将数据库中的表记录映射为内存中的Entity对象,事实上,创建一个EntityBean对象相当于新建一条记录,删除一个EntityBean会同时从数据库中删除对应记录,修改一个EntityBean时,容器会自动将EntityBean的状态和数据库同步。3.MessageDrivenBean是EJB2.0中引入的新的企业Bean,它基于JMS消息,只能接收客户端发送的JMS消息然后处理。MDB实际上是一个异步的无状态SessionBean,客户端调用MDB后无需等待,立刻返回,MDB将异步处理客户请求。这适合于需要异步处理请求的场合,比如订单处理,这样就能避免客户端长时间的等待一个方法调用直到返回结果。EJB实际上是SUN的J2EE中的一套规范,并且规定了一系列的API用来实现把EJB概念转换成EJB产品.EJB是BEANS,BEANS是什么概念,那就是得有一个容纳她,让她可劲造腾的地方,就是得有容器.EJB必须生存在EJB容器中.这个容器可是功能强大之极!她首先要包装你BEAN,EJB的客户程序实际上从来就不和你编写的EJB直接打交道,他们之间是通过HOME/REMOTE接口来发生关系的.它负责你的BEAN的所有的吃喝拉撒睡,比如BEAN的持续化,安全性,事务管理...一.什么是EJB?一个技术规范:EJB从技术上而言不是一种"产品"EJBEJB是一种标准描述了构建应用组件要解决的:可扩展(Scalable)分布式(Distributed)事务处理(Transactional)数据存储(Persistent)安全性(Secure)二.Sun对EJB的期望提供一个标准的分布的、基于

OO

的组件架构屏蔽复杂的系统级功能需求Writeonce,runanywhere与非Java应用之间的互操作能力兼容CORBA

标准三.为什么选择EJB?EJB服务器完成"繁杂"的工作:应用开发人员关注于业务逻辑的实现而不是底层的实现机制(类似于

4GL

语言设计的目标)支持事务处理多个业务操作同时成功,或全部失败可以通过在代码外的描述来定义事务处理级别EJB可扩展性EJB可以根据您应用的增长而扩展EJB服务器往往还提供了负载均衡和安全性:由EJB服务器提供资源的访问权限控制四.EJB架构为了满足架构的目标,规范中描述了服务器(Server)容器(Container)类(Class)和实例(Instance)Home和Remote接口客户端(Client)五.简化的编程模型关注于业务逻辑实现:EJB负责生命周期(lifecycle),数据存储(persistence),事务处理语义(transactionalsemantic),安全(security),...通用的编程模型:各种服务的高层

APIJava是其编程语言EJB(业务逻辑代码)表示了与特定商业领域(例如银行、零售等行业)相适应的逻辑。它由运行在业务逻辑层的enterprisebean处理。一个enterprisebean可以从客户端接受数据,对它进行处理,并将其发送到企业信息系统层以作存储;同时它也可以从存储器获取数据,处理后将其发送到客户端应用程序。有三种类型的enterprisebeans:sessionbeans、entitybeans和message-drivenbeans。Sessionbean描述了与客户端的一个短暂的会话。当客户端的执行完成后,sessionbean和它的数据都将消失;与之相对应的是一个entitybean描述了存储在数据库表中的一行持久稳固的数据,如果客户端终止或者服务结束,底层的服务会负责entitybean数据的存储。Message-drivenbean结合了sessionbean和Java信息服务(JMS)信息监听者的功能,它允许一个商业组件异步地接受JMS消息。其它EJB包括SessionBean、EntityBean、MessageDrivenBean,基于JNDI、RMI、JAT等技术实现。SessionBean在J2EE应用程序中被用来完成一些服务器端的业务操作,例如访问数据库、调用其他EJB组件。EntityBean被用来代表应用系统中用到的数据。对于客户机,SessionBean是一种非持久性对象,它实现某些在服务器上运行的业务逻辑。对于客户机,EntityBean是一种持久性对象,它代表一个存储在持久性存储器中的实体的对象视图,或是一个由现有企业应用程序实现的实体。SessionBean还可以再细分为StatefulSessionBean与StatelessSessionBean,这两种的SessionBean都可以将系统逻辑放在method之中执行,不同的是StatefulSessionBean可以记录呼叫者的状态,因此通常来说,一个使用者会有一个相对应的StatefulSessionBean的实体。StatelessSessionBean虽然也是逻辑组件,但是他却不负责记录使用者状态,也就是说当使用者呼叫StatelessSessionBean的时候,EJBContainer并不会找寻特定的StatelessSessionBean的实体来执行这个method。换言之,很可能数个使用者在执行某个StatelessSessionBean的methods时,会是同一个Bean的Instance在执行。从内存方面来看,StatefulSessionBean与StatelessSessionBean比较,StatefulSessionBean会消耗J2EEServer较多的内存,然而StatefulSessionBean的优势却在于他可以维持使用者的状态。9、Collection和Collections的区别。Collection是集合类的上级接口,继承与他的接口主要有Set和List.Collections是针对集合类的一个帮助类,他提供一系列静态方法实现对各种集合的搜索、排序、线程安全化等操作。10、&和&&的区别。&是位运算符,表示按位与运算,&&是逻辑运算符,表示逻辑与(and)。11、HashMap和Hashtable的区别。HashMap是Hashtable的轻量级实现(非线程安全的实现),他们都完成了Map接口,主要区别在于HashMap允许空(null)键值(key),由于非线程安全,效率上可能高于Hashtable。HashMap允许将null作为一个entry的key或者value,而Hashtable不允许。HashMap把Hashtable的contains方法去掉了,改成containsvalue和containsKey。因为contains方法容易让人引起误解。Hashtable继承自Dictionary类,而HashMap是Java1.2引进的Mapinterface的一个实现。最大的不同是,Hashtable的方法是Synchronize(同步)的,而HashMap不是,在多个线程访问Hashtable时,不需要自己为它的方法实现同步,而HashMap就必须为之提供外同步。Hashtable和HashMap采用的hash/rehash算法都大概一样,所以性能不会有很大的差异。12、final,finally,finalize的区别。一、概述final用于声明属性,方法和类,分别表示属性不可变,方法不可覆盖,类不可继承。finally是异常处理语句结构的一部分,表示总是执行。finalize是Object类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法,可以覆盖此方法提供垃圾收集时的其他资源回收,例如关闭文件等。/news/show/194.html二、finalize

C++

支持局部对象(基于栈)和全局对象(基于堆)。栈对象由编译器检测释放,堆对象由程序员来释放。在许多方面,Java

类似于

C++。Java

的语法非常类似于

C++,Java

有类、方法和数据成员;Java

的类有构造函数;

Java

有异常处理。

但是,如果你使用过

C++

会发现

Java

也丢掉一些可能是你熟悉的特性。这些特性之一就是析构函数。取代使用析构函数,Java

支持finalize()

方法。

在本文中,我们将描述

finalize()

C++

析构函数的区别。另外,我们将创建一个简单的

Applet

来演示

finalize()

是如何工作的。

最终的界限

Java

不同,C++

支持局部对象(基于栈)和全局对象(基于堆)。因为这一双重支持,C++

也提供了自动构造和析构,这导致了对构造函数和析构函数的调用,(对于堆对象)就是内存的分配和释放。

Java

中,所有对象都驻留在堆内存,因此局部对象就不存在。结果,Java

的设计者觉得不需要析构函数(象

C++

中所实现的)。

取而代之,Java

定义了一个特殊的方法叫做finalize()

,它提供了

C++

析构函数的一些功能。但是,finalize()

并不完全与

C++

的析构函数一样,并可以假设它会导致一系列的问题。finalize()

方法作用的一个关键元素是

Java

的垃圾回收器。

垃圾回收器

C/C++、Pascal和其他几种多种用途的编程语言中,开发者有责任在内存管理上发挥积极的作用。例如,如果你为一个对象或数据结构分配了内存,那么当你不再使用它时必须释放掉该内存。

Java

中,当你创建一个对象时,Java

虚拟机(JVM)为该对象分配内存、调用构造函数并开始跟踪你使用的对象。当你停止使用一个对象(就是说,当没有对该对象有效的引用时),JVM

通过垃圾回收器将该对象标记为释放状态。

当垃圾回收器将要释放一个对象的内存时,它调用该对象的finalize()

方法(如果该对象定义了此方法)。垃圾回收器以独立的低优先级的方式运行,只有当其他线程挂起等待该内存释放的情况出现时,它才开始运行释放对象的内存。(事实上,你可以调用System.gc()

方法强制垃圾回收器来释放这些对象的内存。)

在以上的描述中,有一些重要的事情需要注意。首先,只有当垃圾回收器释放该对象的内存时,才会执行finalize()。如果在

Applet

或应用程序退出之前垃圾回收器没有释放内存,垃圾回收器将不会调用finalize()。

其次,除非垃圾回收器认为你的

Applet

或应用程序需要额外的内存,否则它不会试图释放不再使用的对象的内存。换句话说,这是完全可能的:一个

Applet

给少量的对象分配内存,没有造成严重的内存需求,于是垃圾回收器没有释放这些对象的内存就退出了。

显然,如果你为某个对象定义了finalize()

方法,JVM

可能不会调用它,因为垃圾回收器不曾释放过那些对象的内存。调用System.gc()

也不会起作用,因为它仅仅是给

JVM

一个建议而不是命令。

finalize()

有什么优点呢?

如果finalize()

不是析构函数,JVM

不一定会调用它,你可能会疑惑它是否在任何情况下都有好处。事实上,在

Java1.0

中它并没有太多的优点。

根据

Java

文档,finalize()

是一个用于释放非

Java

资源的方法。但是,JVM

有很大的可能不调用对象的finalize()

方法,因此很难证明使用该方法释放资源是有效的。

Java1.1

通过提供一个System.runFinalizersOnExit()

方法部分地解决了这个问题。(不要将这个方法与

Java1.0

中的System.runFinalizations()

方法相混淆。)不象System.gc()

方法那样,System.runFinalizersOnExit()

方法并不立即试图启动垃圾回收器。而是当应用程序或

Applet

退出时,它调用每个对象的finalize()

方法。

正如你可能猜测的那样,通过调用System.runFinalizersOnExit()

方法强制垃圾回收器清除所有独立对象的内存,当清除代码执行时可能会引起明显的延迟。现在建立一个示例

Applet

来演示

Java

垃圾回收器和finalize()

方法是如何相互作用的。

回收垃圾

通过使用JavaAppletWizard

创建一个新的

Applet

开始。当提示这样做时,输入

final_things

作为

Applet

名,并选择不要生成源文件注释。

接下来,在JavaAppletWizard

进行第三步,不要选择多线程选项。在第五步之前,根据需要修改

Applet

的描述。

当你单击Finish

后,AppletWizard

将生成一个新的工作空间,并为该项目创建缺省的

Java

文件。从列表

A

中选择适当的代码输入(我们已经突出显示了你需要输入的代码)。

当你完成代码的输入后,配置Internet

浏览器将System.out

的输出信息写到Javalog.txt

文件中。(在IE

选项对话框的高级页面中选择起用

JavaLogging。)编译并运行该

Applet。然后,等待

Applet

运行(你将在状态栏中看到

Applet

已启动的信息),退出浏览器,并打开Javalog.txt

文件。你将会发现类似于下列行的信息:

1000thingsconstructed

0thingsfinalized

正如你能够看到的那样,建立了1,000个对象仍然没有迫使垃圾回收器开始回收空间,即使在

Applet

退出时也没有对象被使用。

现在,删除在stop()

方法第一行中的注释符以起用System.gc()

方法。再次编译并运行该

Applet

,等待

Applet

完成运行,并退出浏览器。当你再次打开Javalog.txt文件,你将看到下列行:

1000thingsconstructed

963thingsfinalized

这次,垃圾回收器认为大多数对象未被使用,并将它们回收。按顺序,当垃圾回收器开始释放这些对象的内存时,JVM

调用它们的finalize()

方法。

继承finalize()?

顺便,如果你在类中定义了finalize()

,它将不会自动调用基类中的方法。在我们讨论了finalize()

C++

的析构函数的不同点后,对这个结论不会惊讶,因为为某个类定制的清除代码另一个类不一定会需要。

如果你决定要通过派生一个类的finalize()

方法来调用基类中的finalize()

方法,你可以象其他继承方法一样处理。

protectedvoidfinalize()

{

super.finalize();

//otherfinalizationcode...

}

除了允许你控制是否执行清除操作外,这个技术还使你可以控制当前类的finalize()方法何时执行。

结论

然而有益的是,Java

的自动垃圾回收器不会失去平衡。作为便利的代价,你不得不放弃对系统资源释放的控制。不象

C++

中的析构函数,JavaApplet

不会自动执行你的类中的finalize()

方法。事实上,如果你正在使用

Java1.0,即使你试图强制它调用finalize()

方法,也不能确保将调用它。

因此,你不应当依靠finalize()

来执行你的

Applet

和应用程序的资源清除工作。取而代之,你应当明确的清除那些资源或创建一个try...finally

块(或类似的机制)来实现。(如reader对象资源的释放)13、sleep()和wait()有什么区别?sleep是线程类(Thread)的方法,导致此线程暂停执行指定时间,把执行机会给其他线程,但是监控状态依然保持,到时后会自动恢复。调用sleep不会释放对象锁。wait是Object类的方法,对此对象调用wait方法导致本线程放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象发出notify方法(或notifyAll)后本线程才进入对象锁定池准备获得对象锁进入运行状态。14、Overload和Override的区别。Overloaded的方法是否可以改变返回值的类型?方法的重写Overriding和重载Overloading是Java多态性的不同表现。重写Overriding是父类与子类之间多态性的一种表现,重载Overloading是一个类中多态性的一种表现。如果在子类中定义某方法与其父类有相同的名称和参数,我们说该方法被重写(Overriding)。子类的对象使用这个方法时,将调用子类中的定义,对它而言,父类中的定义如同被"屏蔽"了。如果在一个类中定义了多个同名的方法,它们或有不同的参数个数或有不同的参数类型,则称为方法的重载(Overloading)。Overloaded的方法是可以改变返回值的类型。15、error和exception有什么区别?error表示恢复不是不可能但很困难的情况下的一种严重问题。比如说内存溢出。不可能指望程序能处理这样的情况。exception表示一种设计或实现问题。也就是说,它表示如果程序运行正常,从不会发生的情况。16、同步和异步有何异同,在什么情况下分别使用他们?举例说明。如果数据将在线程间共享。例如正在写的数据以后可能被另一个线程读到,或者正在读的数据可能已经被另一个线程写过了,那么这些数据就是共享数据,必须进行同步存取。当应用程序在对象上调用了一个需要花费很长时间来执行的方法,并且不希望让程序等待方法的返回时,就应该使用异步编程,在很多情况下采用异步途径往往更有效率。17、abstractclass和interface有什么区别?声明方法的存在而不去实现它的类被叫做抽象类(abstractclass),它用于要创建一个体现某些基本行为的类,并为该类声明方法,但不能在该类中实现该类的情况。不能创建abstract类的实例。然而可以创建一个变量,其类型是一个抽象类,并让它指向具体子类的一个实例。不能有抽象构造函数或抽象静态方法。Abstract类的子类为它们父类中的所有抽象方法提供实现,否则它们也是抽象类为。取而代之,在子类中实现该方法。知道其行为的其它类可以在类中实现这些方法。接口(interface)是抽象类的变体。在接口中,所有方法都是抽象的。多继承性可通过实现这样的接口而获得。接口中的所有方法都是抽象的,没有一个有程序体。接口只可以定义staticfinal成员变量。接口的实现与子类相似,除了该实现类不能从接口定义中继承行为。当类实现特殊接口时,它定义(即将程序体给予)所有这种接口的方法。然后,它可以在实现了该接口的类的任何对象上调用接口的方法。由于有抽象类,它允许使用接口名作为引用变量的类型。通常的动态联编将生效。引用可以转换到接口类型或从接口类型转换,instanceof运算符可以用来决定某对象的类是否实现了接口。18、heap和stack有什么区别。/view/93201.htm栈是一种线形集合,其添加和删除元素的操作应在同一端完成。栈按照后进先出的方式进行处理。堆是栈的一个组成元素19、forward和redirect的区别forward是服务器请求资源,服务器直接访问目标地址的URL,把那个URL的响应内容读取过来,然后把这些内容再发给浏览器,浏览器根本不知道服务器发送的内容是从哪儿来的,所以它的地址栏中还是原来的地址。redirect就是服务端根据逻辑,发送一个状态码,告诉浏览器重新去请求那个地址,一般来说浏览器会用刚才请求的所有参数重新请求,所以session,request参数都可以获取。20、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组件。21、StaticNestedClass和InnerClass的不同。StaticNestedClass是被声明为静态(static)的内部类,它可以不依赖于外部类实例被实例化。而通常的内部类需要在外部类实例化后才能实例化。定义——InnerClass内部类是定义在其他类内部的类。它几乎可以处于类内部任何位置,可以与实例变量处于同一级,或处于方法之内,甚至是一个表达式的一部分!内部类是JAVA语言的主要附加部分。优点——InnerClass⒈内部类对象可以访问创建它的对象的实现,包括私有数据;⒉内部类不为同一包的其他类所见,具有很好的封装性;⒊使用内部类可以很方便的编写事件驱动程序;⒋匿名内部类可以方便的定义运行时回调;区别/navyzh/archive/2009/02/26/3938447.aspxNestedClass(一般是C++的说法),InnerClass(一般是JAVA的说法)。Java内部类与C++嵌套类最大的不同就在于是否有指向外部的引用上。Nestedclass!=innerclass,innerclass是一种特殊的Nestedclass。对内部类的限制:不能声明static初始化操作22、JSP中动态INCLUDE与静态INCLUDE的区别?动态INCLUDE用jsp:include动作实现<!--includefile="included.htm"-->23、什么时候用assert。assertion(断言)在软件开发中是一种常用的调试方式,很多开发语言中都支持这种机制。在实现中,assertion就是在程序中的一条语句,它对一个boolean表达式进行检查,一个正确程序必须保证这个boolean表达式的值为true;如果该值为false,说明程序已经处于不正确的状态下,系统将给出警告或退出。一般来说,assertion用于保证程序最基本、关键的正确性。assertion检查通常在开发和测试时开启。为了提高性能,在软件发布后,assertion检查通常是关闭的。J2SE1.4在语言上提供了一个新特性,就是assertion(断言)功能,它是该版本在Java语言方面最大的革新。在软件开发中,assertion是一种经典的调试、测试方式。/developerworks/cn/java/l-javaassertion/24、GC是什么?为什么要有GC?GC是垃圾收集的意思(GabageCollection),内存处理是编程人员容易出现问题的地方,忘记或者错误的内存回收会导致程序或系统的不稳定甚至崩溃,Java提供的GC功能可以自动监测对象是否超过作用域从而达到自动回收内存的目的,Java语言没有提供释放已分配内存的显示操作方法。25、shorts1=1;s1=s1+1;有什么错?shorts1=1;s1+=1;有什么错?shorts1=1;s1=s1+1;(s1+1运算结果是int型,需要强制转换类型)shorts1=1;s1+=1;(可以正确编译)26、Math.round(11.5)等於多少?Math.round(-11.5)等於多少?Math.round(11.5)==12Math.round(-11.5)==-11round方法返回与参数最接近的长整数,参数加1/2后求其floor.27、Strings=newString("xyz");创建了几个StringObject?一、概括两个(一个是“xyx”,一个是指向“xyx”的引用对象s)二、Java栈与堆

(详解string实例的创建)

/u/20081123/12/f70f1632-24be-4caa-bc20-29cf8267afab.html测试用例1:存在栈中的数据可以共享Stringstr1="abc";

//开辟一个存放字面值为"abc"的地址,接着创建一个新的String类的对象o,并将o的字符串值指向这个地址,而且在栈中这个地址旁边记下这个引用的对象o.创建一个引用str1指向对象o的地址Stringstr2="abc";

//创建另一个引用str2指向对象o的地址

str1="bcd";

//当str1改完其值后,创建新的对象指向"bcd"的地址,并将引用str1指向新对象的地址

Stringstr3=str1;

//未创建新对象,str3指向str1相同的地址

System.out.println(str3);//bcd

Stringstr4="bcd";

//当str1改完其值后,再创建一个String的引用str4,并指向因str1修改值而创建的新的对象。

System.out.println(str1==str4);//true

测试用例2:堆中创建string实例只要是用new()来新建对象的,都会在堆中创建,而且其字符串是单独存值的Strings1=newString("abc");Strings2=newString("abc");System.out.println(s1+","+s2);//abc,abcSystem.out.println(s1.equals(s2));//trueSystem.out.println(s1==s2);//falseStrings3=s1;//将引用s1的值赋给s3,指向同一个对象地址System.out.println(s1==s3);//trues1="cde";Strings4="cde";System.out.println(s1==s4);//true28、设计4个线程,其中两个线程每次对j增加1,另外两个线程对j每次减少1。写出程序。以下程序使用内部类实现线程,对j增减的时候没有考虑顺序问题。publicclassThreadTest1{privateintj;publicstaticvoidmain(Stringargs[]){ThreadTest1tt=newThreadTest1();Incinc=tt.newInc();Decdec=tt.newDec();for(inti=0;i<2;i++){Threadt=newThread(inc);t.start();t=newThread(dec);t.start();}}privatesynchronizedvoidinc(){j++;System.out.println(Thread.currentThread().getName()+"-inc:"+j);}privatesynchronizedvoiddec(){j--;System.out.println(Thread.currentThread().getName()+"-dec:"+j);}classIncimplementsRunnable{publicvoidrun(){for(inti=0;i<100;i++){inc();}}}classDecimplementsRunnable{publicvoidrun(){for(inti=0;i<100;i++){dec();}}}}29、Java有没有goto?java中的保留字,现在没有在java中使用。Java不提供goto语句,它虽然指定goto作为关键字,但不支持它的使用,使程序简洁易读。在Java中goto语句被完全抛弃了,与此同时,Java又扩大了break语句和continue语句的功能,通过使用break和continue,程序流程被允许在多层循环中跳转。30、启动一个线程是用run()还是start()?启动一个线程是调用start()方法,使线程所代表的虚拟处理机处于可运行状态,这意味着它可以由JVM调度并执行。这并不意味着线程就会立即运行。run()方法可以产生必须退出的标志来停止一个线程。通过start调用run方法启用一个线程31、EJB包括(SessionBean,EntityBean)说出他们的生命周期,及如何管理事务的?SessionBean:StatelessSessionBean的生命周期是由容器决定的,当客户机发出请求要建立一个Bean的实例时,EJB容器不一定要创建一个新的Bean的实例供客户机调用,而是随便找一个现有的实例提供给客户机。当客户机第一次调用一个StatefulSessionBean时,容器必须立即在服务器中创建一个新的Bean实例,并关联到客户机上,以后此客户机调用StatefulSessionBean的方法时容器会把调用分派到与此客户机相关联的Bean实例。EntityBean:EntityBeans能存活相对较长的时间,并且状态是持续的。只要数据库中的数据存在,Entitybeans就一直存活。而不是按照应用程序或者服务进程来说的。即使EJB容器崩溃了,Entitybeans也是存活的。EntityBeans生命周期能够被容器或者Beans自己管理。EJB通过以下技术管理实务:对象管理组织(OMG)的对象实务服务(OTS),SunMicrosystems的TransactionService(JTS)、JavaTransactionAPI(JTA),开发组(X/Open)的XA接口。32、应用服务器有那些?BEAWebLogicServer,IBMWebSphereApplicationServer,Oracle9iApplicationServer,jBoss,Tomcat33、给我一个你最常见到的runtimeexception。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,UnsupportedOperationException34、接口是否可继承接口?抽象类是否可实现(implements)接口?抽象类是否可继承实体类(concreteclass)?接口可以继承接口。抽象类可以实现(implements)接口,抽象类是否可继承实体类,但前提是实体类必须有明确的构造函数。只要有抽象方法就是抽象类,所以抽象类可以实现接口的方法而有其他抽象方法35、List,Set,Map是否继承自Collection接口?List,Set是,Map不是Collection是任何对象组,元素各自独立,通常拥有相同的套用规则。SetList由它派生。/art/200909/149543.htm介绍集合类(collections)一、Collection和Collections的区别。Collections是个java.util下的类,它包含有各种有关java集合操作的静态方法。

Collection是个java.util下的接口,它是各种java集合结构的父接口二、set无重复、无序HashSet-基于散列表的集,加进散列表的元素要实现hashCode()方法以判断是否为同一个对象,无顺序、无重复。三、List有重复、有序ArrayList(数组表)-有重复、有顺序。类似于Vector,都用于缩放数组维护集合。四、Map用于关键字/数值对,较高的存取性能。不允许重复的key,但允许重复的Value。36、说出数据连接池的工作机制是什么?J2EE服务器启动时会建立一定数量的池连接,并一直维持不少于此数目的池连接。客户端程序需要连接时,池驱动程序会返回一个未使用的池连接并将其表记为忙。如果当前没有空闲连接,池驱动程序就新建一定数量的连接,新建连接的数量由配置参数决定。当使用的池连接调用完成后,池驱动程序将此连接表记为空闲,其他调用就可以使用这个连接。数据连接池源理与实现/blog/616100在Java语言中,JDBC(JavaDataBaseConnection)是应用程序与数据库沟通的桥梁,

一般来说,Java应用程序访问数据库的过程是:

①装载数据库驱动程序;

②通过JDBC建立数据库连接;

③访问数据库,执行SQL语句;

④断开数据库连接。

37、abstract的method是否可同时是static,是否可同时是native,是否可同时是synchronized?都不能abstract需要重载,static为类方法,没有重载一说

abstract为没有实现的方法,native为本机实现的方法,自相矛盾

(native是方法修饰符。Native方法是由另外一种语言(如c/c++,FORTRAN,汇编)实现的本地方法。因为在外部实现了方法,所以在java代码中,就不需要声明了,有点类似于借口方法。Native可以和其他一些修饰符连用,但是abstract方法和Interface方法不能用native来修饰。)

abstract方法没有实现,也不可能实际调用抽象方法,没有必要synchronized修饰,当然子类可以根据需要同步该方法.Java本地接口(JavaNativeInterface(JNI))允许运行在Java虚拟机(JavaVirtualMachine(JVM))上的代码调用本地程序和类库,或者被它们调用,这些程序和类库可以是其它语言编写的,比如C、C++或者汇编语言。当一个程序无法完全使用Java编写时,开发者可以通过JNI来编写本地方法,比如标准Java类库并不支持的依赖于平台的特色或者程序库。JNI还可以用于修改现有的使用其它语言编写的程序,使它们可以通过Java编写的程序来访问。38、数组有没有length()这个方法?String有没有length()这个方法?数组没有length()这个方法,有length的属性。String有有length()这个方法。39、Set里的元素是不能重复的,那么用什么方法来区分重复与否呢?是用==还是equals()?它们有何区别?Set里的元素是不能重复的,那么用iterator()方法来区分重复与否。equals()是判读两个Set是否相等。equals()和==方法决定引用值是否指向同一对象。equals()在类中被覆盖,为的是当两个分离的对象的内容和类型相配的话,返回真值。40、构造器Constructor是否可被override?构造器Constructor不能被继承,因此不能重写Overriding,但可以被重载Overloading。41、是否可以继承String类?String类是final类故不可以继承。关于FINAL

1,被定义成FINAL的类不能派生子类

2,被定义成FINAL的方法不能够被重写//注意!是重写,不是重载

3,被声明为FINAL的成员变量一经赋值就不能改变.42、swtich是否能作用在byte上,是否能作用在long上,是否能作用在String上?switch(expr1)中,expr1是一个整数表达式。因此传递给switch和case语句的参数应该是int、short、char或者byte。

long,string都不能作用于swtich。43、try{}里有一个return语句,那么紧跟在这个try后的finally{}里的code会不会被执行,什么时候被执行,在return前还是后?会执行,在return前执行。44、编程题:用最有效率的方法算出2乘以8等於几?2<<3(有C背景的程序员特别喜欢问这种问题)之所以问这样问题的人,他们只是基于这样一个事实,整数乘法或整数除法所需要的时钟周期远远大于移位操作所需的时钟周期,下面列出这个指令的基本执行时间:移位指令

寄存器移1位

时钟周期数为2

整数乘法IMUL

16位寄存器乘

时钟周期为128~154

整数除法IDIV

16位寄存器

时钟周期为165~184

而即使Java编译器在编译intj=i*8;时用的是

imul,但真正执行这这段代码,由虚拟机JVM转换成本地代码是时候会不会进一步优化成用移位操作的汇编指也未得而知,必要时当然可追踪一下java.exe的执行过程,即使执行时会作此优化,在java中把intj=i*8写成intj=i<<3,可获取一点点的效率,微不足道。/kypfos/archive/2006/06/18/810151.aspx45、两个对象值相同(x.equals(y)==true),但却可有不同的hashcode,这句话对不对?不对,有相同的hashcode。这要求我们覆写equals同时必须overridden

hashCode方法;hashCode的默认约定中有一条:

如果两个对象根据equals(o)是相等的,则调用这个两个对象中人一个对象的hashCode方法必产生同样的整数结果

。因此一般推荐对象扩展equals时都要扩展hashCode在

Hashtable

中是这样使用

equals()

hashCode()

的:get

put

时,首先使用

hashCode()

进行在

keys

中定位和查找,这样会提高查找效率。如果现有多个

key

hashCode

相同,再用

equals

在具有相同

hashCode

的这几个

key

中进行依次查找。

也就是说,java

中的设计思想是:允许不同对象有相同的

hashCode(),但是

equal

的对象的

hashCode

肯定是相同的。equals()

java

中被认为:对象之间

"一模一样"。46、当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递?是值传递。Java编程语言只有值传递参数。当一个对象实例作为一个参数被传递到方法中时,参数的值就是对该对象的引用。对象的内容可以在被调用的方法中改变,但对象的引用是永远不会改变的。/view/3904121614791711cc791713.html“在java中参数传递都是按值传递的”这句话的意思是:按值传递是传递的值的拷贝,按引用传递其实传递的是引用的地址值,所以统称为按值传递。在java中只有基本类型和按照下面这种定义方式的String是按值传递,其他的都是按引用传递。就是直接使用双引号字符串方式:Stringstr=”Java私塾”;那么能不能让按照引用传递的值相互间不影响?办法是在方法里面新new一个实例就可以了。47、当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此对象的其它方法?不能,一个对象的一个synchronized方法只能由一个线程访问。/view/1207212.htmsynchronized

关键字,代表这个方法加锁,相当于不管哪一个线程A每次运行到这个方法时,都要检查有没有其它正在用这个方法的线程B(或者CD等),有的话要等正在使用这个方法的线程B(或者CD)运行完这个方法后再运行此线程A,没有的话,直接运行它包括两种用法:synchronized方法和synchronized块。48、编程题:写一个Singleton出来。Singleton模式主要作用是保证在Java应用程序中,一个类Class只有一个实例存在。/blog/static/62223494201081310439564/

Singleton模式的实现基于两个要点:

1)不直接用类的构造函数,而另外提供一个Public的静态方法来构造类的实例。通常这个方法取名为Instance。Public保证了它的全局可见性,静

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论