2.10Java专项测试复盘
-
下列程序的运行结果
public static void main(String args[]) { Thread t = new Thread() { public void run() { pong(); } }; t.run(); System.out.print("ping"); } static void pong() { System.out.print("pong"); } }
A. pingpong
B. pongping
C. pingpong和pongping都有可能
D. 都不输出解析:在第7行的时候,调用的是t.run();方法,之间调用run方法就是普通的方法调用而已,所以肯定是先执行pong()再执行System.out.print(“ping”);
如果第7行换成t.start()方法,答案就应该选择c,因为t.start()后,线程变为就绪状态,什么时候开始执行时不确定的,可能是主程序先继续执行,也可能是新线程先执行。
答案:B -
要使某个类能被同一个包中的其他类访问,但不能被这个包以外的类访问,可以( )
A. 让该类不使用任何关键字
B. 使用private关键字
C. 使用protected关键字
D. 使用void关键字解析:
protected接受包外的子类访问
答案:A -
在Web应用程序中,( )负责将HTTP请求转换为HttpServletRequest对象
A. Servlet对象
B. HTTP服务器
C. Web容器
D. JSP网页解析:web容器是一种服务程序,在服务器一个端口就有一个提供相应服务的程序,而这个程序就是处理从客户端发出的请求,如JAVA中的Tomcat容器,ASP的IIS或PWS都是这样的容器。一个服务器可以多个容器。
答案:C -
Hashtable 和 HashMap 的区别是:
A. Hashtable 是一个哈希表,该类继承了 AbstractMap,实现了 Map 接口
B. HashMap 是内部基于哈希表实现,该类继承AbstractMap,实现Map接口
C. Hashtable 线程安全的,而 HashMap 是线程不安全的
D. Properties 类 继承了 Hashtable 类,而 Hashtable 类则继承Dictionary 类
E. HashMap允许将 null 作为一个 entry 的 key 或者 value,而 Hashtable 不允许。解析:Hashtable:
(1)Hashtable 是一个散列表,它存储的内容是键值对(key-value)映射。
(2)Hashtable 的函数都是同步的,这意味着它是线程安全的。它的key、value都不可以为null。
(3)HashTable直接使用对象的hashCode。
HashMap:
(1)由数组+链表组成的,基于哈希表的Map实现,数组是HashMap的主体,链表则是主要为了解决哈希冲突而存在的。
(2)不是线程安全的,HashMap可以接受为null的键(key)和值(value)。
(3)HashMap重新计算hash值
Hashtable,HashMap,Properties继承关系如下:public class Hashtable<K,V> extends Dictionary<K,V> implements Map<K,V>, Cloneable, java.io.Serializable public class HashMap<K,V>extends AbstractMap<K,V> implements Map<K,V>, Cloneable, Serializable
java.lang.Objecct java.util.Dictionary<K,V> java.util.Hashtable<Object,Object> java.util.Properties
答案:BCDE
-
下列说法错误的有( )
A. Java面向对象语言容许单独的过程与函数存在
B. Java面向对象语言容许单独的方法存在
C. Java语言中的非静态方法属于类中的成员(member)
D. Java语言中的方法必定隶属于某一类(对象),调用方法与C语言的过程或C++语言的函数相同解析: java不允许单独的方法,过程或函数存在,需要隶属于某一类中。——AB错;java语言中的方法属于对象的成员,而不是类的成员。不过,其中静态方法属于类的成员。——C错;D问的是java调用方法和C调用过程,C+ + 的函数一样?肯定不一样。错
答案:ABCD -
下列哪项不属于jdk1.6垃圾收集器?
A. Serial收集器
B. parNew收集器
C. CMS收集器
D. G1收集器解析:G1收集器是jdk1.7引入的
答案:D -
Test.main()函数执行后的输出是( )
class Test { public static void main(String[] args) { System.out.println(new B().getValue()); } static class A { protected int value; public A (int v) { setValue(v); } public void setValue(int value) { this.value= value; } public int getValue() { try { value ++; return value; } finally { this.setValue(value); System.out.println(value); } } } static class B extends A { public B () { super(5); setValue(getValue()- 3); } public void setValue(int value) { super.setValue(2 * value); } } }
A. 6 7 7
B. 22 34 17
C. 22 74 74
D. 11 17 34解析:new B()第一步执行B的构造方法,先调用super(5),父类构造器中执行setValue()方法,由于B重写了setValue()方法,所以执行的是B中的setValue()方法,此时value = 2×5 = 10。
new B()第二步setValue(getValue()- 3);
,先调用getValue()方法,B没重写getValue方法,所以调用A中的getValue方法。value++; return value;
此时返回的value = 11。但是由于getValue块被try finally块包围,因此finally中的语句无论如何都将被执行,所以11这个返回值会先暂存起来,到finally语句块执行完毕后再真正返回出去。finally块中this.setValue(value);
调用的是B的setValue方法,此时value = 2×11=22,打印输出。但不影响返回值为11。此时B构造器中setValue的参数为11-3=8,执行完之后value = 2 × 8 =16。
主函数中输出的是new B().getValue(),我们还要执行getValue方法。同之前一样,getValue中的返回值为16+1=17,打印值为2×17=34,主函数中输出的是返回值17.
所以输出为22 34 17
答案:B -
java8中,下面哪个类用到了解决哈希冲突的开放定址法
A. LinkedHashSet
B. HashMap
C. ThreadLocal
D. TreeMap解析:ThreadLocal的set方法可能会有的情况。
1.探测过程中slot都不无效,并且顺利找到key所在的slot,直接替换即可
2.探测过程中发现有无效slot,调用replaceStaleEntry,效果是最终一定会把key和value放在这个slot,并且会尽可能清理无效slot
2.1 在replaceStaleEntry过程中,如果找到了key,则做一个swap把它放到那个无效slot中,value置为新值
2.2 在replaceStaleEntry过程中,没有找到key,直接在无效slot原地放entry
3.探测没有发现key,则在连续段末尾的后一个空位置放上entry,这也是线性探测法的一部分。放完后,做一次启发式清理,如果没清理出去key,并且当前table大小已经超过阈值了,则做一次rehash,rehash函数会调用一次全量清理slot方法也即expungeStaleEntries,如果完了之后table大小超过了threshold – threshold / 4,则进行扩容2倍。
答案:C -
在Java中,对于不再使用的内存资源,如调用完成的方法,“垃圾回收器”会自动将其释放。( )
解析:java 虚拟机,对于方法的调用采用的是栈帧(方法调用和方法执行),调用则入栈,完成之后则出栈。不就回收了内存资源。而针对于其他,GC回收的时间不定。
答案:ב’ -
Java数据库连接库JDBC用到哪种设计模式?
A. 生成器
B. 桥接模式
C. 抽象工厂
D. 单例模式解析:桥接模式是结构型模式,关注点在依赖关系的维护。对于jdbc技术来说,它解耦了业务与数据库通信协议这两个纬度之间的关系,所以这两个纬度之间的关系就需要一个桥,即Driver,至于DriverManager把这个关系接到哪里就是运行时的事情了。
微观上,从connection的创建来看,它更像一个抽象工厂模式,特定的Driver创建对应的connection。
宏观上,从业务代码与connection的关系来看,关键点在于一个sql怎么转化为对应的通信协议,就属于桥接。
答案:B -
关于下面的一段代码,以下哪些说法是正确的:
public static void main(String[] args) { String a = new String("myString"); String b = "myString"; String c = "my" + "String"; String d = c; System.out.print(a == b); System.out.print(a == c); System.out.print(b == c); System.out.print(b == d); }
A. System.out.print(a == b)打印出来的是false
B. System.out.print(a == c)打印出来的是true
C. System.out.print(b == c)打印出来的是false
D. System.out.print(b == d)打印出来的是true解析:A:a指向堆内存,b指向常量池,因此地址不相等,false
B:java有常量优化机制,c也指向常量池,且与b指向同一个,则a与c地址不相等,false;
C:b与c地址相等,true
D:d是c的副本,地址相同,所以b与d地址相等,true
答案:AD