1、找奇数:
1
2
3
|
public static boolean isOdd( int i){
return i % 2 == 1 ;
}
|
上面的方法真的能找到所有的奇数么?
A:没有考虑到负数问题,如果i为负则不正确。应该return i%2 == 0
2. 浮点数相减
1
|
System.out.println( 2.0 - 1.9 );
|
A:Java中的简单浮点数类型float和double不能够进行运算。不光是Java,在其它很多编程语言中也有这样的问题。在大多数情况下,计算的结果是准确的,但是多试几次(可以做一个循环)就可以试出类似上面的错误。当然加减乘除都有可能有问题,
比如:
1
2
3
4
|
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的,可以使用
1
2
3
|
if ( 0.05 + 0.01 - 0.06 < 0.0000001 )
{
}
|
2. 在《Effective Java》这本书中提到一个原则,float和double只能用来做科学计算或者是工程计算,在商业计算中我们要用 java.math.BigDecimal
来解决
1
2
|
System.out.println(( new BigDecimal( "2.0" )).subtract(
new BigDecimal( "1.9" )).doubleValue());
|
3. 无限循环
1
2
3
4
5
6
7
8
9
|
public static final int END = Integer.MAX_VALUE;
public static final int START = END - 2 ;
public static void main(String[] args) {
int count = 0 ;
for ( int i = 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. 到底返回什么?
1
2
3
4
5
6
7
|
public static boolean decision() {
try {
return true ;
} finally {
return false ;
}
}
|
A:返回false。此时return true
是不可达语句,在编译阶段将优化去掉。
3、下面来分享一段面试可能会遇到的陷阱题
看代码:
1
2
|
int a= 5 ;
System.out.println( "value is" +((a< 5 )? 10.9 : 9 ));
|
输出结果为:
A.编译错误 B10.9 C.9 D 以上答案都不对。
运行执行结果为:
1
|
value is9. 0
|
因为((a<5) ? 10.9 )有一个10.9java 根据运算符精度自动转型。因此后面的 9 也会变成9.0 。
所以选D 。
a
1
2
3
4
5
6
7
|
StringBuffer str1= new StringBuffer( "123" );
StringBuffer str2= new StringBuffer( "123" );
if (str1.equals(str2)){
System.out.println( "str1.equalstr2" );
} else {
System.out.println( "str1.notequalstr2" );
}
|
结果为: str1.notequalsstr2
这说明StringBuffer 没有重写 equals 方法。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
Float fa= new Float( 0 .9f);
Float fb= new Float( 0 .9f); //Float fb=new Float("0.9f");
Double db= new Double( 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" );
}
|
结果为:
1
2
3
|
fa!=fb
fa.equalfb
db!equalfb Float 型与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
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流。
原文链接:https://my.oschina.net/hosee/blog/616705