好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

笔试JAVA

笔试JAVA

一次笔试引发的血案

读前须知:

  各位朋友,此篇文章只是本人测试的结果,我的知识和思维必定有限,因此,此篇文章还存在缺陷,如有不正确的地方请大家指出,我及时改正。

   各位看客、牛人,不要小看这几到题啊,来尝试一下找错误吧,小弟先附上自己的理解(当然是经过测试的),一起交流吧。

  看看你能中几枪。。。

  巨人网络2013校园招聘Java程序员笔试题:

1、改错题(指出错误之处并对其进行修改)

  1.1、下列代码的错误之处

  --

  --

   1   public   class   Question1 {
   2       /** 
  3        * 判断是否为奇数
   4        *   @param   i
   5        *   @return   true 为奇数 false 为偶数
   6        */ 
  7       public   static   boolean  isOdd( int   i){
   8           return  i%2==1 ;
   9       }
  10       /** 
 11        *   @param   args
  12        */ 
 13       public   static   void   main(String[] args) {
  14           for ( int  i=Integer.MIN_VALUE;i<=Integer.MAX_VALUE;++ i){
  15               boolean  isOdd= isOdd(i);
  16              System.out.println(String.format("i=%d,isOdd=%b" , i, isOdd));
  17           }
  18       }
  19  }  

  1.2、下列代码的错误之处

  --

  --

  1   public   class   Question2 {
  2       public   static   void   main(String[] args) {
  3           final   long  MICROS_PER_DAY=24*60*60*1000*1000 ;
  4           final   long  MILLIS_PER_DAY=24*60*60*1000 ;
  5          System.out.println(MICROS_PER_DAY/ MILLIS_PER_DAY);
  6       }
  7  } 

  1.3、下列代码的错误之处

  --

  --

  1   public   class   Question3 {
  2       public   static   void   main(String[] args) {
  3           for ( byte  b=Byte.MIN_VALUE;b<Byte.MAX_VALUE;b++ ){
  4               if (b==0x90 )
  5                  System.out.println("Joy!" );
  6           }
  7       }
  8  } 

   1.1错误:

    1、for语句是死循环; 

    2、判断int型是否为奇数return i%2==1错误,应该为:return i%2!=0;

     3、Mysuny这位朋友提出判断是否为奇数用i&1最好,我表示赞成,return (i&1)==1;

  测试代码1:

   1   public   class   Question1Test2 {
   2       /** 
  3        * 判断是否为奇数
   4        *   @param   i
   5        *   @return   true 为奇数 false 为偶数
   6        */ 
  7       public   static   boolean  isOdd( int   i){
   8           return  i%2==1 ;
   9       }
  10       /** 
 11        *   @param   args
  12        */ 
 13       public   static   void  main(String[] args)  throws   Exception {
  14           for ( int  i=Integer.MAX_VALUE-5;i<=Integer.MAX_VALUE;++ i){
  15               boolean  isOdd= isOdd(i);
  16              System.out.println(String.format("i=%d,isOdd=%b" , i, isOdd));
  17              Thread.sleep(500 );
  18           }
  19       }
  20  } 

   结果:

  1  i=2147483642,isOdd= false 
 2  i=2147483643,isOdd= true 
 3  i=2147483644,isOdd= false 
 4  i=2147483645,isOdd= true 
 5  i=2147483646,isOdd= false 
 6  i=2147483647,isOdd= true 
 7 i=-2147483648,isOdd=false
8 i=-2147483647,isOdd=false
9 i=-2147483646,isOdd=false   注意:这将引出此程序的第二个错误!  

   1   public   class   Question1Test3 {
   2       public   static   void   main(String[] args) {
   3          System.out.println("整数的最小值:"+ Integer.MIN_VALUE);
   4           //      整数的最小值:-2147483648 
  5          System.out.println("整数的最大值:"+ Integer.MAX_VALUE);
   6           //      整数的最大值:2147483647 
  7          System.out.println("Integer.MAX_VALUE+1:"+(Integer.MAX_VALUE+1 ));
   8           //      Integer.MAX_VALUE+1:-2147483648 
  9       }
  10  } 

  测试代码二:

   1   public   class   Question1Test5 {
   2       /** 
  3        * 判断是否为奇数
   4        *   @param   i
   5        *   @return   true 为奇数 false 为偶数
   6        */ 
  7       public   static   boolean  isOdd( int   i){
   8           int  j=i%2 ;
   9          System.out.println("i%2="+ j);
  10           return  j==1 ;
  11       }
  12       /** 
 13        *   @param   args
  14        */ 
 15       public   static   void   main(String[] args) {
  16           for ( int  i=-10;i<=0;++ i){
  17               boolean  isOdd= isOdd(i);
  18              System.out.println(String.format("i=%d,isOdd=%b" , i, isOdd));
  19           }
  20       }
  21  } 

   运行结果:

   1  i%2=0
  2  i=-10,isOdd= false 
  3  i%2=  -1  
  4  i=-9,isOdd= false 
  5  i%2=0
  6  i=-8,isOdd= false 
  7  i%2=-1
  8  i=-7,isOdd= false 
  9  i%2=0
 10  i=-6,isOdd= false 
 11  i%2=-1
 12  i=-5,isOdd= false 
 13  i%2=0
 14  i=-4,isOdd= false 
 15  i%2=-1
 16  i=-3,isOdd= false 
 17  i%2=0
 18  i=-2,isOdd= false 
 19  i%2=-1
 20  i=-1,isOdd= false 
 21  i%2=0
 22  i=0,isOdd= false  

  通过测试二及其运行结果我们可以看到当为负int型的数据时,与2的余数为-1而不是1。

  正确写法:

   1   public   class   Question1Test4 {
   2       /** 
  3        * 判断是否为奇数
   4        *   @param   i
   5        *   @return   true 为奇数 false 为偶数
   6        */ 
  7       public   static   boolean  isOdd( int   i){
   8           return  i%2 != 0 ;
   9       }
  10       /** 
 11        *   @param   args
  12        */ 
 13       public   static   void   main(String[] args) {
  14           for ( int  i=Integer.MIN_VALUE;i<=Integer.MAX_VALUE;++ i){
  15               boolean  isOdd= isOdd(i);
  16              System.out.println(String.format("i=%d,isOdd=%b" , i, isOdd));
  17               if (i ==  Integer.MAX_VALUE)
  18                   break  ;
  19           }
  20       }
  21  } 

  1.2错误:int类型数值计算超出范围的问题

   1.2的运行结果是:5,大家是不是感觉很奇怪啊,为什么不是1000呢?

  测试程序1如下:

   1   public   class   Question2Test {
   2       public   static   void   main(String[] args) {
   3           int  i = 24 * 60 * 60 * 1000 * 1000 ;
   4           long  li = 24 * 60 * 60 * 1000 * 1000 ;
   5           long  l = 24 * 60 * 60 * 1000 * 1000L ;
   6          System.out.println("i=" +  i);
   7           //      i=500654080 
  8          System.out.println("li=" +  li);
   9           //      li=500654080 
 10          System.out.println("l=" +  l);
  11           //      l=86400000000 
 12           System.out.println(Integer.MAX_VALUE);
  13           //      2147483647 
 14       }
  15  } 

  从测试结果我们可以看出:24*60*60*1000*1000 的结果明显超出了int类型的表达范围,在运算的过程中运算结果仍然为int型,超出范围就截取后64位作为运算的结果。因此,我们看到虽然定义了long型变量li,但结果仍然是截取后的结果。

  测试程序1中仍然存在问题,我们在测试程序2中指出。

   测试程序2如下:

   1   public   class   Question2Test2 {
   2       public   static   void   main(String[] args) {
   3           long  l1 = 24*60*60*1000*1000*1000L ;
   4           long  l2 = 24L*60*60*1000*1000*1000 ;
   5           System.out.println(l1);
   6           //      500654080000 
  7           System.out.println(l2);
   8           //      86400000000000 
  9       }
  10  } 

  我想大家都可以看懂我写测试程序2的用意,我就不在多说了。。。

   正确写法如下:

  1   public   class   Question2Test3 {
  2       public   static   void   main(String[] args) {
  3           final   long  MICROS_PER_DAY=24L*60*60*1000*1000 ;
  4           final   long  MILLIS_PER_DAY=24L*60*60*1000 ;
  5          System.out.println(MICROS_PER_DAY/ MILLIS_PER_DAY);
  6           //      1000 
 7       }
  8  } 

   1.3正确     (本人这么觉得)

   测试程序1:

   1   public   class   Question3Test1 {
   2       public   static   void   main(String[] args) {
   3          System.out.println("byte类型的最大值:"+ Byte.MAX_VALUE);
   4           //      byte类型的最大值:127 
  5           for ( byte  b=( byte )(Byte.MAX_VALUE-5);b<Byte.MAX_VALUE;b++ ){
   6              System.out.println("b="+ b);
   7               if (b==0x90 )
   8                  System.out.println("Joy!" );
   9           }
  10       }
  11  } 

  运行结果:

  1  b=122
 2  b=123
 3  b=124
 4  b=125
 5  b=126 

  由于1.3程序的for循环中 b<Byte.MAX_VALUE  而并不是 b<=Byte.MAX_VALUE ,所以没有出现1.1中的错误。

  有人觉得0x90超出了byte类型的表示范围[-128,127],但是我并不觉得在这里是错误,因为题目也没有特殊要求。

 

分类:  Java

标签:  Java笔试、面试题

作者: Leo_wl

    

出处: http://www.cnblogs.com/Leo_wl/

    

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

版权信息

查看更多关于笔试JAVA的详细内容...

  阅读:43次