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