1.假设num已经被创建为一个ArrayList对象,并且最初包含以下整数值:[0,0,4,2,5,0,3,0]。 执行下面的方法numQuest(),最终的输出结果是什么?D
private List<Integer> nums;
//precondition: nums.size() > 0
//nums contains Integer objects
public void numQuest() {
int k = 0;
Integer zero = new Integer(0);
while (k < nums.size()) {
if (nums.get(k).equals(zero))
nums.remove(k);
k++;
}
}
[3, 5, 2, 4, 0, 0, 0, 0]
[0, 0, 0, 0, 4, 2, 5, 3]
[0, 0, 4, 2, 5, 0, 3, 0]
[0, 4, 2, 5, 3]
size=8 k=0 remove(0) k++,size-- nums=[0,4,2,5,0,3,0]
size=7 k=1 nums.get(1)=4 k++
size=7 k=2 nums.get(2)=2 k++
size=7 k=3 nums.get(3)=5 k++
size=7 k=4 nums.get(4)=0 remove(4) k++,size-- nums=[0,4,2,5,3,0]
size=6 k=5 nums.get(5)=0 remove(5) k++,size-- nums=[0,4,2,5,3]
2.假设如下代码中,若t1线程在t2线程启动之前已经完成启动。代码的输出是()B
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 1 wake up
Thread 2 sent notify.
Thread 2 sent notify.
Thread 1 wake up
A、B皆有可能
程序无输出卡死
执行obj.wait()时释放了锁,所以t2可以获得锁然后执行notifyAll()。但是通知后,当前线程t2不会马上释放该对象锁,wait 所在的线程t1并不能马上获取该对象锁,要等到程序退出 synchronized 代码块后,当前线程t2才会释放锁,wait所在的线程t1也才可以获取该对象锁,然后打印t1线程里的语句。
3.定义一维数组的时候,必须显式指明数组的长度,定义**维数组的时候,其一维数组的长度必须首先指明,其它维度数组的长度可以稍后指定, “[]” 是数组运算符的意思,在声明一个数组时,数组运算符可以放在数据类型与变量之间,也可以放在变量之后。