现在的位置: 首页 > 综合 > 正文

怪异的小题目 (转)

2013年01月02日 ⁄ 综合 ⁄ 共 5987字 ⁄ 字号 评论关闭

这是小小题目的系列之二
系列之一:http://community.csdn.net/Expert/TopicView3.asp?id=5731833

做题规则:不允许进行上机操作,但可以查 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);

 

 

抱歉!评论已关闭.