Java中常见的陷阱题及答案
1、找奇数:
publicstaticbooleanisOdd(inti){ returni%2==1; }
上面的方法真的能找到所有的奇数么?
A:没有考虑到负数问题,如果i为负则不正确。应该returni%2==0
2.浮点数相减
System.out.println(2.0-1.9);
A:Java中的简单浮点数类型float和double不能够进行运算。不光是Java,在其它很多编程语言中也有这样的问题。在大多数情况下,计算的结果是准确的,但是多试几次(可以做一个循环)就可以试出类似上面的错误。当然加减乘除都有可能有问题,
比如:
System.out.println(0.05+0.01); System.out.println(1.0-0.42); System.out.println(4.015*100); System.out.println(123.3/100);
这是因为有些十进制有限位数的小数,到二进制里面可能会变成无限循环小数,在浮点数中不能表示而损伤精度。
解决方法:
1.如果是判断a-b是否等于c,或者a+b是否等于c的,可以使用
if(0.05+0.01-0.06<0.0000001) { }
2.在《EffectiveJava》这本书中提到一个原则,float和double只能用来做科学计算或者是工程计算,在商业计算中我们要用java.math.BigDecimal来解决
System.out.println((newBigDecimal("2.0")).subtract( newBigDecimal("1.9")).doubleValue());
3.无限循环
publicstaticfinalintEND=Integer.MAX_VALUE; publicstaticfinalintSTART=END-2; publicstaticvoidmain(String[]args){ intcount=0; for(inti=START;i<=END;i++) count++; System.out.println(count); }
A:这里无限循环的原因就是当i为Integer.MAX_VALUE时,此时for循环是先++,然后判断i是否<=END,当i为Integer.MAX_VALUE再++时,i变成了负数。所以就一直循环下去。
变成负数的原因就是int溢出了。这里将<=END改成<END就可以解决问题。
4.到底返回什么?
publicstaticbooleandecision(){ try{ returntrue; }finally{ returnfalse; } }
A:返回false。此时returntrue是不可达语句,在编译阶段将优化去掉。
3、下面来分享一段面试可能会遇到的陷阱题
看代码:
inta=5; System.out.println("valueis"+((a<5)?10.9:9));
输出结果为:
A.编译错误 B10.9 C.9 D以上答案都不对。
运行执行结果为:
valueis9.0
因为((a<5)?10.9)有一个10.9java根据运算符精度自动转型。因此后面的9也会变成9.0。
所以选D。
a
StringBufferstr1=newStringBuffer("123"); StringBufferstr2=newStringBuffer("123"); if(str1.equals(str2)){ System.out.println("str1.equalstr2"); }else{ System.out.println("str1.notequalstr2"); }
结果为:str1.notequalsstr2 这说明StringBuffer没有重写equals方法。
Floatfa=newFloat(0.9f); Floatfb=newFloat(0.9f);//Floatfb=newFloat("0.9f"); Doubledb=newDouble(0.9f); if(fa==fb){//false System.out.println("fa==fb"); }else{ System.out.println("fa!=fb"); } if(fa.equals(fb)){//true System.out.println("fa.equalfb"); }else{ System.out.println("fa!equalfb"); } if(db.equals(fb)){//false System.out.println("db.equalfb"); }else{ System.out.println("db!equalfb"); }
结果为:
fa!=fb fa.equalfb db!equalfbFloat型与Double型肯定不相等
如果还有其他欢迎补充。
Reference:
1.http://blog.csdn.net/ol_beta/article/details/5598867
2.http://zhidao.baidu.com/link?url=0UyDU42L7DXZitdydJMG3IIUDIf3xidFCRAObZAq6SHFCEaNnp2Oyuq1KVwBvmlR0UZGHSjD4f6A1yD0d65JL_
3.http://bbs.csdn.net/topics/300023952
4.http://z466459262.iteye.com/blog/739300
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流。