2019年11月11日 Java2

考点1

哪个关键字可以对对象加互斥锁?()

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

解析

显示答案/隐藏答案正确答案: A

synchronized关键字

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

volatile

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

考点2

下面代码的执行结果是 :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class Chinese{
private static Chinese objref =new Chinese();
private Chinese(){
}
public static Chinese getInstance() {
return objref;
}
}
public class TestChinese {
public static void main(String [] args) {
Chinese obj1 = Chinese.getInstance();
Chinese obj2 = Chinese.getInstance();
System.out.println(obj1 == obj2);
}
}
  • A true
  • B false
  • C TRUE
  • D FALSE

解析

显示答案/隐藏答案正确答案: A

这是饿汉式单例模式,在类创建时,就已经实例化完成

考点3

假定Base b = new Derived(); 调用执行b.methodOne()后,输出结果是什么?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public class Base{
public void methodOne(){
System.out.print("A");
methodTwo();
}
public void methodTwo(){
System.out.print("B");
}
}
public class Derived extends Base{
public void methodOne(){
super.methodOne();
System.out.print("C");
}
public void methodTwo(){
super.methodTwo();
System.out.print("D");
}
}
  • A ABDC
  • B AB
  • C ABCD
  • D ABC

解析

显示答案/隐藏答案正确答案: A

这是一道类多态的向上转型题。
Base b = new Derived();
向上转型:父类只能调用父类方法或者子类覆写后的方法,而子类中的单独方法则是无法调用的。
因此:
调用的顺序是:(1)、(2)、(3)、(4)、(5)、(6)、(7) ; 得到的结果是:ABDC

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
class Base{
// (3)
public void methodOne() {
System.out.print("A");
//执行到这里的时候调用子类的覆盖方法 (4)
methodTwo();
}
// (7)
public void methodTwo(){
System.out.print("B");
}
}
class Derived extends Base {
// (1)
public void methodOne(){
// (2)
super.methodOne();
System.out.print("C");
}
//该方法为重写了父类的方法 (5)
public void methodTwo() {
//(6)
super.methodTwo();
System.out.print("D");
}
}

考点4

java程序内存泄露的最直接表现是( )

  • A 频繁FullGc
  • B jvm崩溃
  • C 程序抛内存控制的Exception
  • D java进程异常消失

解析

显示答案/隐藏答案正确答案: C

java是自动管理内存的,通常情况下程序运行到稳定状态,内存大小也达到一个 基本稳定的值
但是内存泄露导致Gc不能回收泄露的垃圾,内存不断变大.
最终超出内存界限,抛出OutOfMemoryExpection

考点5

在Java中,对于不再使用的内存资源,如调用完成的方法,”垃圾回收器”会自动将其释放。( )

  • A 正确
  • B 错误

解析

显示答案/隐藏答案正确答案: B

调用方法是在栈内存中完成的,调用完成会自动释放,
而gc释放的是堆区的内容

考点6

下面哪些情况下需要使用抽象类?

  • A 当一个类的一个或多个方法是抽象方法时
  • B 当类是一个抽象类的子类,并且不能为任何抽象方法提供任何实现细节或方法体时
  • C 当一个类实现多个接口时
  • D 当一个类实现一个接口,并且不能为任何抽象方法提供实现细节或方法体时

解析

显示答案/隐藏答案正确答案: ABD

D:当你不想实现接口中的所有方法,只想实现接口中的个别方法时,你可以先写一个抽象类来实现该接口,并实现除了你想要的方法之外的所有方法(可以简单的将方法体设为空)
接着再用你的类继承这个抽象类,这个类中就只用实现你需要的方法了,这样就可以达到你的需要了。
如果你直接实现接口的话,你就需要实现接口的所有方法。

考点7

下列容器中,哪些容器按 key 查找的复杂度为 O(log(n)) ()

  • A std::unordered_set
  • B std::multimap
  • C std::map
  • D std::deque

解析

显示答案/隐藏答案正确答案: BC

STL库中,map和multimap底层都是红黑树实现的,两者的不同在于multimap允许重复,而map中不行。
红黑树的查找复杂度为O(log(n))
unodered_map/_set底层是哈希表实现的,哈希表查找复杂度为O(1)

考点8

Java.Thread的方法resume()负责重新开始被以下哪个方法中断的线程的执行()。

  • A stop
  • B sleep
  • C wait
  • D suspend

解析

显示答案/隐藏答案正确答案: D

suspend() 和 resume() 方法:两个方法配套使用,suspend()使得线程进入阻塞状态,并且不会自动恢复,必须其对应的 resume() 被调用,才能使得线程重新进入可执行状态

线程状态