Java重难点面试(二)

1 .以下多线程对int型变量x的操作,哪个不需要进行同步()

A: ++x
B: x=y
C: x++
D: x=1

答案为 B

知识点:同步是害怕在操作过程的时候被其他线程也进行读取操作,一旦是原子性的操作就不会发生这种情况。
因为一步到位的操作,其他线程不可能在中间干涉。另外三项都有读取、操作两个步骤,而X=1则是原子性操作。其他三个选项都需要进行读取和写入两个操作。

2 .

Integer i = 42;
Long l = 42l;
Double d = 42.0;

下面为true的是

A: (i == l)
B: (i == d)
C: (l == d)
D: i.equals(d)
E: d.equals(l)
F: i.equals(l)
G: l.equals(42L)

答案为G

知识点:

包装类的“==”运算在不遇到算术运算的情况下不会自动拆箱
包装类的equals()方法不处理数据转型

3 .

public class NameList
{
    private List names = new ArrayList();
    public synchronized void add(String name)
    {
        names.add(name);
    }
    public synchronized void printAll()     {
        for (int i = 0; i < names.size(); i++)
        {
            System.out.print(names.get(i) + ””);
        }
    }

    public static void main(String[]args)
    {
        final NameList sl = new NameList();
        for (int i = 0; i < 2; i++)
        {
            new Thread()
            {
                public void run()
                {
                    sl.add(“A”);
                    sl.add(“B”);
                    sl.add(“C”);
                    sl.printAll();
                }
            } .start();
        }
    }
}

A: An exception may be thrown at runtime.
B: The code may run with no output, without exiting.
C: The code may run with no output, exiting normally(正常地).
D: The code may rum with output “A B A B C C “, then exit.
E: The code may rum with output “A B C A B C A B C “, then exit.
F: The code may ruin with output “A A A B C A B C C “, then exit.
G: The code may ruin with output “A B C A A B C A B C “, then exit.

答案为 E,G

知识点:

第一次println的字符个数肯定大于等于3,小于等于6;第二次println的字符个数肯定等于6;所以输出的字符中,后6位肯定是第二次输出的,前面剩下的就是第一次输出的。而且第一次的输出结果肯定是第二次输出结果的前缀。所以选E、G。

4 .

在java7中,下列不能做switch()的参数类型是?

A: 整型
B: 枚举类型
C: 字符串
D: 浮点型

答案为D

知识点为:

switch语句后的控制表达式只能是short、char、int、long整数类型和枚举类型,不能是float,double和boolean类型。String类型是java7开始支持。

5 .

Which lines of the following will produce an error?

1. byte a1 = 2, a2 = 4, a3;
2. short s = 16;
3. a2 = s;
4. a3 = a1 * a2;

A: Line 3 and Line 4
B: Line 1 only
C: Line 3 only
D: Line 4 only

答案为A

知识点:line 3 需要强转,line 4也需要强转,byte*byte会自动转化成int

6 .

对文件名为Test.java的java代码描述正确的是()

class Person {
    String name = "No name";
    public Person(String nm) {
        name = nm;
    }
}
class Employee extends Person {
    String empID = "0000";
    public Employee(String id) {
        empID = id;
    }
}
public class Test {
    public static void main(String args[]) {
        Employee e = new Employee("123");
        System.out.println(e.empID);
    }
}

A: 输出:0000
B: 输出:123
C: 编译报错
D: 输出:No name

答案为 C

知识点:

子类的构造方法总是先调用父类的构造方法,如果子类的构造方法没有明显地指明使用父类的哪个构造方法,子类就调用父类不带参数的构造方法。而父类没有无参的构造函数,所以子类需要在自己的构造函数中显示的调用父类的构造函数。

7 .以下代码的输出结果是?

public class B
{
    public static B t1 = new B();
    public static B t2 = new B();
    {
        System.out.println("构造块");
    }
    static
    {
        System.out.println("静态块");
    }
    public static void main(String[] args)
    {
        B t = new B();
    }
}

A: 静态块 构造块 构造块 构造块
B: 构造块 静态块 构造块 构造块
C: 构造块 构造块 静态块 构造块
D: 构造块 构造块 构造块 静态块

答案为C

知识点:

考查类的初始化顺序:静态变量 静态块 普通变量 构造块 构造函数

8 .

假设如下代码中,若t1线程在t2线程启动之前已经完成启动。代码的输出是()

public static void main(String[]args)throws Exception {
    final Object obj = new Object();
    Thread t1 = new Thread() {
        public void run() {
            synchronized (obj) {
                try {
                    obj.wait();
                    System.out.println("Thread 1 wake up.");
                } catch (InterruptedException e) {
                }
            }
        }
    };
    t1.start();
    Thread.sleep(1000);//We assume thread 1 must start up within 1 sec.
    Thread t2 = new Thread() {
        public void run() {
            synchronized (obj) {
                obj.notifyAll();
                System.out.println("Thread 2 sent notify.");
            }
        }
    };
    t2.start();
}

答案为:

Thread 2 sent notify.
Thread 1 wake up.

知识点:notify()就是对对象锁的唤醒操作。但有一点需要注意的是notify()调用后,并不是马上就释放对象锁的,而是在相应的synchronized(){}语句块执行结束,自动释放锁后,JVM会在wait()对象锁的线程中随机选取一线程,赋予其对象锁,唤醒线程,继续执行。这样就提供了在线程间同步、唤醒的操作。

8 .

有关hashMap跟hashTable的区别,说法正确的是?

A: HashMap和Hashtable都实现了Map接口
B: HashMap是非synchronized,而Hashtable是synchronized
C: HashTable使用Enumeration,HashMap使用Iterator
D: Hashtable直接使用对象的hashCode,HashMap重新计算hash值,而且用与代替求模

答案为A,B,C,D

知识点:

HashTable和HashMap区别
①继承不同。 public class Hashtable extends Dictionary implements Map public class HashMap extends AbstractMap implements Map

② Hashtable 中的方法是同步的,而HashMap中的方法在缺省情况下是非同步的。在多线程并发的环境下,可以直接使用Hashtable,但是要使用HashMap的话就要自己增加同步处理了。

③ Hashtable中,key和value都不允许出现null值。 在HashMap中,null可以作为键,这样的键只有一个;可以有一个或多个键所对应的值为null。当get()方法返回null值时,即可以表示 HashMap中没有该键,也可以表示该键所对应的值为null。因此,在HashMap中不能由get()方法来判断HashMap中是否存在某个键, 而应该用containsKey()方法来判断。

④两个遍历方式的内部实现上不同。 Hashtable、HashMap都使用了 Iterator。而由于历史原因,Hashtable还使用了Enumeration的方式 。

⑤ 哈希值的使用不同,HashTable直接使用对象的hashCode。而HashMap重新计算hash值。

⑥ Hashtable和HashMap它们两个内部实现方式的数组的初始大小和扩容的方式。HashTable中hash数组默认大小是11,增加的方式是 old*2+1。HashMap中hash数组的默认大小是16,而且一定是2的指数。

9.以下哪些jvm的垃圾回收方式采用的是复制算法回收

A: 新生代串行收集器
B: 老年代串行收集器
C: 并行收集器
D: 新生代并行回收收集器
E: 老年代并行回收收集器
F: cms收集器

答案为A,D

知识点:

两个最基本的java回收算法:复制算法和标记清理算法
复制算法:两个区域A和B,初始对象在A,继续存活的对象被转移到B。此为新生代最常用的算法
标记清理:一块区域,标记要回收的对象,然后回收,一定会出现碎片,那么引出
标记-整理算法:多了碎片整理,整理出更大的内存放更大的对象
两个概念:新生代和年老代
新生代:初始对象,生命周期短的
永久代:长时间存在的对象
整个java的垃圾回收是新生代和年老代的协作,这种叫做分代回收。
P.S:Serial New收集器是针对新生代的收集器,采用的是复制算法
Parallel New(并行)收集器,新生代采用复制算法,老年代采用标记整理
Parallel Scavenge(并行)收集器,针对新生代,采用复制收集算法
Serial Old(串行)收集器,新生代采用复制,老年代采用标记清理
Parallel Old(并行)收集器,针对老年代,标记整理
CMS收集器,基于标记清理
G1收集器:整体上是基于标记清理,局部采用复制

综上:新生代基本采用复制算法,老年代采用标记整理算法。cms采用标记清理。

10.以下哪一个不是赋值符号?

A: +=
B: <<=
C: <<<=
D: >>>=

答案为C

知识点:

为带符号右移,右移后左边的空位被填充为符号位

为不带符号右移,右移后左边的空位被填充为0

11.What will happen when you attempt to compile and run the following code?

public class test{
static{
   int x=5;
}
static int x,y;
public static void main(String args[]){
   x--;
   myMethod( );
   System.out.println(x+y+ ++x);
}
public static void myMethod( ){
  y=x++ + ++x;
 }
}

答案为 3

知识点:

1.静态语句块中x为局部变量,不影响静态变量x的值
2.x和y为静态变量,默认初始值为0,属于当前类,其值得改变会影响整个类运行。
3.java中自增操作非原子性的
main方法中:
执行x–后 x=-1
调用myMethod方法,x执行x++结果为-1(后++),但x=0,++x结果1,x=1 ,则y=0
x+y+ ++x,先执行x+y,结果为1,执行++x结果为2,得到最终结果为3

12.根据下面的代码,

String s = null;
会抛出NullPointerException异常的有()。

A: if( (s!=null) & (s.length()>0) )
B: if( (s!=null) && (s.length()>0) )
C: if( (s==null) | (s.length()==0) )
D: if( (s==null) || (s.length()==0) )

答案为A,C

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值