Java重难点面试(二)

来源:互联网 发布:好运来返奖统计软件 编辑:程序博客网 时间:2024/04/29 11:56

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

0 0
原创粉丝点击