怪异的小题目 (转)

原创 2007年09月20日 12:40:00

这是小小题目的系列之二
系列之一: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);

 


 

asp.net小题目

  • 2008年10月09日 23:50
  • 9KB
  • 下载

小题目集合

  • 2013年07月24日 23:31
  • 487KB
  • 下载

华为机试小题目之通过掷骰子决定在地图上走的步数

接着上一题的字符串处理,今天早上自己又很快编出了第二题,期待第三题关于计算器题目的完成。有时还是需要很好的心理素质,其实题目都不难。 题目要求:掷的骰子的号码决定你走的步数,比如1代表你可以走一步。...

java 初学者应做的小题目

  • 2012年06月11日 17:03
  • 210KB
  • 下载

一共三个小题目

  • 2008年04月22日 10:35
  • 110KB
  • 下载

五十道编程小题目 --- 28 八大排序算法 java 之 01直接插入排序

1.插入排序—直接插入排序(Straight Insertion Sort) 基本思想: 将一个记录插入到已排序好的有序表中,从而得到一个新,记录数增1的有序表。即:先将序列的第1个记录看成是一...

五十道编程小题目 --- 48 java

【程序48】  题目:某个公司采用公用电话传递数据,数据是四位的整数,在传递过程中是加密的,加密规则如下:每位数字 都加上5,然后用和除以10的余数代替该数字,再将第一位和第四位交换,第二位和第三...

机器学习:核函数的一个小题目

题目:给一百万个三角形,再给一个点,判断在不在某个三角形内。 解法1:RTree 解法2:核函数映射。使得二维空间线性不可分的情况变为三维或四维空间线性可分的。 -------------------...
  • ztf312
  • ztf312
  • 2016年03月27日 11:50
  • 1879

五十道编程小题目 --- 00

看到了50道编程小题目,看了一下挺好的,就留下来,大家有时间也做做啊,做好把代码和心得贴在自己博客,大家一块交流啊,别小看这些小题目,做大的系统也是把一个大系统不断的分成一个个小模块做啊,我觉得这个很...

五十道编程小题目 --- 01 兔子三月生兔子问题java

【程序1】  题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?【即 斐波那契数列】 1.程序分析:...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:怪异的小题目 (转)
举报原因:
原因补充:

(最多只允许输入30个字)