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