错题笔记(十题)
错题纠正笔记(一日十题)
Ⅰ、”hello"instanceof Object 的返回值是(B)。
A. “abcd” B.true C.false D.String
解析:
instanceof是Java语言中的一个二元运算符,它的作用是判断一个引用类型的变量所指向的对象是否是一个类(或接口、抽象类、父类)的实例,即它左边的对象是否是它右边类的实例,返boolean类型的数据。
常用的用法为:result= object instanceof class,如果object是class的一个实例,那么instanceof运算符返回true;如果object不是指定类的一个实例,或者object是null,那么,此时返回false.
Ⅱ、以下可以对对象加互斥锁的关键字是(A).
A.synchronized B.serialize C.volatile D.static
解析:
synchronized(同步的)是Java语言的关键字,主要用来给对象和方法或者代码块加锁,当它锁定一个方法或者一个代码块时,同一时刻最多只有一个线程执行这段代码。当两个并发线程访问同一个对象中的这个加锁同步代码块时,同一时间只能由一个线程执行。
serialize是序列化的意思,所谓对象的序列化指的是把对象转换为字节序列的过程,所谓对象的反序列化指的是把字节序列恢复为对象的过程。通常,对象的序列化主要由以下两种用途:
①将对象的字节序列永久的保存在硬盘上,通常存放在一个文件中。
②在网络上传送对象的字节序列。在Java语言中,序列化通过Serializable接口来实现。
volatile在由Java语言编写的程序中,有时候为了提高程序的运行效率,编译器会做一些优化操作,把经常被访问的变量缓存起来,程序在读取这个变量的时候有可能会直接从寄存器中读取这个值,而不会去内存中读取。这样做的一个好处是提高了程序的运行效率,但当遇到多线程编程时,变量的值可能被其他线程改变了,而该缓存的值不会做相应的改变,从而造成应用程序读取的值和实际的变量值不一致。关键字volatile正好能够解决这一问题,被关键字volatile修饰的变量编译器不会给予优化,每次都会从内存中读取。
static关键字static主要有以下两种作用:第一,为特定数据类型或对象分配单一的存储空间,而与创建对象的个数无关。第二,希望某个方法或属性与类而不是对象关联在一起,也就是说,在不创建对象的情况下就可以通过类来直接调用方法或使用类的属性。总之,被static修饰的属性(方法)是类的属性(方法),不属于任何对象。
Ⅲ.下列关于Java语言中main方法的描述中正确的是(AB)
A.Java程序中的main方法必须写在类里面。
B.Java程序中可以有多个main方法。
C.Java程序中的main方法,如果只有一条语句,可以不用大括号{}起来。
D.Java程序中的类名必须与文件名一致。
解析:
在Java语言中,main方法是程序的入口方法,一个程序要想运行必须要有main方法,但是只有满足特定条件的main方法才能作为程序的入口方法。A选项,由于Java语言是纯面向对象语言,所以,所有的属性与方法都必须定义在类里面,而且,main方法也不例外。B选项,Java程序可以定义多个main()方法,但是只有 public static void main (String[] args)方法才是Java程序的入口方法,其他main()方法都不是,并且这个入口方法必须被定义在类名与文件名相同的被public修饰的类中。
Ⅳ.下面关于关键字abstract的描述中,正确的是(ABC)
A.关键字abstract可以修饰类或方法
B.final类的方法都不能是abstract,因为final类不能有子类
C.abstract类不能实例化
D.abstract类的子类必须实现其超类的所有abstract.
解析:
在Java语言中,关键字abstract主要用来定义抽象类或抽象方法,代表抽象类或者抽象方法。
在Java语言中,关键字final可以用来修饰类、方法和变量(包括成员变量和局部变量)。具体而言,final具有以下性质:
①当final修饰一个类时,表名这个类不能被继承;②当final修饰方法时,这个方法不能被子类重写;③当final修饰变量时,如果是基本数据类型的变量,则其数值一旦被初始化之后便不能更改,如果是引用类型的变量,则在对其初始化之后便不能在让其指向另一个对象。所以,被final修饰的方法是不能被继承的,所以,final和abstract不能同时使用。
继承抽象类的子类可以实现超类的所有的方法(这个子类可以被实例化),这个子类也可以是一个抽象类,此时这个子类可以实现超类的abstract方法,也可以不实现。
Ⅴ.JavaThread中的方法resume()负责恢复哪些线程的执行?(D)
A.通过调用wait()方法而停止运行的线程
B.通过调用sleep()方法而停止运行的线程
C.通过调用stop()方法而停止的线程
D.通过调用suspend()方法而停止的运行的线程
解析:
wait()方法是一种使线程暂停执行的方法,例如,当线程交互时,如果线程对一个同步对象发出了一个wait()调用请求,那么该线程会暂停执行,被调对象进入等待状态,直到被唤醒(通常使用notify()方法唤醒)或等待时间超时。
sleep()方法的作用是使当前运行的线程休眠指定的时间。
stop()方法来终止线程的执行。当使用Thread.stop()方法来终止线程时,它会释放已经锁定的所有监视资源。如果当前任何一个受这些监视资源保护的对象处于一个不一致的状态,其他线程将会看到这个不一致的状态,这可能会导致程序执行的不确定性,而且这种问题很难被定位。因此,不推荐使用。
suspend()方法就是将一个线程挂起(暂停),并且不会自动恢复,必须通过调用对应的resume()方法,才能使得线程重新进入可执行状态。
Ⅵ.
以上这段代码编译运行后,输出的结果是(B)
A.finallyexception in mainfinished B.finallyfinished
C.exception in mainfinally D.finallyexception in mainfinished
解析:
在Java语言的异常处理中,finally语句块的作用就是为了保证无论出现什么情况,finally语句块里的代码一定会被执行。由于当程序执行到return语句的时候就意味着结束对当前方法的调用并跳出这个方法体,因此,任何语句要执行都只能在return前面执行(除非碰到exit()方法),所以,finally块里的代码也是在return前执行的。此外,如果try-finally或者catch-finally中都有return语句,则finally块中的return语句将会覆盖别处的return语句,最终返回到调用者那里的是finally中return的值。
对于本题而言,在调用testException方法时不会抛出异常,虽然testException方法体内调用return返回这个方法,但是Java虚拟机要保证finally块里的代码必须执行,因此,在调用testException方法的时候会输出finally,接着方法调用结束后,在main方法中会输出finished。
Ⅶ.以下关于Spring框架的描述中,正确的是(ABC)
A.Spring是“依赖注入”模式的实现
B.Spring是一个轻量级JavaEE 的框架集合
C.使用Spring可以实现声明事务
D.Spring提供了AOP方式的日志系统
解析:Spring 是一个J2EE的框架,这个框架提供了对轻量级的IOC(Inverse of Control,控制反转,有时候也被叫做依赖注入)良好的支持,同时也提供了对AOP(Aspect Oriented Programming,面向切面编程)技术非常好的封装。相比其他框架,Spring框架的设计更加模块化,框架内的每个模块都能完成特定的工作,而且各个模块都可以独立地运行,不会相互牵制。因此,在使用Spring 框架地时候,开发人员可以使用整个框架,也可以只使用框架内地一部分模块,例如可以只使用Spring AOP模块来实现日志管理功能,而不需要使用其他模块。
具体而言,Spring框架主要由7个模块组成,它们分别是Spring AOP、Spring ORM、SpringDAO、Spring Web、Spring Context、Spring Web MVC和Spring Core等。
各个模块的作用如下表:
Ⅷ.堆的形状是一颗(AB)。
A.完全二叉树 B.平衡二叉树 C.二叉排序树 D.满二叉树
解析:
堆是一种特殊的树形结构,由大顶堆和小顶堆两种。大顶堆(小顶堆)的特点是根节点的值最大(最小),且根节点的子树也为一个大顶堆(小顶堆)。
对于A选项,完全二叉树是指除最后一层外,每一层上的节点数均达到最大值:在使用的时候堆是采用数组来存储的,因此,它满足完全二叉树的特点。
对于选项B,平衡二叉树(Balaced Binary Tree)又被称为AVL树,具有以下性质:它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两棵子树都是一棵平衡二叉树。由于完全二叉树一定满足平衡二叉树的性质。选项B正确。
对于选项C,排序二叉树有如下性质:
1)若左子树不为空,则左子树上所有节点的值均小于它根节点的值。
2)若右子树不为空,则右子树上所有节点的值均大于或等于它的根节点的值。
3)左右子树也分别为二叉树排序。
4)没有键值相等的节点。
Ⅹ.以下关于HashMap与HashTable的说法中,正确的是(ACD)
A.迭代HashMap采用快速失败机制,而HashTable不是。
B.HashTable允许null值作为key和value,而HashTable不可以。
C.HashMap不是同步的,而HashTable是同步的。
D.两者都是用key-value方式获取数据的。
解析:
HashMap和Hashtable通过对象来进行索引,用来索引的对象叫做key,其对应的对象叫作value。两者具有许多相似之处,但是也有很多不同之处。以下重点介绍两者的不同之处,具体而言,体现在以下几个方面:
1)它们都是先了Map接口,HashMap允许kong(null)键值(key)(但需要注意的是,最多只允许一条记录的键为null,不允许多条记录的值为null),而Hashtable不允许。
2)HashMap把Hashtable的contains方法去掉了,改成containsvalue和containsKey。因为contains方法容易引起误解。Hashtable继承自Dictionary类,而HashMap继承自AbstractMap类。
3)Hashtable的方法是线程安全的,而Hashmap不是线程安全的。当多个线程访问Hashtable时,不需要开发人员对它进行同步,而对HashMap,开发人员必须提供额外的同步机制。所以,效率上HashMap可能高于Hashtable.
4)“快速失败”也就是fail-fast,它是Java集合的一种错误检测机制。当多个线程对集合进行结构上的改变的操作时,就有可能会产生fail-fast事件。例如,假设存在两个线程,它们分别是线程1和线程2,当线程1通过Iterator(迭代器)在遍历集合A中的元素的时候,如果线程2修改了集合A的结构(删除或者增加新的元素),那么这个时候程序就会抛出CONcurrentModificationException异常,从而产生fail-fast事件。
由于Hashtable是线程安全的,因此,没有采用快速失败机制,HashMap是非线程安全的,因此,迭代HashMap采用了快速失败机制。