做题规则:不允许进行上机操作,但可以查 API DOC,JDK 版本 1.5。
1. 请问以下程序会输出什么?
public class Test1 {
public static void main(String[] args) {
int num = 32;
System.out.println(num >>= 32);
}
}
======= 我 == 是 == 题 == 目 == 间 == 的 == 小 == 分 == 隔 == 符 =======
2. 请问以下程序会输出什么?
public class Test2 {
public static void main(String[] args) {
int j = 0;
for (int i = 0; i < 100; i++) {
j = j++;
}
System.out.println(j);
}
}
======= 我 == 是 == 题 == 目 == 间 == 的 == 小 == 分 == 隔 == 符 =======
3. 请问以下程序会输出什么?
public class Test3 {
public static void main(String[] args) {
boolean b = true?false:true == true?false:true;
System.out.println(b);
}
}
======= 我 == 是 == 题 == 目 == 间 == 的 == 小 == 分 == 隔 == 符 =======
4. 请问以下程序会输出什么?
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class Test4 {
public static void main(String[] args) {
List<String> list = new ArrayList<String>();
list.add("Happy");
list.add("birthday");
list.add("to");
list.add("you.");
for(Iterator i = list.iterator(); i.hasNext(); ) {
String s = i.next();
System.out.println(s);
}
}
}
======= 我 == 是 == 题 == 目 == 间 == 的 == 小 == 分 == 隔 == 符 =======
5. Queue(队列)接口是 JDK 1.5 中新增加的类库,为了让大家更好地了解它,请说出以下程序的运行结果。
import java.util.Comparator;
import java.util.PriorityQueue;
import java.util.Queue;
public class Test5 {
public static void main(String[] args) {
Queue<Integer> queue = new PriorityQueue<Integer>(20,
new Comparator<Integer>() {
public int compare(Integer i, Integer j) {
int result = i % 2 - j % 2;
if (result == 0)
result = i - j;
return result;
}
});
for (int i = 0; i < 20; i++) {
queue.offer(i);
}
for (int i = 0; i < 20; i++) {
System.out.println(queue.poll());
}
}
}
======= 我 == 是 == 题 == 目 == 间 == 的 == 小 == 分 == 隔 == 符 =======
6. 请在以下程序段中的空白处补上最简洁的语句,在程序运行后会输出运行时的时间。
显示格式为:yyyy-MM-dd HH:mm:ss
public class Test6 {
public static void main(String[] args) {
System.out.println(formatTime(System.currentTimeMillis()));
}
public static String formatTime(long time) {
return _____________________________;
}
}
老规矩,需要粘帖代码运行的话,请将两个全身空格替换成一个 Tab 或者直接替换掉即可。
===============================================================
=======================大家的回复================================
第一道题很奇怪:
解释下:移位操作是相对于内存的,而NUM是INT型,也就是32位,(前面27个0)10000
当移位少于32位(全长时),只需要将整个内存单元往左或往右移动指定数目
如:num >>2 ------8 num >> 3 ------4
当移位大于32位(全长时),这时存储该数的内存单元发生了变化,会将整个数字单元移到别的内存单元中,这时取到的值会是另外内存单元的值.
如:num >> 32 (恰好移到另一个单元)-----32
num >> 33 (和num>>1结果是一样的)----16
说的不对,有问题的地方还请高手们指教哈!!!!
===============================================================
6 难道是用String.format,如果要我选择查相应的格式,我宁愿选择熟悉的SimpleDateFormat
return String.format("%tF %tT", new Date(time), new Date(time));
to: qybao
哈哈,String.format 要比 SimpleDateFormat 快很多,不过你的写法还是不简洁。
===============================================================
第二道题是0
因为JAVA用了中间缓存变量的机制
j=j++;可换成如下写法。
temp=j;
j=j+1;
j=temp;
所以结果为0
===============================================================
String.format() 的参数可以只带一个,用不着写两个 new Date(time) 吧,还有作为日期类型的话,可以直接使用 long 型数据的。
直接写成:
String.format("%tF %<tT", time);
就可以了,这种格式只在 JDK 1.5 以上的版本适用,作为格式化日期,完全可以取代 SimpleDateFormat,速度要比 SimpleDateFormat 快(当然了,将字符串变为 Date 就不行了)。从这个版本开始,喜欢 C 语言中的 printf 函数的,在 Java 里也可以使用 System.out.printf() 了,这主要依赖于 JDK 1.5 新增的特性——变参。具体的参数可以参见 java.util.Formatter 类。
===============================================================
3. boolean b = true?false:true == true?false:true;
==>boolean b = true?false:(true == true?false:true);
当时自己写程序的时候,也这样写过,但是理解成
boolean b = (true?false:true == true)?false:true;
这样了,晕了好一阵子.后来就加括号了,好理解.
--------------------------------------------------------------
哈哈,第 3 题,是让大家知道运算符的优先级别
boolean b = true?false:true == true?false:true;
== 的优先级要高于三目运算符的优先级,所以正确的运算顺序(加上括号来说明)是:
boolean b = ((true?false:(true == true))?false:true);
这样的,所以得出的结果是 false。如果你得出的答案是 true 的话,那你可能理解成了:
boolean b = (true?false:true) == (true?false:true);
没有把运算符的优先级别弄清楚,基本上的顺序是(1级优先级最高,16级最小):
1级 —— . ()
2级 —— ++ -- ! instanceof
3级 —— new
4级 —— * / %
5级 —— + -
6级 —— >> << >>>
7级 —— > < >= <=
8级 —— == !=
9级 —— &
10级 —— ^
11级 —— !
12级 —— &&
13级 —— ||
14级 —— ?:
15级 —— = += -= *= /= %= ^=
16级 —— &= <<= >>= >>>=
-----------------------------------------------
呀!好像是耶~~
对不起,对不起啦,道歉一下!真的不好意思,写的时候没有注意到结合性问题,汗 !!!-_-!!!
三目运算符是右结合性的,所以应该理解为:
boolean b = true?false:((true == true)?false:true);
谢谢 yingrihong 的指正。
===============================================================
第一个是32
对于移位操作是这样的
int num=32;
int wei=99;
num>>wei
num>>(wei%32)
在所有移位操作中都是对32(int类型的)取余这样就保证了位移后的正确性
===============================================================
这些题都是很经典的,这些东西你平时可能根本就没想过,但是有时候你写出的程序可能和你想要的结果不一样,这时候你就要想为什么会这样.
我也是遇到过这样的问题才这样说的,我遇到的是在C语言中int i = 10; i = i / i++;最后输出结果是2,我也是一直这样来理解的,但是突然有一天我无聊用java试了一下,在java中输出的是1,我一直不理解在java中为什么会是1,后来问别人才知道java和c的处理不一样,并且java的处理在语言规范中已经做了规定.而标准C对此并没有做规定,所以各个C编译器的实现就不同,还是上面的代码你拿到VC和GCC中结果又会不同.
===============================================================
第一题:
第一道题很奇怪:
解释下:移位操作是相对于内存的,而NUM是INT型,也就是32位,(前面27个0)10000
当移位少于32位(全长时),只需要将整个内存单元往左或往右移动指定数目
如:num >>2 ------8 num >> 3 ------4
当移位大于32位(全长时),这时存储该数的内存单元发生了变化,会将整个数字单元移到别的内存单元中,这时取到的值会是另外内存单元的值.
如:num >> 32 (恰好移到另一个单元)-----32
num >> 33 (和num>>1结果是一样的)----16
说的不对,有问题的地方还请高手们指教哈!!!!
----应该是
解释下:移位操作是相对于内存的,而NUM是INT型,也就是32位,(前面26个0)100000
------------------------------------------
好象是这样的吧
移位操作符右边的参数要先进行模的32运算.并且移位是对二进制的操作,而二进制中8位是一个循环.所以num>>32就等于原值.num>>33 == num>>25 ==num>>17==num>>9==num>>1;
就好象1<<35的值与1<<3的值是相等的都为8.
===============================================================
最终答案(LZ回答)
to: wyg0302
你的理解基本上是正确的,这是由 Java 虚拟机规范规定的,进行移位运算时,int 类型数据只取操作数的低 5 位数据(也就是相当于进行了模 32 操作),long 类型的只取低 6 位数据(相当于进行模 64 操作),所以第 1 题 num >>= 32,32 的低 5 位是 00000,所以与 num >>= 0 的结果是一样的。
to: guoxyj
第 4 题是编译错误是正确答案。
这道题主要看看大家对 JDK 1.5 新特性中泛型的理解,在代码中可以看到 List 的泛型参数是 String,也就是说 List 中只允许存放 String 类型的数据。该题的错误之处主要在于
for(Iterator i = list.iterator(); i.hasNext(); )
这一句上,通过 API 文档可以看到 Iterator 迭代器也是需要采用泛型参数的,没有加泛型参数的话,i.next(); 返回的结果是 Object 类型,所以 String s = i.next(); 就会报错,为了类型安全,应该改为:
for(Iterator<String> i = list.iterator(); i.hasNext(); )
或者使用 foreach 循环来遍历这个 List:
for(String s : list) {
System.out.println(s);
}