Java中罕見的圈套題及答案。本站提示廣大學習愛好者:(Java中罕見的圈套題及答案)文章只能為提供參考,不一定能成為您想要的結果。以下是Java中罕見的圈套題及答案正文
1、找奇數:
public static boolean isOdd(int i){ return i % 2 == 1; }
下面的辦法真的能找到一切的奇數麼?
A:沒有思索到正數問題,假如i為負則不正確。應該return i%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. 在《Effective Java》這本書中提到一個准繩,float和double只能用來做迷信計算或許是工程計算,在商業計算中我們要用 java.math.BigDecimal
來處理
System.out.println((new BigDecimal("2.0")).subtract( new BigDecimal("1.9")).doubleValue());
3. 有限循環
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. 究竟前往什麼?
public static boolean decision() { try { return true; } finally { return false; } }
A:前往false。此時return true
是不可達語句,在編譯階段將優化去掉。
3、上面來分享一段面試能夠會遇到的圈套題
看代碼:
int a=5; System.out.println("value is"+((a<5)? 10.9:9 ));
輸入後果為:
A.編譯錯誤 B10.9 C.9 D 以上答案都不對。
運轉執行後果為:
value is9.0
由於((a<5) ? 10.9 )有一個10.9java 依據運算符精度自動轉型。因而前面的 9 也會變成9.0 。
所以選D 。
a
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 辦法。
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"); }
後果為:
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
總結
以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或許任務能帶來一定的協助,假如有疑問大家可以留言交流。