第五次测试复盘

1. 对某二叉树进行先序遍历的结果是ABDEFC,中序遍历的结果是DBFEAC,则后序遍历的结果是(B)

A DEEFAC
B DFEBCA
C CFEDBA
D CEFBDA

解析

先序遍历:根 -> 左子树 -> 右子树
中序遍历:左子树 -> 根 -> 右子树
后序遍历:左子树 -> 右子树 -> 根
1、根据先序遍历,根节点为A
2、根据后序遍历,A左子树是DBFE,右子树是C
3、根据先序遍历,A左子树中,B是A的左孩子
4、根据后序遍历,D是B的左孩子,EF是B的右子树
5、同上得树结构如图,后序遍历 DFEBCA
在这里插入图片描述
2. 某完全二叉树共有200个结点,则该二叉树中有(C)个叶子结点

A 50
B 75
C 100
D 25

解析:选C:
二叉树共有N个节点,求叶子节点数?
N为偶数,叶子节点为N/2
N为奇数,叶子节点为N/2+1

3,.若串S=’software’,其子串数目为(包括空串):C

A 8
B 37
C 36
D 9

解析:首先,software没有重复字符,长度为8.
1个字符的子串有8个;即software本身,以此类推
2个字符的子串有8-1个;
3个字符的子串有8-2个;
……
7个字符的子串有8-6个;
8个字符的子串有8-7个。
所以子串总数是1+2+3……+8=36个。

3下面有关JAVA异常类的描述,说法错误的是?C

A 异常的继承结构:基类为Throwable,Error和Exception继承Throwable,RuntimeException和IOException等继承Exception
B 非RuntimeException一般是外部错误(非Error),其必须被 try{}catch语句块所捕获
C Error类体系描述了Java运行系统中的内部错误以及资源耗尽的情形,Error不需要捕捉
D RuntimeException体系包括错误的类型转换、数组越界访问和试图访问空指针等等,必须被 try{}catch语句块所捕获

解析:
异常是指程序运行时(非编译)所发生的非正常情况或错误,当程序违反了语音规则,jvm就会将出现的错误表示一个异常抛出。
异常也是java 的对象,定义了基类 java。lang。throwable作为异常父类。 这些异常类又包括error和exception。两大类
error类异常主要是运行时逻辑错误导致,一个正确程序中是不应该出现error的。当出现error一般jvm会终止。
exception表示可恢复异常,包括检查异常和运行时异常。 检查异常是最常见异常比如 io异常sql异常,都发生在编译阶段。这类通过try、catch捕捉
而运行时异常,编译器没有强制对其进行捕捉和处理。一般都会把异常向上抛出,直到遇到处理代码位置,若没有处理块就会抛到最上层,多线程用thread。run()抛出,单线程用main()抛出。常见的运行异常包括 空指针异常 类型转换异常 数组月结异常 数组存储异常 缓冲区溢出异常 算术异常等,

4,关于PreparedStatement与Statement描述错误的是()

A 一般而言,PreparedStatement比Statement执行效率更高
B PreparedStatement会预编译SQL语句
C Statement每次都会解析/编译SQL,确立并优化数据获取路径
D Statement执行扫描的结果集比PreparedStatement大

解析:本题选D。

因为PreparedStatement有预编译的过程,所以第一次扫描的集合
PreparedStatement会大于等于 Statement

5,以下哪个I / O类可以附加或更新文件

A,RandomAccessFile()
B,OutputStream()
C,DataOutputStream()
D,None of the above

解析:
RandomAccessFile 可以通过 seek(long pos) 方法去移动文件指针进行追加更新写入.
OutputStream() 是一个抽象类 不能直接实例化去写入
DataOutputStream() 也无法追加写入

6(多选)已知中序遍历的序列为abcdef,高度最小的可能的二叉树的叶子是( ABC)

A ace
B acf
C adf
D cdf
在这里插入图片描述
7(多选) 下列说法错误的有( BCD)

A 能被java.exe成功运行的java class文件必须有main()方法
B J2SDK就是Java API
C Appletviewer.exe可利用jar选项运行.jar文件
D 能被Appletviewer成功运行的java class文件必须有main()方法

解析:

选BCD
A:大家可以想一想刚开始学java的时候,在命令行执行用javac和java命令编译和执行java文件的情况,java class中没有main方法,javac编译能通过,但是程序不知道入口,在执行的时候(也就是调用java.exe的时候)就会报错。我做了一个测试,如下图所示:

                                                                  图1.java程序A
                       
                                                                图2.执行程序A情况

B:来自百度百科:在JDK5之后,J2SDK 改名为 Java SE DK(简称依然是JDK) ,它是java开发编程的工具,提供了编译功能和运行环境等,包含jdk和jre。但它不是java编程开发的平台。Java API 是Java应用程序编程接口,它和JDK不是一回事。
C: appletviewer.exe执行选项参数中并没有jar选项。如下如所示:

D: appletviewer(小程序浏览器):一种执行HTML文件上的Java小程序类的Java浏览器,就是用来解释执行java applet应用程序的,简单理解就是没有main函数的继承applet类的 java 类。类似于WEB上开发的java类,不需要写main函数。

8(多选)下面有关java的引用类型,说法正确的有(AC )

A 对于一个对象来说,只要有强引用的存在,它就会一直存在于内存中
B 如果一个对象仅持有虚引用,那么它就和没有任何引用一样,在任何时候都可能被垃圾回收器回收。
C 如果一个对象只具有软引用,则内存空间足够,垃圾回收器就不会回收它;如果内存空间不足了,就会回收这些对象的内存
D 一旦发现了只具有弱引用的对象,不管当前内存空间足够与否,都会回收它的空间

解析:
强引用 只要存在强引用 就不会被强制回收
弱引用 只要内存不足时 就会被回收
虚引用 不能单独存在 只能存活到下一次垃圾回收
影子引用 只是在回收时触发一个事件

9系统死锁属于(B )。

A 程序故障
B 事务故障
C 系统故障
D 介质故障

10, 可以将某个22元的商品价格改为18元的视图是( )?

A create view v1 as select * from goods where price>20
B create view v2 as select * from goods where price<20
C create view v3 as select * from goods where price>20 with check option
D create view v4 as select * from goods where price<20 with check option

解析:正确答案是 A

通过有with check option选项的视图操作基表(只是面对单表,对连接多表的视图正在寻找答案),有以下结论:
首先视图只操作它可以查询出来的数据,对于它查询不出的数据,即使基表有,也不可以通过视图来操作。
1.对于update,有with check option,要保证update后,数据要被视图查询出来
2.对于delete,有无with check option都一样
4.对于insert,有with check option,要保证insert后,数据要被视图查询出来

对于没有where 子句的视图,使用with check option是多余的。

11:(多选)有关hashMap跟hashTable的区别,说法正确的是?ABCD

A HashMap和Hashtable都实现了Map接口
B HashMap是非synchronized,而Hashtable是synchronized
C HashTable使用Enumeration,HashMap使用Iterator
D HashMap允许将 null 作为一个 entry 的 key 或者 value,而 Hashtable 不允许。

解析:

A正确。Map是一个接口,hashtable,hashmap都是它的实现。
B正确。由于Hashtable是线程安全的也是synchronized,所以在单线程环境下它比HashMap要慢。如果你不需要同步,只需要单一线程,那么使用HashMap性能要好过Hashtable。
C正确。 HashMap的迭代器(Iterator)是fail-fast迭代器,而Hashtable的enumerator迭代器不是fail-fast的。所以当有其它线程改变了HashMap的结构(增加或者移除元素),将会抛出ConcurrentModificationException,但迭代器本身的remove()方法移除元素则不会抛出ConcurrentModificationException异常。但这并不是一个一定发生的行为,要看JVM。这条同样也是Enumeration和Iterator的区别。
D正确。 哈希值的使用不同,HashTable直接使用对象的hashCode,代码是这样的:
int hash = key.hashCode();
int index = (hash & 0x7FFFFFFF) % tab.length;
而HashMap重新计算hash值,而且用与代替求模:
int hash = hash(k);
int i = indexFor(hash, table.length);

12.(多选)下列关于JAVA多线程的叙述正确的是(C)

A 调用start()方法和run()都可以启动一个线程
B CyclicBarrier和CountDownLatch都可以让一组线程等待其他线程
C Callable类的call()方法可以返回值和抛出异常
D 新建的线程调用start()方法就能立即进行运行状态

解析:
A. start()方法来启动线程,真正实现了多线程运行,调用了run()方法;run()方法当作普通方法的方式调用。
B. CyclicBarrier让一组线程等待其他线程;CountDownLatch让一组线程等待某个事件发生。
C. Callable能够抛出checked exception。
D. start()方法让thread进去可运行状态(runnable),等待获取CPU的使用权。

**13.java 中哪个关键字可以对对象加互斥锁?**A

A. synchronized
B. volatile
C. serialize
D. static

答案是A, synchronized关键字是同步代码块关键字, 对对象加互斥锁

详解:

synchronized:

用来给对象和方法或者代码块加锁. 当它锁定一个方法或者一个代码块的时候, 同一时刻最多只有一个线程执行这个段代码

volatile:

用来确保将变量的更新操作通知到其他线程, 当把变量声明为volatile类型后, 编译器与运行时都会注意到这个变量是共享的, 因此不会将该变量上的操作与其他内存操作一起重排序. 然而, 在访问volatile变量时, 不会执行加锁操作, 因此也就不会使执行线程阻塞, 因此, volatile变量是一种比synchronized关键字更轻量级的同步机制

serialize:

Java对象序列化为二进制文件

static:

修饰变量, 方法, 静态代码块
静态变量:

由static修饰的变量称为静态变量

静态变量属于类, 而不属于某个类

静态变量的副本只有一个

静态方法:

在静态方法中只能调用静态变量和静态方法
在非晶态方法中, 可以调用静态方法或者变量
在静态方法中, 可以调用静态方法或者变量
在非静态方法中, 可以调用静态方法或者变量
在静态方法中不能使用this和super关键字

13,下列程序的运行结果(A)

public void getCustomerInfo() {
try {
// do something that may cause an Exception
} catch (java.io.FileNotFoundException ex) {
System.out.print(“FileNotFoundException!”);
} catch (java.io.IOException ex) {
System.out.print(“IOException!”);
} catch (java.lang.Exception ex) {
System.out.print(“Exception!”);
}
}

public void getCustomerInfo() {
   try {
      // do something that may cause an Exception
    } catch (java.io.FileNotFoundException ex) {
      System.out.print("FileNotFoundException!");
      } catch (java.io.IOException ex) {
      System.out.print("IOException!");
          } catch (java.lang.Exception ex) {
               System.out.print("Exception!");
          }
}

A.IOException!
B.IOException!Exception!
C.FileNotFoundException!IOException!
D.FileNotFoundException!IOException!Exception!

14,下列说法正确的有:(C)

A.class中的constructor不可省略
B.constructor必须与class同名,但方法不能与class同名
C.constructor在一个对象被new 时执行
D.一个class只能定义一个constructor

解析:B错:方法是可以和class同名的;方法可以和类名同名的,和构造方法唯一的区别就是,构造方法没有返回值。一个类必须有 constructor 方法,如果没有显式定义,一个默认的 consructor 方法会被默认添加。所以即使你没有添加构造函数,也是会有一个默认的构造函数的。一般 constructor 方法返回实例对象 this ,但是也可以指定 constructor 方法返回一个全新的对象,让返回的实例对象不是该类的实例。

15.下面有关java实例变量,局部变量,类变量和final变量的说法,错误的是?(B)

A.实例变量指的是类中定义的变量,即成员变量,如果没有初始化,会有默认值。
B.局部变量指的是在方法中定义的变量,如果没有初始化,会有默认值
C.类变量指的是用static修饰的属性
D.final变量指的是用final 修饰的变量

解析:B,局部变量:定义在方法中,使用之前必须进行初始化,且生命周期仅仅在该方法中有效。 C,在程序中仅加载一次,分配独立的存储空间(静态区),所有实例化的对象共享类变量。D,表示该变量为常量,显示初始化之后不可以被修改,类似于C++里面的全局变量。

16,JAVA语言的下面几种数组复制方法中,哪个效率最高?(B)
A.for循环逐一复制
B.System.arraycopy
C.Arrays.copyOf
D.使用clone方法

解析:Arrays.copyOf:深拷贝: 两个对象地址不一样,内容一样。
System.arraycopy:两个对象指向同一个地址,所以两个对象的内容共享。

17下列关于java并发的说法中正确的是:(B)

A.copyonwritearraylist适用于写多读少的并发场景
B.readwritelock适用于读多写少的并发场景
C.concurrenthashmap的写操作不需要加锁,读操作需要加锁
D.只要在定义int类型的成员变量i的时候加上volatile关键字,那么多线程并发执行i++这样的操作的时候就是线程安全的了

解析:A:CopyOnWirteArrayList 适用于写少读多的并发场景
B: ReadWriteLock 即为读写锁,要求写与写之间互斥,读与写之间互斥,读与读之间可以并发执行,在读多写少的情况下可以提高效率。
C.ConcurrentHashMap是同步的HashMap,读写都加锁
D.volatile只保证多线程操作的可见性,不保证原子性

18下列说法正确的是©

A.java中包的主要作用是实现跨平台功能
B.package语句只能放在import语句后面
C.包(package)由一组类(class)和接口(interface)组成
D.可以用#include关键词来标明来自其它包中的类

[解析] Java中的包是为了能够使用户可以方便地重复利用已经创建的类,Java提供了一个名为包的机制,包实际上是一组相关的类和接口的集合。所以选项A错误;选项C正确;package语句将源文件存入指定的包中,该部分至多只有一句,必须放在源程序的第一句,如果没有该语句,则源文件存入当前目录下。import语句导入需要的包或类,该部分可以有若干import语句或者没有,必须放在所有的类定义前。所以选项B、D错误;

19,给定以下JAVA代码,这段代码运行后输出的结果是(B)

**public class Test
{
    public static int aMethod(int i)throws Exception
    {
        try{
            return i / 10;
        }
        catch (Exception ex)
        {
            throw new Exception("exception in a Method");
        } finally{
            System.out.printf("finally");
        }
    }
 
    public static void main(String [] args)
    {
        try
        {
            aMethod(0);
        }
        catch (Exception ex)
        {
            System.out.printf("exception in main");
        }
        System.out.printf("finished");
    }
}
 
    

A.exception in main finished
B.finally finished
C.exception in main finally
D.finally exception in main finished

20抽象类方法的访问权限默认都是public。(B )

A.正确
B.错误

解析:
关于抽象类
JDK 1.8以前,抽象类的方法默认访问权限为protected
JDK 1.8时,抽象类的方法默认访问权限变为default

关于接口
JDK 1.8以前,接口中的方法必须是public的
JDK 1.8时,接口中的方法可以是public的,也可以是default的
JDK 1.9时,接口中的方法可以是private的
21:假设一个 list初始化为{2,9,5,4,8,1}。 在第一次冒泡排序后,list变成了(D)?

A.2, 9, 5, 4, 8, 1
B.2, 9, 5, 4, 1, 8
C.2, 5, 9, 4, 8, 1
D.2, 5, 4, 8, 1, 9‘’
22:在java的一个异常处理中,可以包含多个的语句块是 ( D)。

A.try
B.finally
C.throws
D.catch

22下列有关Servlet的生命周期,说法不正确的是?(A)

A.在创建自己的Servlet时候,应该在初始化方法init()方法中创建Servlet实例
B.在Servlet生命周期的服务阶段,执行service()方法,根据用户请求的方法,执行相应的doGet()或是doPost()方法
C.在销毁阶段,执行destroy()方法后会释放Servlet 占用的资源
D.destroy()方法仅执行一次,即在服务器停止且卸载Servlet时执行该方法

解析:
Servlet的生命周期分为5个阶段:加载、创建、初始化、处理客户请求、卸载。
(1)加载:Servlet容器(Tomcat)通过类加载器加载servlet文件(.class)
(2)创建:通过调用servlet构造函数创建一个servlet对象
(3)初始化:调用init方法初始化
(4)处理客户请求:每当有一个客户请求,容器会创建一个线程来处理客户请求
(5)卸载:调用destroy方法让servlet自己释放其占用的资源
servlet是由Servlet容器负责加载Servlet类,创建Servlet对象并实例化,然后调用Servlet的init方法,进行初始化,之后调用Service方法。实例化和初始化不同。先实例化,再初始化。

serlvet是单实例多线程
默认第一次访问的时候,服务器创建servlet,并调用init实现初始化操作.并调用一次service方法
每当请求来的时候,服务器创建一个线程,调用service方法执行自己的业务逻辑
当serlvet被移除的时候服务器正常关闭的时候,服务器调用servlet的destroy方法实现销毁操作.

24下列有关Servlet的生命周期,说法不正确的是?(A)

A.在创建自己的Servlet时候,应该在初始化方法init()方法中创建Servlet实例
B.在Servlet生命周期的服务阶段,执行service()方法,根据用户请求的方法,执行相应的doGet()或是doPost()方法
C.在销毁阶段,执行destroy()方法后会释放Servlet 占用的资源
D.destroy()方法仅执行一次,即在服务器停止且卸载Servlet时执行该方法

解析:
Servlet的生命周期分为5个阶段:加载、创建、初始化、处理客户请求、卸载。
(1)加载:Servlet容器(Tomcat)通过类加载器加载servlet文件(.class)
(2)创建:通过调用servlet构造函数创建一个servlet对象
(3)初始化:调用init方法初始化
(4)处理客户请求:每当有一个客户请求,容器会创建一个线程来处理客户请求
(5)卸载:调用destroy方法让servlet自己释放其占用的资源
servlet是由Servlet容器负责加载Servlet类,创建Servlet对象并实例化,然后调用Servlet的init方法,进行初始化,之后调用Service方法。实例化和初始化不同。先实例化,再初始化。

serlvet是单实例多线程
默认第一次访问的时候,服务器创建servlet,并调用init实现初始化操作.并调用一次service方法
每当请求来的时候,服务器创建一个线程,调用service方法执行自己的业务逻辑
当serlvet被移除的时候服务器正常关闭的时候,服务器调用servlet的destroy方法实现销毁操作.

24下列关于构造函数说法正确的是C

A.构造函数的返回值为void
B.构造函数不可以被重载
C.构造函数可以是内联函数
D.构造函数可以没有参数

解析:构造函数(默认内联函数):能够给反复重载,可带参数(不能有返回值,也不能void
析构函数:不能有返回值和参数,只能有一个析构函数,销毁一个对象

25:(多选)java中Hashtable, Vector, TreeSet, LinkedList哪些线程是安全的?AB

A.Hashtable
B.Vector
C.TreeSet
D.LinkedList

26:只有实现了()接口的类,其对象才能序列化。A

A.Serializable
B.Cloneable
C.Comparable
D.Writeable

解析:
A:Serializable接口是专门提供给类实现序列化用的。要实现序列化对象必须要实现 Serializable 接口

26:对于Java中异常的描述正确的是D

A.用throws定义了方法可能抛出的异常,那么调用此方法时一定会抛出此异常。
B.如果try块中没有抛出异常,finally块中的语句将不会被执行。
C.抛出异常意味着程序发生运行时错误,需要调试修改
D.Java中的可不检测(unchecked)异常可能来自RuntimeException类或其子类。

27:关于sleep()和wait(),以下描述错误的一项是D

A.sleep是线程类(Thread)的方法,wait是Object类的方法;
B.sleep不释放对象锁,wait放弃对象锁
C.sleep暂停线程、但监控状态仍然保持,结束后会自动恢复
D.wait后进入等待锁定池,只有针对此对象发出notify方法后获得对象锁进入运行状态

解析: sleep:Thread类中定义的方法,表示线程休眠,会自动唤醒;

wait:Object中定义的方法,需要手工调用notify()或者notifyAll()方法。

sleep是线程类(Thread)的方法,导致此线程暂停执行指定时间,给执行机会给其他线程,但是监控状态依然保持,到时后会自动恢复。调用sleep不会释放对象锁。 wait是Object类的方法,对此对象调用wait方法导致本线程放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象发出notify方法(或notifyAll)后本线程才进入对象锁定池准备获得对象锁进入运行状态。

sleep就是正在执行的线程主动让出cpu,cpu去执行其他线程,在sleep指定的时间过后,cpu才会回到这个线程上继续往下执行,如果当前线程进入了同步锁,sleep方法并不会释放锁,即使当前线程使用sleep方法让出了cpu,但其他被同步锁挡住了的线程也无法得到执行。wait是指在一个已经进入了同步锁的线程内,让自己暂时让出同步锁,以便其他正在等待此锁的线程可以得到同步锁并运行,只有其他线程调用了notify方法(notify并不释放锁,只是告诉调用过wait方法的线程可以去参与获得锁的竞争了,但不是马上得到锁,因为锁还在别人手里,别人还没释放。如果notify方法后面的代码还有很多,需要这些代码执行完后才会释放锁,可以在notfiy方法后增加一个等待和一些代码,看看效果),调用wait方法的线程就会解除wait状态和程序可以再次得到锁后继续向下运行。对于wait的讲解一定要配合例子代码来说明,才显得自己真明白。

28:多选) 对Collection和Collections描述正确的是BD

A.Collection是java.util下的类,它包含有各种有关集合操作的静态方法
B.Collection是java.util下的接口,它是各种集合结构的父接口
C.Collections是java.util下的接口,它是各种集合结构的父接口
Collections是java.util下的类,它包含有各种有关集合操作的静态方法

29:.局部内部类可以用哪些修饰符修饰?CD

A.public
B.private
C.abstract
D.final

30:(多选)下面有关forward和redirect的描述,正确的是(B,C,D) ?

A.forward是服务器将控制权转交给另外一个内部服务器对象,由新的对象来全权负责响应用户的请求
B.执行forward时,浏览器不知道服务器发送的内容是从何处来,浏览器地址栏中还是原来的地址
C.执行redirect时,服务器端告诉浏览器重新去请求地址
D.forward是内部重定向,redirect是外部重定向
E.redirect默认将产生301 Permanently moved的HTTP响应

31:.ArrayLists和LinkedList的区别,下述说法正确的有?ABCD

A.ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构。
B.对于随机访问get和set,ArrayList觉得优于LinkedList,因为LinkedList要移动指针。
C.对于新增和删除操作add和remove,LinkedList比较占优势,因为ArrayList要移动数据。
D.ArrayList的空间浪费主要体现在在list列表的结尾预留一定的容量空间,而LinkedList的空间花费则体现在它的每一个元素都需要消耗相当的空间。

32:关于访问权限说法正确的是 ?B

A.外部类前面可以修饰public,protected和private
B.成员内部类前面可以修饰public,protected和private
C.局部内部类前面可以修饰public,protected和private
D.以上说法都不正确

34:下面说法正确的是C

A.构造函数先调用自己的构造函数然后初始化成员变量最后调用基类构造函数
B.构造函数先调用基类构造函数然后调用自己的构造函数最后初始化成员变量
C.构造函数先调用基类构造函数然后初始化成员变量最后调用自己的构造函数
D.构造函数先调用自己的构造函数然后调用基类构造函数最后初始化成员变量

35:Which of the following can be applied to constructors:E

A.final
B.static
C.synchronized
D.native
E.None of these.

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值