Java程序员面试分类模拟18_第1页
Java程序员面试分类模拟18_第2页
Java程序员面试分类模拟18_第3页
Java程序员面试分类模拟18_第4页
Java程序员面试分类模拟18_第5页
已阅读5页,还剩20页未读 继续免费阅读

下载本文档

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

文档简介

Java程序员面试分类模拟18一、单项选择题1.

下列关于进程的描述中,不正确的是______。A.进程在退出时会自动关闭自己打开的所有文件B.进程在退出时会自动关闭自己打开的网络链接C.进程在退出(江南博哥)时会自动销毁自己创建的所有线程D.进程在退出时会自动销毁自己打开的共享内存正确答案:D[解析]进程是一个具有一定独立功能的程序关于某个数据集合的一次运行活动。它是操作系统动态执行的基本单元,在传统的操作系统中,进程既是基本的分配单元,也是基本的执行单元。进程开启的线程都仅仅属于本进程,所以,进程在退出时,会自动关闭进程打开的文件、自己打开的网络,同时销毁自己创建的所有线程。但是,由于共享内存是公用的,一旦被销毁了,会对其他正在使用这段内存的进程造成破坏,所以,进程在退出时不会自动销毁自己打开的共享内存。所以,选项D错误,而选项A、选项B、选项C都是正确的。

2.

链表要求元素的存储地址______。A.必须连续B.部分连续C.必须不连续D.连续与否均可正确答案:D[解析]链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成。每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域。由此可见,可以通过结点的指针域找到下一个结点,存储地址是否连续并不重要。所以,选项A、选项B和选项C错误,选项D正确。

需要注意的是,数组与链表不同,对数组的访问是通过数组的下标来实现的,所以,对于数组而言,存储地址必须是连续的。

所以,本题的答案为D。

3.

在进程调度算法中,下面算法中,适用于运行时间可以预知的批处理调度算法是______。A.最短作业优先B.先来先服务C.优先级调度D.时间片轮转调度正确答案:A[解析]对于选项A,最短作业优先(ShortestJobFirst,SJF)是对FCFS算法的改进,其目标是减少平均周转时间。其优点是相比FCFS(FirstComeFirstServed,先来先服务)改善了平均周转时间和平均带权周转时间,缩短了作业的等待时间,同时,提高了系统的吞吐量。但缺点就是对长作业非常不利,可能长时间得不到执行;未能依据作业的紧迫程度来划分执行的优先级;难以准确估计作业(进程)的执行时间,从而影响调度性能。最短作业优先是一种适用于运行时间可以预知的非抢占式的批处理调度算法。所以,选项A正确。

对于选项B,先来先服务(FirstComeFirstSerred,FCFS)是最简单的调度算法,按先后顺序进行调度;适用于长作业,而不利于短作业;有利于CPU繁忙的作业,而不利于I/O繁忙的作业。所以,选项B错误。

对于选项C,优先级算法(PriorityScheduling)是多级队列算法的改进,平衡了各进程对响应时间的要求。适用于作业调度和进程调度,可分成抢先式和非抢先式。所以,选项C错误。

对于选项D,轮转法(RoundRobin)是让每个进程在就绪队列中的等待时间与享受服务的时间成正比例。所以,选项D错误。

所以,本题的答案为A。

4.

以下是合法的byte类型的数据的是______。A.-129B.127C.128D.(int)-130正确答案:B[解析]在Java语言中,byte只占了一个字节(8位),它的取值范围为[-128,127],因此,只有选项B是合法的,byte的包装类为Byte,也可以通过下面的代码来查看byte的最大值和最小值:System.out.println(Byte.MAX_VALUE);System.out.println(Byte.MIN_VALUE);

5.

下面属于面向字符的输入流的是______。A.BufferedWriterB.ObjectInputStreamC.FileInputStreamD.InputStreamReader正确答案:D[解析]在Java语言中,输入和输出都被称为抽象的流,流可以看作是一组有序的字节集合,即数据在两个设备之间的传输。

流的本质是数据传输,根据处理数据类型的不同,流可以分为两大类:字节流和字符流。其中,字节流以字节(8bit)为单位,包含两个抽象类:InputStream(输入流)和OutputStream(输出流)。字符流以字符(16bit)为单位,根据码表映射字符,一次可以读多个字节,它包含两个抽象类:Reader(输入流)和Writer(输出流)。其中,字节流和字符流最主要的区别为:字节流在处理输入输出的时候不会用到缓存,而字符流用到了缓存。

对于选项A,Writer代表输出流。所以,选项A错误。

对于选项B和选项C,Stream代表的是字节流。所以,选项B和选项C错误。

对于选项D,InputStreamReader表示的是输入流。所以,选项D正确。

6.

下列关于地址转换的描述中,错误的是______。A.地址转换解决了因特网地址短缺所面临的问题B.地址转换实现了对用户透明的网络外部地址的分配C.使用地址转换后,对IP包加长、快速转发不会造成什么影响D.地址转换为内部主机提供了一定的“隐私”正确答案:B[解析]对于选项A,随着网络技术的不断发展,IP地址紧缺已经是一个非常突出的问题,网络地址转换正是为了解决这个问题而出现的,网络地址转换的作用是把内网的私有地址转化成外网的公有地址,使得内部网络上的(被设置为私有IP地址的)主机可以访问Internet。当大量的内部主机只能使用少量的合法的外部地址,就可以使用NAT(NetworkAddressTranslation,网络地址转换)把内部地址转化成外部地址。所以,选项A正确。

对于选项B,地址转换实现了对用户透明的网络内部地址的分配,而不是外部。所以,选项B错误。

对于选项C,地址转换只会对内网与公网地址进行映射,不会影响其他功能。所以,选项C正确。

对于选项D,由于网络内部计算机在访问Internet的时候都会被映射为一个公网地址,因此,并没有把计算机实际的地址暴露在Internet中,所以,提供了一定的“隐私”。所以,选项D正确。

7.

有如下代码:publicclassTest{staticinti;publicinttest(){i++;returni;}publicstaticvoidmain(Stringargs[]){Testtest=newTest();test.test();System.out.println(newTest().test());}}

编译运行后,输出结果是______。A.0B.1C.2D.3正确答案:C[解析]被关键字static修饰的属性表示这个属性是类的属性,是所有对象共享的,这个类中定义了一个类的属性i(这个类的属性会被默认初始化为0)。在main方法中,首先实例化了一个对象,并调用了test方法,当调用结束后,变量i的值变为1,接着在System.out.println语句内又创建了一个对象,并调用了test方法,由于i是所有对象共享的,因此,等到调用结束后,i的值由1变成2,故返回值为2,输出结果为2。所以,选项C正确。

8.

已知一棵二叉树的前序遍历结果是ACDEFHGB,中序遍历结果是DECALHFBG,那么该二叉树的后序遍历的结果为______。A.HGFEDCBAB.EDCHBGFAC.BGFHEDCAD.EDCBGHFA正确答案:B

9.

图的广度优先搜索算法需使用的辅助数据结构为______。A.三元组B.队列C.二叉树D.栈正确答案:B[解析]图的广度优先搜索算法需使用的辅助数据结构为队列,图的深度优先搜索算法需使用的辅助数据结构为栈。

什么是广度优先搜索呢?当一个结点被加入队列时,要标记为已遍历,遍历过程中,对于队列第一个元素,遍历其所有能够一步达到的结点;如果是标记未遍历的,将其加入队列,从第一个元素出发所有能一步直接达到的结点遍历结束后将这个元素出列。广度优先则需要保证先访问顶点的未访问邻接点先访问,恰好就是先进先出。整个过程也可以看作一个倒立的树形:

1)把根结点放到队列的末尾。

2)每次从队列的头部取出一个元素,查看这个元素所有的一级元素,把它们放到队列的末尾。并把这个元素记为它下一级元素的前驱。

3)找到所要找的元素时结束程序。

4)如果遍历整棵树还没有找到,结束程序。

什么是图的深度优先搜索呢?当遍历到某个结点A时,如果是标记未遍历,将其入栈,遍历它能够一步直接达到的结点;如果是标记未遍历,将其入栈且标记为已遍历,然后对其进行类似A的操作,否则,找能够一步直接达到的结点进行类似操作,直到所有能够一步直接达到的结点都已遍历,将A出栈。

整个过程可以想象成一个倒立的树形:

1)把根结点压入栈中。

2)每次从栈中弹出一个元素,搜索所有在它下一级的元素,把这些元素压入栈中。并把这个元素记为它下一级元素的前驱。

3)找到所要找的元素时结束程序。

4)如果遍历整棵树还没有找到,结束程序。

所以,本题的答案为B。

10.

下列关于Java语言中关键字super的说法中,正确的是______。A.关键字super是在子类对象中指代其父类对象的引用B.子类通过关键字super只能调用父类的属性,而不能调用父类的方法C.子类通过关键字super只能调用父类的方法,而不能调用父类的属性D.关键字super不仅可以指代子类的直接父类,还可以指代父类的父类正确答案:A[解析]在Java语言中,关键字this指的是对当前对象的引用,关键字super指的是当前对象里面的父对象的引用。当引用当前对象的某个方法或某个成员时,通常会使用this,而通过super可以调用父类的构造方法、父类的方法和属性。如下例所示:classBase{publicintstatus=0;Base(intstatus){this.status=status;}publicvoidprint(){System.out.println("base");}}classSubextendsBase{publicintstatus;Sub(intstatus){super(status-1);this.status=status;}publicvoidprintSub(){System.out.println("sub");System.out.println("status="+status);}publicvoidprintBase(){super.print();System.out.println("status="+super.status);}}publicclassTest{publicstaticvoidmain(Stringargs[]){Subs=newSub(2);s.printBase();s.printSub();}}程序的运行结果为:basestatus=1substatus=2

通过以上分析可知,选项A正确,选项B和选项C错误,对于选项D,super只能表示父类的引用,不能表示父类的父类。因此,选项D错误。

11.

以public修饰的类如下所示:publicclassCar{...},则类Car______。A.可被其他程序包中的类使用B.不能被其他类继承C.不能被任意其他类使用D.仅能被本程序包中的类使用正确答案:A[解析]对于选项A与选项C,被public修饰的类的作用域最大,可以被程序中任意的类使用。因此,选项A正确,选项C错误。

对于选项B,只有当一个类被final修饰时,才不能被其他类继承。因此,选项B错误。

对于选项D,当作用域为default时(不被public修饰),仅能被本程序包中的类使用。因此,选项D错误。

12.

设有一个关系:DEPT(DNO,DNAME),如果要找出倒数第三个字母为W,并且至少包含4个字母的DNAME,则查询条件子句应写成WHEREDNAMELIKE______A.'__W_%'B.'_%W__'C.'_W__'D.'_W_%'正确答案:B[解析]在SQL语言中,%和表示的是通配符(通配符指的是一种特殊语句,用来进行模糊查询的,在匹配字符串时,可以使用它来代替一个或多个真正字符,当不知道真正字符或者懒得输入完整名字时,常常使用通配符代替一个或多个真正的字符),其中“%”表示的是0个或多个字符,而“_”表示的是一个字符。

在本题的查找条件中,要求倒数第三个字母为‘W’,所以,字符‘W’后面有两个其他字符,可以表示成“W__”,并且还要求至少包含4个字母,而当以“%”开头时,它表示的字符可以不存在,所以,开头应加一个“_”,那么查询条件子句应写成WHEREDNAMELIKE'_%W__'。

所以,本题的答案为B。

需要注意的是,除了以上介绍的两种通配符以外,SQL语言中还有两个通配符,[charlist]表示字符列中的任何单一字符,[^charlist]或者[!charlist]表示不在字符列中的任何一个字符。例如,要求从名为“Persons”的表中选取居住的城市以“A”或“L”或“N”开头的人,可以使用下面的SELECT语句:SELECT*FROMPersonsWHERECityLIKE'[ALN]%'。要求从名为“Persons”的表中选取居住的城市不以“A”或“L”或“N”开头的人,可以使用下面的SELECT语句:SELECT*FROMPersonsWHERECityLIKE'[!ALN]%'。

13.

排序算法的稳定是指关键码相同的记录排序前后相对位置不发生改变,下面排序算法中,______是不稳定的。A.插入排序B.冒泡排序C.快速排序D.归并排序正确答案:C

14.

以下不是Object类的方法的是______。A.hashCode()B.finalize()C.notif()D.hasNext()正确答案:D[解析]Object类是类层次结构的根,在Java语言中,所有的类从根本上而言都继承自这个类。而且,Object类是Java语言中唯一没有父类的类,而其他所有的类,包括标准容器类,例如数组,都继承了Object类。

具体而言,Object类的方法见下表。Object类的方法方法名返回类型方法描述clone()Object创建并返回此对象的一个副本equals(Objectobj)boolean判断obj对象是否与此对象相等finalize()void当垃圾回收器确定不存在对该对象的更多引用时,由对象的垃圾回收器调用此方法getClass()Class<?>返回此Object的运行时类hashCode()int返回该对象的散列码值notify()void唤醒在此对象监视器上等待的单个线程notifyAll()void唤醒在此对象监视器上等待的所有线程toString()String返回该对象的字符串表示wait()void在其他线程调用此对象的notiy()方法或notifyAll()方法前,使当前线程等待wait(longtimeout)void在其他线程调用此对象的notify()方法或notifyAll()方法,或者超过指定的时间量前,使当前线程等待wait(longtimeout,intnanos)void在其他线程调用此对象的notify()方法或notiryAll()方法,或者其他某个线程中断当前线程,或者已超过某个实际时间量前,使当前线程等待

由此可见,Object类没有hasNext()方法。所以,选项D正确。

15.

若一棵二叉树的前序遍历序列为aebdc,后序遍历序列为bcdea,则根结点的孩子结点______。A.只有eB.有e,bC.有e,cD.不确定正确答案:A[解析]二叉树是每个结点最多有两个子树的树结构,通常子树被称作“左子树”(LeftSubtree)和“右子树”(RightSubtree)。所谓遍历(Traversal),是指沿着某条搜索路线,依次对树中每个结点均做一次且仅做一次访问。而通常情况下,如果中序遍历未知,则是无法还原出二叉树的。但本题只要求判断根结点的孩子结点,因此,是可以实现的。

二叉树中的前序遍历也叫作先根遍历、先序遍历,遵循的原则为“根左右”,即首先遍历根结点,再遍历根结点的左子树结点,最后遍历根结点的右子树结点。从前序遍历序列可知,结点e紧跟着结点a,可得结论:①结点a为根结点;②当结点e为结点a的右孩子时,结点a有且仅有结点e一个孩子。

二叉树中的后序遍历也叫作后根遍历,遵循的原则为“左右根”,即首先遍历左子树结点,再遍历右子树结点,最后遍历根结点。从后序遍历序列可知,结点e之后紧跟结点a,可得结论:③当结点e为结点a的左孩子时,结点a有且仅有结点e一个孩子。从结论①②③可知根结点的孩子有且仅有e。

通过前序遍历序列和后序遍历序列不能够唯一确定一棵二叉树,本例子存在如图所示的两种情况。

本题的两种情况

但无论是以上哪一种情况,都可以看出根结点的孩子结点只有e。

通过以上分析可知,选项A是正确的。

16.

有如下代码:

publicclassTest

{

publicstaticvoidmain(String[]args)

{

inta[]={0,1,2,3,4};

intsum=0;

try

{

for(inti=0;i<6;i++)

{

sum+=a[i];

}

System.out.println("sum="+sum);

}

catch(java.lang.ArrayIndexOutOfBoundsExceptione)

{

System.out.println("数组下标越界");

}

finally

{

System.out.println("程序结束")

}

}

}

以上程序的运行结果为______。A.10程序结束B.10数组下标越界程序结束C.数组下标越界程序结束D.程序结束正确答案:C[解析]本题中,首先定义了长度为5的数组(数组下标范围为0~4),在接下来访问数组的时候,当遍历到下标为5的数组元素时,会抛出ArraylndexOutOfBoundsException异常,从而执行catch块的代码输出:数组下标越界,接着会运行finally块的代码输出:程序结束。所以,选项C正确。

17.

在虚拟分页存储管理系统中,若进程访问的页面不在主存,且主存中没有可用的空闲块时,系统正确的处理顺序是______。A.决定淘汰页—>页面调出—>缺页中断—>页面调入B.决定淘汰页—>页面调入—>缺页中断—>页面调出C.缺页中断—>决定淘汰页—>页面调出—>页面调入D.缺页中断—>决定淘汰页—>页面调入—>页面调出正确答案:C[解析]虚拟分页存储管理的步骤如下:

1)首先,在程序运行中发现所需要的页不在物理内存时,此时会发出缺页中断,并根据算法决定淘汰哪些页。

2)然后,把物理内存中的淘汰页存储到外存,此过程被称为页面调出。

3)最后,把需要的内容从外存调入物理内存指定页,此过程被称为页面调入。

其实,操作系统就像一辆公交车,只有旧乘客先下来,新乘客才能上去,所以,页面调出为先,页面调入在后。而在页面调出前,必须要存在着缺页中断,而且已经决定了哪些页面需要调出才行。

所以,完整的过程应该是缺页中断—>决定淘汰页—>页面调出—>页面调入,选项C正确。

18.

净室软件工程(Cleanroom)是软件开发的一种形式化方法,可以开发较高质量的软件,它发现和排除错误的主要机制是______。A.正确性验证B.黑白盒测试C.集成测试D.基本路径测试正确答案:A[解析]净室软件工程是一种应用数学与统计学理论以经济的方式生产高质量软件的工程技术,力图通过严格的工程化的软件过程达到开发中的零缺陷或接近零缺陷。它提倡开发者不需要进行单元测试,而是进行正确性验证和统计质量控制。所以,选项A正确。

19.

访问修饰符作用范围由大到小是______。A.private-protected-default-publicB.public-protected-default-privateC.private-default-protected-publicD.public-default-protected-private正确答案:B[解析]在Java语言中,类的权限访问修饰符有以下几种:private、default(package)、protected和public。以下将具体对这几个权限访问修饰符进行介绍。

1)私有权限(private):private可以修饰数据成员、构造方法和方法成员,不可以修饰类(此处指外部类,不考虑内部类)。被private修饰的成员,只能在定义它们的类中使用,在其他类中不能调用。

2)默认权限(default):类、数据成员、构造方法和方法成员等都能够使用默认权限,即不被private、protected和public修饰。默认权限即同包权限,同包权限的元素只能在定义它们的类中以及同包的类中被调用。

3)受保护权限(protected):protected可以修饰数据成员、构造方法和方法成员,不可以修饰类(此处指外部类,不考虑内部类)。被protected修饰的成员,能在定义它们的类中以及同包的类中被调用。如果有不同包的类想调用它们,那么这个类必须是它的子类。

4)公共权限(public):public可以修饰类、数据成员、构造方法和方法成员。被public修饰的成员,可以在任何一个类中被调用,不管同包或不同包,是权限最大的一个修饰符。

以上几种修饰符的作用范围见下表(表中√表示可访问,×表示不可访问)。修饰符的作用范围范围privatedefaultprotectedpublic同一类√√√√同一包中的类×√√√同一包中的类、不同包中的子类××√√所有×××√

由上表可知,访问修饰符的作用范围由大到小依次是public、protected、default和private。所以,选项B正确。

20.

以下关于异常的描述中,正确的是______。A.如果一个方法声明将抛出某个异常,它就必须真的抛出那个异常B.一旦出现异常,程序运行就终止了C.在catch子句中匹配异常是一种精确匹配D.可能抛出系统异常的方法是不需要声明异常的正确答案:D[解析]异常是指程序运行时(非编译时)所发生的非正常情况或错误,当程序违反了语义规则时,JVM就会将出现的错误表示为一个异常并抛出。这个异常可以在catch程序块中进行捕获,然后进行处理。而异常处理的目的则是为了提高程序的安全性与健壮性。

Java语言提供了两种错误的处理类,分别为Error(错误)和Exception(异常),且它们拥有共同的父类:Throwable。

Error表示程序在运行期间出现了非常严重的错误,并且该错误是不可恢复的,由于这属于JVM层次的严重错误,所以,这种错误是会导致程序终止执行的。此外,编译器不会检查Error是否被处理,因此,在程序中不推荐去捕获Error类型的异常,主要原因是运行时异常多是由于逻辑错误导致的,属于应该解决的错误,也就是说,一个正确的程序中是不应该存在Error的。OutOfMemoryErTor、ThreadDeath等都属于错误。当这些异常发生时,JVM一般会选择将线程终止。

Exception表示可恢复的异常,是编译器可以捕捉到的。它包含两种类型:运行时异常(RuntimeException)和检查异常(CheckedException)。

1)检查异常是在程序中最经常碰到的异常,所有继承自Exception并且不是运行时异常的异常都是检查异常,比如最常见的IO异常和SQL异常。对于这种异常,都发生在编译阶段,Java编译器强制程序去捕获此类型的异常,即把可能会出现这些异常的代码放到try块中,把对异常的处理的代码放到catch块中。这种异常一般在如下几种情况中使用:

①异常的发生并不会导致程序出错,进行处理后可以继续执行后续的操作。例如,当连接数据库失败后,可以重新连接后进行后续操作。

②程序依赖于不可靠的外部条件,例如系统IO。

2)对于运行时异常,编译器没有强制对其进行捕获并处理。如果不对这种异常进行处理,当出现这种异常时,会由JVM来处理。在Java语言中,最常见的运行时异常有如下几种:NullPointerException(空指针异常)、ArrayStoreException(数据存储异常)、ClassCastException(类型转换异常)、InexOutOfBoundException(数组越界异常)、BufferOverflowException(缓冲区溢出异常)和ArithmeticException(算术异常)等。

出现运行时异常后,系统会把异常一直往上层抛出,直到遇到处理代码为止。如果没有处理块,则抛到最上层,如果是多线程就由Thread.run()方法抛出,如果是单线程,就被main()方法抛出。抛出之后,如果是线程,这个线程也就退出了。如果是主程序抛出的异常,那么整个程序也就退出了。所以,如果不对运行时异常进行处理,后果是非常严重的,一旦发生,要么是线程中止,要么是主程序终止。

在使用异常处理时,还需要注意以下几个问题:

1)Java异常处理用到了多态的概念,如果在异常处理过程中,首先捕获了基类,然后再捕获子类,那么捕获子类的代码块将永远不会被执行。因此,在进行异常捕获的时候,正确的写法是:首先捕获子类,然后再捕获基类的异常信息。如下例所示:正确的写法错误的写法try{//accessdbcode}catch(SQLExceptione1){//dealwiththisexception}catch(Exceptioile2){}try{//accessdbcode}catch(Exceptione1){//dealwitllthisexception}catch(SQLExceptione2){}

2)尽早抛出异常,同时对捕获的异常进行处理,或者从错误中恢复,或者让程序继续执行。对捕获的异常不进行任何处理是一个非常不好的习惯,这样的代码将非常不利于调试。当然,也不是抛出异常越多越好,对于有些异常类型,例如运行时异常,实际上根本不必处理。

3)可以根据实际的需求自定义异常类,这些自定义的异常类只要继承自Exception类即可。

4)异常能处理就处理,不能处理就抛出。对于一般异常,如果不能进行行之有效地处理,最好转换为运行时异常抛出。对于没有处理的异常,最终JVM会进行处理。

本题中,对于选项A,一个方法声明了抛出一个异常只表明这个方法有可能会抛出这个异常,而不是一定会抛出这个异常。因此,选项A错误。

对于选项B,如果出现的异常被捕获到,并进行相应的处理后,程序可以继续运行,而不会终止。因此,选项B错误。

对于选项C,异常匹配不是一种精确的匹配,使用了多态的概念。假如异常A是异常B的子类,如果有异常A抛出,在捕获异常的代码中,不仅可以匹配异常A,而且也可以匹配异常B。因此,选项C错误。

对于选项D,对于可能抛出的运行时异常,编译器没有强制对其进行声明,只有检查异常(例如IOException),编译器才会强制要求在方法中声明。因此,选项D正确。

21.

下列关于构造方法的描述中,错误的是______。A.Java语言规定构造方法没有返回值,但不用void声明B.Java语言规定构造方法名与类名必须相同C.Java语言规定构造方法不可以重载D.Java语言规定构造方法不能直接被调用正确答案:C[解析]构造方法是一种特殊的方法,用来在对象实例化时初始化对象的成员变量。在Java语言中,构造方法具有以下特点:

1)构造方法必须与类的名字相同,并且不能有返回值(返回值也不能为void)。

2)每个类可以有多个构造方法。当开发人员没有提供构造方法时,编译器在把源代码编译成字节码的过程中会提供一个没有参数的默认构造方法,但该构造方法不会执行任何代码。如果开发人员提供了构造方法,那么编译器就不会再创建默认的构造方法。

3)构造方法可以有0个、1个或1个以上的参数。

4)构造方法总是伴随着new操作一起调用,不能由程序的编写者直接调用,必须要由系统调用。构造方法在对象实例化时会被自动调用,且只运行一次,而普通的方法是在程序执行到它时才被调用,可以被该对象调用多次。

5)构造方法的主要作用是完成对象的初始化工作。

6)构造方法不能被继承,因此,它不能被覆盖,但是构造方法能够被重载,可以使用不同的参数个数或参数类型来定义多个构造方法。

7)子类可以通过关键字super来显式地调用父类的构造方法。当父类没有提供无参数的构造方法时,子类的构造方法中必须显式地调用父类的构造方法。如果父类中提供了无参数的构造方法,此时子类的构造方法就可以不显式地调用父类的构造方法,在这种情况下,编译器会默认调用父类的无参数的构造方法。当有父类时,在实例化对象时,会首先执行父类的构造方法,然后才执行子类的构造方法。

8)当父类和子类都没有定义构造方法时,编译器会为父类生成一个默认的无参数的构造方法,给子类也生成一个默认的无参数的构造方法。此外,默认构造器的修饰符只与当前类的修饰符有关(例如,如果一个类被定义为public,那么它的构造方法也是public)。

从以上分析可知,选项A和选项B正确,选项C错误。

对于选项D,在Java语言中,当类在实例化时,会自动调用构造方法,而不能显式地调用构造方法。因此,选项D正确。

22.

软件复用是使用已有的软件产品(例如设计、代码和文档等)来开发新的软件系统的过程。为了提高构件(Component)的复用率,通常要求构件具有较好的______。A.专用性和不变性B.专用性和可变性C.通用性和不变性D.通用性和可变性正确答案:C[解析]软件复用(SoftwareReuse)是将已有软件的各种有关知识用于建立新的软件,以缩减软件开发和维护的花费。为了提高构件的复用率,通常要求构件具有较好的通用性与不变性。所以,选项C正确。

23.

某二叉树按中序遍历的序列为SYZ,则该二叉树可能存在______种情况。A.2B.3C.4D.5正确答案:D[解析]由于二叉树的中序遍历序列为SYZ,所以,可以分别以字符S、Y、Z为根构建二叉树。

(1)S为根

此时可以构建2种不同的二叉树。

二叉树结构如图1所示。

图1

S为根的二叉树

(2)Y为根

此时可以构建1种二叉树。

二叉树结构如图2所示。

图2

Y为根的二叉树

(3)Z为根

此时可以构建2种不同的二叉树。

二叉树结构如图3所示。

图3

Z为根的二叉树

所以,一共可以构建2+1+2=5种不同的二叉树。所以,选项D正确。

24.

以下命令中,可以用来查看当前系统启动时间的是______。A.wB.topC.psD.uptime正确答案:D[解析]w命令用来显示当前登录的用户信息。top命令用来实时显示系统中各个进程的资源占用状况。ps命令用来列出系统中当前运行的那些进程。uptime命令主要用于获取主机运行时间和查询Linux系统负载等信息,可以显示系统现在时间、系统已经运行了多长时间、目前有多少登录用户以及系统在过去的1min、5min和15min内的平均负载。所以,选项D正确。

25.

将对象序列化,要实现的接口是______。A.RurmableB.CloneableC.SerializableD.Comparator正确答案:C

26.

一种既有利于短作业又兼顾长作业的调度方式是______。A.先来先服务B.均衡调度C.最短作业优先D.最高响应比优先正确答案:D[解析]本题中,选项A、选项B和选项C的调度方法都不满足题目要求,所以,选项A、选项B和选项C错误。

对于选项D,最高响应比优先法(HighestResponse_ratioNext,HRN)是对FCFS(FirstComeFirstServed,先来先服务)方式和SJF(ShortestJobFirst,最短作业优先)方式的一种综合平衡。FCFS方式只考虑每个作业的请求时间而未考虑执行时间的长短,而SJF方式只考虑执行时间而未考虑等待时间的长短。因此,这两种调度算法在某些极端情况下会带来不便。HRN调度策略同时考虑每个作业的等待时间长短和估计需要的执行时间长短,从中选出响应比最高的作业投入执行。响应比R定义如下:R=(W+T)/T=1+W/T,其中,T为该作业估计需要的执行时间,W为作业在后备状态队列中的等待时间。每当要进行作业调度时,系统计算每个作业的响应比,选择其中R最大者投入执行。这样,即使是长作业,随着它等待时间的增加,W/T也就随着增加,也就有机会获得调度执行。这种算法是介于FCFS和SJF之间的一种折中算法。由于长作业也有机会投入运行,在同一时间内处理的作业数显然要少于SJF法,当采用HRN方式时,其吞吐量将小于采用SJF法时的吞吐量。另外,由于每次调度前要计算响应比,系统开销也要相应增加。等待时问一定,要求服务的时间越短,先运行;要求服务的时间一定,等待时间越长,先运行。所以,最高响应比优先调度是一种既有利于短作业又兼顾长作业的调度方式。所以,选项D正确。

27.

以下关于RARP协议的说法中,正确的是______。A.RARP协议用于对IP协议进行差错控制B.RARP协议根据主机IP地址查询对应的MAC地址C.RARP协议根据MAC地址求主机对应的IP地址D.RARP协议根据交换的路由信息动态改变路由表正确答案:C[解析]ARP(AddressResolutionProtocol,地址解析协议)是一个位于TCP/IP协议栈中的低层协议,它用于映射计算机的物理地址与网络IP地址。在Internet分布式环境中,每个主机都被分配了一个32位的网络地址,此时就存在计算机的IP地址与物理地址之间的转换问题。ARP协议所要做的工作就是在主机发送帧前,根据目标IP地址获取MAC地址,以保证通信过程的顺畅。

其具体过程如下:首先,每台主机都会在自己的ARP缓冲区中建立一个ARP列表,用于存储IP地址与MAC地址的对应关系;然后,当源主机需要将一个数据包发送到目标主机时,会首先检查自己的ARP列表是否存在该IP地址对应的MAC地址,如果存在,则直接将数据包发送到该MAC地址,如果不存在,就向本地网段发起一个ARP请求的广播包,用于查询目标主机对应的MAC地址,此ARP请求数据包里包括源主机的IP地址、硬件地址以及目标主机的IP地址等;接着,网络中所有的主机收到这个ARP请求之后,会检查数据包中的目的IP是否与自己的IP地址一致,如果不同就忽略此数据包,如果相同,该主机会将发送端的MAC地址与IP地址添加到自己的ARP列表中,如果ARP列表中已经存在该IP地址的相关信息,则将其覆盖掉,然后给源主机发送一个ARP响应包,告诉对方自己是它所需要查找的MAC地址;最后源主机收到这个ARP响应包后,将得到的目的主机的IP地址和MAC地址添加到自己的ARP列表中,并利用此信息开始数据的传输,如果源主机一直没有收到ARP响应包,则表示ARP查询失败。

RARP(ReverseAddressResolutionProtocol,反向地址解析仂、议)与ARP工作方式相反。RARP发出要反向解析的物理地址并希望返回其对应的IP地址,应答包括由能够提供所需信息的RARP服务器发出的IP地址。RARP获取IP地址的过程如下:主机发起一个RARP请求的广播包,用于查询主机的IP地址,这个广播包中包含了主机的MAC地址。网络中的RARP服务器收到这个RARP请求后,检查其RARP列表,查询这个MAC地址对应的IP地址,如果找到,则发送响应包给请求主机,否则,不做任何响应。源主机获取到这个IP地址后就可以用这个IP地址进行通信。所以,选项C正确。

28.

在Applet子类中,一般需要重载父类的______方法来完成一些画图操作。A.stop()B.start()C.init()D.paint()正确答案:D[解析]Applet程序的开发必须继承Applet类,它有如下5个比较重要的方法:

(1)init()

当ADplet启动的时候,调用完构造方法后,就会调用init方法做一些初始化的工作。因此,这个方法中一般做一些初始化的工作。所以,选项C错误。

(2)start()

Applet第一次启动后,调用完init方法后,就会调用start方法来启动需要的一些线程。或者当用户离开HTML页面,然后重新返回页面的时候,start方法也会被调用。所以,选项A错误。

(3)paint(Graphicsg)

Applet每次重绘的时候都会调用paint方法进行画图。在开发的时候,需要继承这个类完成自己的画图的工作。所以,选项D正确。

(4)stop()

这个方法与start方法是相对应的,当用户离开HTML页面的时候,stop方法会被调用,用来停止start方法中启动的线程。所以,选项B错误。

(5)destory()

当Applet终止运行时,destory方法会被调用,用来释放所占用的资源。

所以,本题的答案为D。

29.

已知一棵二叉树,如果先序遍历的结点顺序为ADCEFGHB,中序遍历的结点顺序为cDFEGHAB,则后序遍历的结点顺序为______。A.CFHGEBDAB.CDFEGHBAC.FGHCDEBAD.CFHGEDBA正确答案:D[解析]要解答出本题,首先需要对各种遍历方式有一个清晰的认识。可以通过图1来介绍二叉树的三种遍历方式的区别。

图1

二叉树的遍历方式

1)先序遍历:先遍历根结点,再遍历左子树,最后遍历右子树。所以,图1的先序遍历序列是ABDECFG。

2)中序遍历:先遍历左子树,再遍历根结点,最后遍历右子树。所以,图1的中序遍历序列是DBEAFCG。

3)后序遍历:先遍历左子树,再遍历右子树,最后遍历根结点。所以,图1的后序遍历序列是DEBFGCA。

从上面的介绍可以看出,先序遍历序列的第一个结点一定是根结点,因此,本题中可以确定这个二叉树的根结点为A。由中序遍历的特点可以把树分为三部分:根结点A、A的左子树和A的右子树。在中序遍历的序列中,在A结点前面的序列一定是在A的左子树上,在结点A后面的序列一定在A的右子树上。由此可以确定:A的左子树包含的结点为CDFEGH,右子树包含的结点为B(见图2a)。接下来对A的左子树上的结点采用同样的方法进行分析:对于序列CDFEGH,先序遍历的时候先遍历到结点D,因此,结点D是这个子树的根结点;通过对中序遍历进行分析可以把CDFEGH分为三部分:根结点D、D的左子树包含的结点为C、D的右子树上包含的结点为FEGH(见图2b)。然后对FEGH用同样的方法进行分析:在先序遍历的序列中先遍历到的结点为E,因此,根结点为E,通过分析中序遍历的序列,可以把这个序列分成三部分:根结点E、E的左子树上的结点F和E的右子树上的结点GH(见图2c)。最后分析结点GH,在先序遍历序列中先遍历到G,则说明G为根结点,在中序遍历序列中先遍历到结点G,说明H是G右子树上的结点(见图2d)。由此可以发现,通过先序遍历和中序遍历完全确定了二叉树的结构,可以非常容易

图2

二叉树的遍历

所以,本题的答案为D。

30.

以下排序算法中,需要开辟额外的存储空间的是______。A.选择排序B.归并排序C.快速排序D.堆排序正确答案:B

二、论述题1.

用Java语言写一段访问Oracle数据库的程序,并实现数据查询。正确答案:示例代码如下:

importjava.sql.*;

publicclassTest{

publicConnectiongetConnection(){

Connectionconn=null;

Stringdriver="oracle.jdbc.driver.OracleDriver";

Stringurl="";

Stringname="user";

Stringpsw="password";

try{

Class.forName(driver);

conn=DriverManager.getConnection(url,name,psw);

}catch(ClassNotFoundExceptione){

e.printStackTrace();

}catch(SQLExceptione){

e.printStackTrace();

}

returnconn;

}

publicvoidselectFromOracle(){

Connectionconn=null;

PreparedStatementpstat=null;

ResultSetrs=null;

try{

conn=getConnection();

Stringsql="selectname,scorefromStudentwherename=?";

pstat=conn.prepareStatement(sql);

pstat.setString(1,"James");

rs=pstat.executeQuery();

while(rs.next()){

System.out.println(rs.getString("name")+1","+rs.getInt("score"));;

}

}catch(SQLExceptione){

e.printStackTrace();

}finally{

if(rs!=null)

try{

rs.close();

}catch(SQLExceptione){

e.printStackTrace();

}

if(pstat!=null)

try{

pstat.close();

)catch(SQLExceptione){

e.printStackTrace();

}

if(conn!=null)

try{

conn.close();

}catch(SQLExceptione){

e.printStackTrace();

}

}

}

}

2.

Hibernate中session的update()和saveOrUpdate()、load()和get()有什么区别?正确答案:Hibernate的对象有3种状态,分别为:瞬时态(Transient)、持久态(Persistent)和脱管态(Detached)。处于持久态的对象也被称为PO(PersistenceObject),瞬时对象和脱管对象也被称为VO(ValueObject)。

saveOrUpdate()方法同时包含了save()和update()方法的功能。Hibernate会根据对象的状态来确定是调用save()方法还是调用update()方法:若对象是持久化对象,则不进行任何操作,直接返回;若传入的对象与session中的另一个对象有相同的标识符,则抛出一个异常;若对象的标识符属性(用来唯一确定一个对象)在数据库中不存在或者是一个临时值,则调用save()方法把它保存到数据库中,否则,调用update()方法更新对象的值到数据库中。鉴于此,在使用时,若能确定对象的状态,则最好不要调用saveOrUpdate()方法,这样有助于提高效率,例如,如果能够确定这个对象所对应的值在数据库中肯定不存在,那么就可以直接调用save()方法。

get()方法与load()方法都是用来通过从数据库中加载所需的数据来创建一个持久化的对象,它们主要有以下几个不同点:

1)如果数据库中不存在该对象,load()方法会抛出一个ObjectNotFoundException异常,而get()方法则会返回null。

2)get()方法首先查询Session内部缓存,若不存在,则接着查询二级缓存,最后查询数据库;而load()方法在创建时会首先查询Session内部缓存,如果不存在,就创建代理对象,实际使用数据时才查询二级缓存和数据库,因此load()方法支持延迟加载(对象中的属性在使用时才会加载,而不是在创建对象时就加载所有属性)。

3)get()方法永远只返回实体类,而load()方法可以返回实体类的代理类实例。

4)get()方法和find()方法都是直接从数据库中检索,而load()方法的执行则比较复杂:首先查找Session的persistentContext中是否有缓存,若有,则直接返回;若没有,则判断是否是lazy。如果不是,直接访问数据库检索,查到记录返回,查不到抛出异常;若是lazy,则需要建立代理对象,对象的initialized属性为f

温馨提示

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

评论

0/150

提交评论