Java综合测试题答案.docx
- 文档编号:10400326
- 上传时间:2023-05-25
- 格式:DOCX
- 页数:46
- 大小:202.89KB
Java综合测试题答案.docx
《Java综合测试题答案.docx》由会员分享,可在线阅读,更多相关《Java综合测试题答案.docx(46页珍藏版)》请在冰点文库上搜索。
Java综合测试题答案
C
B
C
A
C
C
A
D
D
D
A
B
1.String、StringBuffer以及StringBuilder的区别
简要的说,String类型和StringBuffer类型的主要性能区别其实在于String是不可变的对象,因此在每次对String类型进行改变的时候其实都等同于生成了一个新的String对象,然后将指针指向新的String对象,所以经常改变内容的字符串最好不要用String,因为每次生成对象都会对系统性能产生影响,特别当内存中无引用对象多了以后,JVM的GC就会开始工作,那速度是一定会相当慢的。
每个字符串缓冲区都有一定的容量。
只要字符串缓冲区所包含的字符序列的长度没有超出此容量,就无需分配新的内部缓冲区数组。
如果内部缓冲区溢出,则此容量自动增大。
从JDK5.0开始,为该类增添了一个单个线程使用的等价类,即StringBuilder。
与该类相比,通常应该优先使用StringBuilder类,因为它支持所有相同的操作,但由于它不执行同步,所以速度更快。
但是如果将StringBuilder的实例用于多个线程是不安全的。
需要这样的同步,则建议使用StringBuffer
2.说说ArrayList和LinkedList、HashMap和Hashtable的区别
ArrayList采用的是数组形式来保存对象的,这种方式将对象放在连续的位置中,所以最大的缺点就是插入删除时非常麻烦
LinkedList采用的将对象存放在独立的空间中,而且在每个空间中还保存下一个链接的索引但是缺点就是查找非常麻烦要丛第一个索引开始
Hashtable和HashMap类有三个重要的不同之处。
第一个不同主要是历史原因。
Hashtable是基于陈旧的Dictionary类的,HashMap是Java1.2引进的Map接口的一个实现。
也许最重要的不同是Hashtable的方法是同步的,而HashMap的方法不是。
这就意味着,虽然你可以不用采取任何特殊的行为就可以在一个多线程的应用程序中用一个Hashtable,但你必须同样地为一个HashMap提供外同步。
一个方便的方法就是利用Collections类的静态的synchronizedMap()方法,它创建一个线程安全的Map对象,并把它作为一个封装的对象来返回。
这个对象的方法可以让你同步访问潜在的HashMap。
这么做的结果就是当你不需要同步时,你不能切断Hashtable中的同步(比如在一个单线程的应用程序中),而且同步增加了很多处理费用。
第三点不同是,只有HashMap可以让你将空值作为一个表的条目的key或value。
HashMap中只有一条记录可以是一个空的key,但任意数量的条目可以是空的value。
这就是说,如果在表中没有发现搜索键,或者如果发现了搜索键,但它是一个空的值,那么get()将返回null。
如果有必要,用containKey()方法来区别这两种情况。
z
3.如何创建并启动一个新线程?
线程的状态有哪些?
说一说他们之间是如何转化的?
1)如何创建并启动一个新线程?
java语言已经内置了多线程支持,所有实现Runnable接口的类都可被启动一个新线程,新线程会执行该实例的run()方法,当run()方法执行完毕后,线程就结束了。
一旦一个线程执行完毕,这个实例就不能再重新启动,只能重新生成一个新实例,再启动一个新线程。
Thread类是实现了Runnable接口的一个实例,它代表一个线程的实例,并且,启动线程的唯一方法就是通过Thread类的start()实例方法:
Threadt=newThread();
t.start();
start()方法是一个native方法,它将启动一个新线程,并执行run()方法。
Thread类默认的run()方法什么也不做就退出了。
注意:
直接调用run()方法并不会启动一个新线程,它和调用一个普通的java方法没有什么区别。
因此,有两个方法可以实现自己的线程:
方法1:
自己的类extendThread,并复写run()方法,就可以启动新线程并执行自己定义的run()方法。
例如:
publicclassMyThreadextendsThread{
publicrun(){
System.out.println("MyThread.run()");
}
}
在合适的地方启动线程:
newMyThread().start();
方法2:
如果自己的类已经extends另一个类,就无法直接extendsThread,此时,必须实现一个Runnable接口:
publicclassMyThreadextendsOtherClassimplementsRunnable{
publicrun(){
System.out.println("MyThread.run()");
}
}
为了启动MyThread,需要首先实例化一个Thread,并传入自己的MyThread实例:
MyThreadmyt=newMyThread();
Threadt=newThread(myt);
t.start();
2)线程的状态有哪些?
说一说他们之间是如何转化的?
初始态:
一个线程调用了new方法之后,并在调用start方法之前的所处状态。
就绪:
一旦线程调用了start方法,线程就转到Runnable状态,
阻塞/NonRunnable:
线程处于阻塞/NonRunnable状态,这是由两种可能性造成的:
要么是因挂起而暂停的,要么是由于某些原因而阻塞的,例如包括等待IO请求的完成。
停止/退出:
线程转到退出状态,这有两种可能性,要么是run方法执行结束,要么是调用了stop方法
4.什么情况下会出现NullPointException,此异常需要显式try-catch吗?
为什么?
再举几个同一性质的常见的异常。
Hibernate中的save等方法以及Spring的Templete模板的大部分API,请问这些方法抛异常吗?
我们是否需要try-catch,说说这样设计的好处。
1)一个东西是null,就是说只有其名,没有实值内容,也没分配内存,当你要去取他的长度,对他进行操作当然就会NullPointException,NullPointerException这个东西换一个角度来看,没准是好处也不一定。
可以说,NullPointerException本身也是JAVA安全机制的一部分。
有UNIX写C和C++的经验的可能都知道,空指针会导致什么问题:
经常会导致程序的崩溃。
而JAVA在这点进行了改善,JAVA为了保证程序的强壮,总是会对对象的引用进行检查。
所以不再出险C/C++中的空指针错误,而仅仅是一个运行级别的异常-“NullPointerException”。
从这点上说,算是JAVA的一个好处吧。
2)NullPointException不需要我们显式try-catch,因为它属于RunTimeException,类似的还有ArithmeticException,IndexOutOfBoundsException等;
3)Hibernate、Spring都会抛出异常,但是基本都被封装成了RunTimeException,即我们可以不显式地去处理这些异常,这样设计我们就不需要关心底层到底是怎么实现的,我们要处理那些异常,我们只要知道调用就可以了。
5.谈谈你对Servlet的认识,请尽量描述的详细一些。
servlet是一中服务器端的编程语言,是j2ee中比较关键的组成部分。
servlet技术的推出,扩展了java语言在服务器端开发的功能,巩固了Java语言在服务器端开发中的地位,而且现在使用非常广泛的jsp技术也是居于servlet的原理,jsp+javabean+servlet成为实现MVC模式的一中有效选择。
servlet在本质上就是java类,编写servlet需要遵循java的基本语法,但是与一般java类所不同的是,servlet是只能运行在服务器端的Java类,而且必须遵循特殊的规范,在运行的过程中有自己的生命周期,这些特性都是servlet所都有的。
另外,servlet是和http紧密联系的,所以使用servlet几乎可以处理http各个方面的内容,这也正是servlet受到广大开发人员青睐的最大原因。
工作原理:
servlet需要在特定的容器中才能运行,在这里所说的容器,即servlet运行时所需要的运行环境。
一般情况下,市场上常见的javawebserver都可以支持servlet,如Tomcat、Resin、weblogic、WebSphere等,在本书中采用Tomcat作为Servlet的容器,由Tomcat为Servlet提供基本的运行环境。
Servlet容器环境在HTTP通信和Web服务器平台之间实现了一个抽象层。
Servlet容器负责白请求传递给Servlet,并把结果返回给客户。
容器环境也提供了配置Servlet应用的简单方法,并且也提供用XML文件配置Servlet的方法。
在使用Servlet的过程中,并发访问的问题由Servlet容器处理,当多个用户请求同一个Servlet的时候,Servlet容器负责为每一个用户启动一个线程,这些线程的运行和销毁由Servlet容器负责,而在传统的CGI程序中,是为每一个用户启动一个进程,因此Servlet的运行效率就要比CGI高出很多。
6.写出一个单例模式的例子。
说说单例的好处
单例模式也是一种比较常见的设计模式,它到底能带给我们什么好处呢?
其实无非是三个方面的作用:
1、控制资源的使用,通过线程同步来控制资源的并发访问;
2、控制实例产生的数量,达到节约资源的目的。
3、作为通信媒介使用,也就是数据共享,它可以在不建立直接关联的条件下,让多个不相关的两个线程或者进程之间实现通信。
单例模式分三种:
懒汉式单例、饿汉式单例、登记式单例三种
7.程序设计:
写出冒泡排序的算法。
publicclassBubblesort{
int[]bubble(inta[]){//函数
inttemp;
intsize=a.length;
for(inti=size-1;i>=1;i--){
for(intj=0;j
if(a[j]>a[j+1]){
temp=a[j];
a[j]=a[j+1];
a[j+1]=temp;
}
}
}
returna;
}
publicstaticvoidmain(Stringargs[]){
intarray[]={55,44,22,14,5};
for(inti=0;i System.out.print(array[i]+","); } System.out.println(); Bubblesortb=newBubblesort(); int[]result=b.bubble(array);//调用函数 for(inti=0;i System.out.print(result[i]+","); } } } 8.写出jsp中的九大内置对象 输入输出对象: request、response、out; 作用域通信对象: session、application、pageContext; servlet对象: page、config; 异常对象: exception 9.简述你对Statement,PreparedStatement,CallableStatement的理解 Statement(接口) PreparedStatement(接口) CallableStatement(接口) 以上三者为继承关系。 1).概念: Statement: (用于执行不带参数的简单SQL语句) 每次执行sql语句,数据库都要执行sql语句的编译,最好用于仅执行一次查询并返回结果的情形,效率高于PreparedStatement. PreparedStatement: (用于执行带或不带IN参数的预编译SQL语句) 执行的SQL语句中是可以带参数的,并支持批量执行SQL。 由于采用Cache机制,则预先编译的语句,就会放在Cache中,下次执行相同SQL语句时,则可以直接从Cache中取出来。 CallableStatement: (用于执行对数据库已存储过程的调用) 在JDBC中调用存储过程的语法如下所示: {call过程名[(? ? ...)]} 返回结果参数的过程的语法为: {? =call过程名[(? ? ...)]} 不带参数的存储过程的语法类似: {call过程名} CallableStatement中定义的所有方法都用于处理OUT参数或INOUT参数的输出部分: 注册OUT参数的JDBC类型(一般SQL类型)、从这些参数中检索结果,或者检查所返回的值是否为JDBCNULL。 10.列举出java中和时间日期相关的类。 并简单说明他们 java.util.Date……. java.sql.Date…….. java.sql.Time……. java.util.Calender……. SimpleDateFormat…… ……… 11.谈谈抽象类和接口的异同。 分别说明他们的使用场合 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类型的。 12.java中的IO流体系非常重要,请简单列举他们的分类,适当写出抽象父类的名字。 一IO流的分类 我们将IO流的分类有以下三种 1Input/Output 2基础流/过滤流 3字节流/字符流 ①Input/Output 这个比较简单,就是输入流,输出流 ②基础流/过滤流 基础流是最底层的流,直接从文件,网络中读取内容,或写入内容。 比如File...,ByteArray...,piped...,Sequece...。 过滤流是以其他基础流,进行封装。 比如Data...,Buffered...,LineNumber,pushback...。 ③字节流/字符流 字节流: 读取字节,,一般以stream结尾。 字符流: 读取字符,文字,一般以er结尾。 信息需要保密的时候用字节流操作。 无需保密的,比如配置信息等,可以用字符流操作。 二几种分类的组合 我们知道了上述三种分类,就可以对上述三种分类进行搭配。 FileInputStream: 文件字节输入流 DataInputStream: 就是数据字节输入流。 FileOutputStream: 文件字节输出流 DataOutputStream: 就是数据字节输出流。 13.简述java中Error和Exception的区别 Error类和Exception类都继承自Throwable类。 Error的继承关系: java.lang.Object --java.lang.Throwable --java.lang.Error Exception的继承关系: java.lang.Object --java.lang.Throwable --java.lang.Exception 二者的不同之处: Exception: 1.可以是可被控制(checked)或不可控制的(unchecked) 2.表示一个由程序员导致的错误 3.应该在应用程序级被处理 Error: 1.总是不可控制的(unchecked) 2.经常用来用于表示系统错误或低层资源的错误 3.如何可能的话,应该在系统级被捕捉 Java中定义了两类异常: 1)Checkedexception: 这类异常都是Exception的子类。 异常的向上抛出机制进行处理,假如子类可能产生A异常,那么在父类中也必须throwsA异常。 可能导致的问题: 代码效率低,耦合度过高。 2)Uncheckedexception: 这类异常都是RuntimeException的子类,虽然RuntimeException同样也是Exception的子类,但是它们是非凡的,它们不能通过clientcode来试图解决,所以称为Uncheckedexception。 另外: error表示恢复不是不可能但很困难的情况下的一种严重问题。 比如说内存溢出。 不可能指望程序能处理这样的情况。 exception表示一种设计或实现问题。 也就是说,它表示如果程序运行正常,从不会发生的情况。 14.谈一谈JDBC、Hibernate、DAO 1)Hibernate是一个面向Java环境的对象/关系数据库映射工具。 用来把对象模型表示的对象映射到基于SQL的关系模型结构中去。 Hibernate不仅仅管理Java类到数据库表的映射,还提供数据查询和获取数据的方法,可以大幅度减少开发时人工使用SQL和JDBC处理数据的时间。 Hibernate的目标是对于开发者通常的数据持久化相关的编程任务,解放其中的95%。 是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。 Hibernate可以应用在任何使用JDBC的场合,既可以在Java的客户端程序实用,也可以在Servlet/JSP的Web应用中使用,最具革命意义的是,Hibernate可以在应用EJB的J2EE架构中取代CMP,完成数据持久化的重任。 2)JDBC(JavaDataBaseConnectivity,java数据库连接)是一种用于执行SQL语句的JavaAPI,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。 JDBC提供了一种基准,据此可以构建更高级的工具和接口,使数据库开发人员能够编写数据库应用程序,同时,JDBC也是个商标名。 有了JDBC,向各种关系数据发送SQL语句就是一件很容易的事。 换言之,有了JDBCAPI,就不必为访问Sybase数据库专门写一个程序,为访问Oracle数据库又专门写一个程序,或为访问Informix数据库又编写另一个程序等等,程序员只需用JDBCAPI写一个程序就够了,它可向相应数据库发送SQL调用,将Java语言和JDBC结合起来使程序员只须写一遍程序就可以让它在任何平台上运行 3)DAO是DataAccessObject数据访问接口,数据访问: 故名思义就是与数据库打交道。 夹在业务逻辑与数据库资源中间。 在核心J2EE模式中是这样介绍DAO模式的: 为了建立一个健壮的J2EE应用,应该将所有对数据源的访问操作抽象封装在一个公共API中。 用程序设计的语言来说,就是建立一个接口,接口中定义了此应用程序中将会用到的所有事务方法。 在这个应用程序中,当需要和数据源进行交互的时候则使用这个接口,并且编写一个单独的类来实现这个接口在逻辑上对应这个特定的数据存储。 DAO(数据访问对象)是一种应用程序编程接口(API),存在于微软的VisualBasic中,它允许程序员请求对微软的Access数据库的访问。 DAO是微软的第一个面向对象的数据库接口。 DAO对象封闭了Access的Jet函数。 通过Jet函数,它还可以访问其他的结构化查询语言(SQL)数据库。 15.请描述一个你常用的MVC框架工作流程。 1)Struts1工作流程 对于采用Struts框架的Web应用,在Web应用启动时就会加载并初始化ActionServlet,ActionServlet从struts-config.xml文件中读取配置信息,把它们存放到各种配置对象中,例如Action的映射信息存放在ActionMapping对象中。 (struts的配置文件struts-config.xml: 一个用户请求是通过ActionServlet来处理和转发的。 那么,ActionServlet如何决定把用户请求转发给哪个Action对象呢? 这就需要一些描述用户请求路径和Action映射关系的配置信息了。 在Struts中,这些配置映射信息都存放在特定的XML文件struts-config.xml中。 在该配置文件中,每一个Action的映射信息都通过一个 这些配置信息在系统启动的时候被读入内存,供Struts在运行期间使用。 在内存中,每一个 用户通过客户端向服务器发出一个请求,而我们已经在web.xml配置了所有符合某某格式的请求都将由指定的Servlet来处理。 比如说: 只要是以.do结尾的请求(*.do)都由org.apache.struts.action.ActionServlet来对其进行处理。 而ActionServlet和ActionMapping都已经在服务器启动的时候被加载到内存里面。 结合登录例子: 当用户登录时,地址栏的URL为: http: //localhost: 8080/struts_login/login.do ActionServlet会拿到用户的请求,并且去分析这个URL,它会截下/login(不包含.do)这一部分,截来之后,它的目的是为了去struts-config.xml这个配置文件里面找 找到之后,ActionServlet会把表单提交的数据给存放到ActionForm上,那ActionServlet又是怎么找到ActionForm的呢? 因为Action标签里面有一个属性是name,它的值就是所要找的ActionForm的名字,这
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Java 综合测试 答案