这是小小题目的系列之二
系列之一: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 或者直接替换掉即可。

解决方案 »

  1.   

    1.32
    2.99
    3.true
    4.b h t y
    其他的不会.
      

  2.   

    to: letsflytogether“BC”应该不会是“白痴”的意思吧。
      

  3.   

    2题:100
    3题:false
    本来我准备把这个答案贴上去的,发现2题和上面说的99不一样,我就运行了一下,傻眼了,居然是0.想了想,顿然醒悟,j=j++;每次j++是0,随后变为1,随后又把0赋值给j,j又成了0.真是妙啊
      

  4.   

    没运行,推测一下结果
    1 0 右移32位
    2 0 java入栈和C有点不一样,入栈后值就不变了,相当于j=j,j++(右->左),j=j结果还是0
    3 false
    4 Happy
      birthday
      to 
      you. ArrayList顺序好像不会乱
    5 19
      17
      ...
      1
      20
      18
      ...
      0 优先级别6 new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date(time));
      

  5.   

    第一道题很奇怪:
       解释下:移位操作是相对于内存的,而NUM是INT型,也就是32位,(前面27个0)10000
       当移位少于32位(全长时),只需要将整个内存单元往左或往右移动指定数目
           如:num >>2  ------8     num >> 3   ------4
       当移位大于32位(全长时),这时存储该数的内存单元发生了变化,会将整个数字单元移到别的内存单元中,这时取到的值会是另外内存单元的值.
           如:num  >> 32  (恰好移到另一个单元)-----32
              num  >> 33  (和num>>1结果是一样的)----16 
    说的不对,有问题的地方还请高手们指教哈!!!!
      

  6.   

    1.  32
    2.  0
    3.  false
    4.  String s = i.next();要強轉
    5.  先偶數排序,然后奇數排序
    6.  new Date(time).toLocaleString().replace("/", "-")
      

  7.   

    楼主辛苦了~1. int移位,低5位有效,所以压根没移位
    2. 看看这里
       http://community.csdn.net/Expert/topic/5759/5759250.xml?temp=.3821833
    6. 楼主太善良了~格式都写好了~
      

  8.   

    第 6 题是想让大家补上最简洁的语句,不过上面回答的代码不是很简洁。提示一下:JDK 1.5 中有些什么新的东西呢?
      

  9.   

    第一道题很奇怪:
       解释下:移位操作是相对于内存的,而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
      

  10.   

    6 难道是用String.format,如果要我选择查相应的格式,我宁愿选择熟悉的SimpleDateFormat
    return String.format("%tF %tT", new Date(time), new Date(time));
      

  11.   

    to: qybao哈哈,String.format 要比 SimpleDateFormat 快很多,不过你的写法还是不简洁。
      

  12.   

    第二道题是0
    因为JAVA用了中间缓存变量的机制
    j=j++;可换成如下写法。
    temp=j;
    j=j+1;
    j=temp;
    所以结果为0
      

  13.   

    再简洁的话可以用%tx
    我机器上没有JVM,试不了
      

  14.   

    to: qybao(阿宝)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 类。
      

  15.   

    第3题 
    false
    true==fale 结果是 FALSE
      

  16.   

    Server Error in '/' Application.
    --------------------------------------------------------------------------------Invalid postback or callback argument.  Event validation is enabled using <pages enableEventValidation="true"/> in configuration or <%@ Page EnableEventValidation="true" %> in a page.  For security purposes, this feature verifies that arguments to postback or callback events originate from the server control that originally rendered them.  If the data is valid and expected, use the ClientScriptManager.RegisterForEventValidation method in order to register the postback or callback data for validation.
    =====================================================
    加入我的收藏夹时出现了这段话。
    那个打印boolean值b的应该是false吧。我记得三目是右结合的。
      

  17.   

    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;
    这样了,晕了好一阵子.后来就加括号了,好理解.
      

  18.   

    哈哈,第 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级 —— &= <<= >>= >>>=
      

  19.   

    bao兄弟啊,你自己也被转晕了,哈哈.
      

  20.   

    第一个是32
    对于移位操作是这样的
    int num=32;
    int wei=99;
    num>>wei
    num>>(wei%32)
    在所有移位操作中都是对32(int类型的)取余这样就保证了位移后的正确性
      

  21.   


    第2题是0,
    第三题是false   bao110908(火龙果) 正确
    第四题好像顺序发生变化
    其余不会了
      

  22.   

    这种题目最无聊,实际编程中那个是用的到的?楼主来说说。
    ______________________________________________________这些题目按范围来划分的话,应该属于 Java 的基础知识,所以就贴在了“Java J2SE / 基础类”中的,哪些地方有陷阱希望今后值得注意一下。基础是大树的根,根不扎实何来的枝繁叶茂?我只是想通过这些题目让大家了解一些平常可能被忽视的地方。可能有人对这些题目不屑一顾,但是通过上一次的帖和这一次的帖至目前为止,参与者中没有一个人是全部答对的!
      

  23.   

    这些题都是很经典的,这些东西你平时可能根本就没想过,但是有时候你写出的程序可能和你想要的结果不一样,这时候你就要想为什么会这样.
    我也是遇到过这样的问题才这样说的,我遇到的是在C语言中int i = 10; i = i / i++;最后输出结果是2,我也是一直这样来理解的,但是突然有一天我无聊用java试了一下,在java中输出的是1,我一直不理解在java中为什么会是1,后来问别人才知道java和c的处理不一样,并且java的处理在语言规范中已经做了规定.而标准C对此并没有做规定,所以各个C编译器的实现就不同,还是上面的代码你拿到VC和GCC中结果又会不同.
      

  24.   

    楼主说错了吧,第三题你的解释是错的
           public static void main(String[] args) {
    boolean b = ((true?false:(true == true))?false:true);
    System.out.println(b);
    }
    运行结果是true啊
      

  25.   

    呀!好像是耶~~对不起,对不起啦,道歉一下!真的不好意思,写的时候没有注意到结合性问题,汗 !!!-_-!!!三目运算符是右结合性的,所以应该理解为:boolean b = true?false:((true == true)?false:true);谢谢 yingrihong 的指正。
      

  26.   

    to: wyg0302我学习 Java 的时间也不长,到目前为止不到一年半。我认为应该从最基础的开始学,不急不躁,一年之后就有感觉了,不过记得要持之以恒哦,最不能做的就是三天打渔,两天晒网的,一定要抽出时间来,做每件事情都应是这样的。
      

  27.   

    第一题:
    第一道题很奇怪:
       解释下:移位操作是相对于内存的,而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.
      

  28.   

    第4题
    String s = i.next();
    怎么编译通不过,我用的是jdk1.6
      

  29.   

    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);
    }
      

  30.   

    谢谢楼主.第3题:
    应该是false,不应该是true.我运行了下.
    并且按照楼主的意思boolean b = true?false:((true == true)?false:true);
    也应该是fasle.
    ----------------------------------------
     yingrihong 的这种分割违反了运算符的规定
    boolean b = ((true?false:(true == true))?false:true);
    虽然这样运算的是true
      

  31.   

    to: wyg0302你错怪 yingrihong 了,yingrihong 是指正我回答中的错误,我开始时忽略了三目运算的右结合性而导致的错误,对不起大家了~~
      

  32.   

    4. 请问以下程序会输出什么?
    String s = i.next();能编译通过?
      

  33.   


    呵呵
    但是答案应该是FALSE啊
    我自己做了下
    也在机器上运行看了下 应该是false的
      

  34.   

    哦是的
    我没看清楚
    没有错他
    是我看括号太多了
    没看清楚
    向yingrihong道歉
    呵呵
    不好意思
      

  35.   

    感谢bao110908的奉献精神!  受益良多!
      

  36.   

    第一个可以理解。右移运算。那么多少位右移是一个循环呢?对于int来说。还有阿,加那个等于是什么意思呢?请指教一下。
    第二个就没有想明白拉。究竟是为什么呢?全局变量个区域变量我都试过拉,但是结果都是0,我真的没有办法理解。
      

  37.   

    哎,终于想明白了,惭愧阿。j=j++;永远都不会上升的。因为j=j++;是先赋值后加加的。所以j不管你运行多少次都是0。
      

  38.   

    你在发牢骚阿?那还不如多拿点时间来想想自己如何去学好JAVA,它可是要时间作为代价的阿。
      

  39.   


    我觉得这个说法不太对哦   尽管是先赋值再加  但是 那个 左边的j 还是不是 j  既然是那为什么没有自曾?27楼说的不错可以这样理解  j++ 返回的是一个临时变量  所以在赋值的时候 左边的 j 其实已经 +1 了
    但是 又被右边的 返回了临时变量的 j 给覆盖掉了知道C++ 中操作符 重载的 应该明白我在说什么吧
      

  40.   

     Mark  正确答案89楼(写给自己看的哈)
      

  41.   

    请问楼主第6题楼主给的格式那么好干嘛不直接用return new Timestamp(time);