首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java 面試高頻陷阱題精選:奇數判斷、浮點運算、循環邊界與 equals 陷阱

     編輯:Java 相關知識

陷阱一:負數奇數判斷失效

// 錯誤:負奇數 % 2 == -1,非 1
public static boolean isOddWrong(int i) { return i % 2 == 1; }

// 正確:位運算或 != 0
public static boolean isOddRight(int i) { return (i & 1) != 0; }
// 或
public static boolean isOddRight2(int i) { return i % 2 != 0; }

核心:Java `%` 運算結果符號與被除數一致,負奇數模 2 得 -1。

陷阱二:浮點數精度丟失

System.out.println(2.0 - 1.9);        // 0.10000000000000009
System.out.println(0.05 + 0.01);      // 0.060000000000000005
System.out.println(4.015 * 100);      // 401.49999999999994
System.out.println(123.3 / 100);      // 1.2329999999999999

原因:二進制無法精確表示十進制小數(如 0.1 = 0.0001100110011...)。

解決方案

  1. 誤差範圍比較:Math.abs(a - b) < 1e-9
  2. BigDecimal 精確計算(金融/商業必須):
    BigDecimal a = new BigDecimal("2.0");
    BigDecimal b = new BigDecimal("1.9");
    System.out.println(a.subtract(b)); // 0.1
    
  3. 整數縮放:以分為單位存儲(長整型),展示時除以 100。

陷阱三:Integer.MAX_VALUE 循環陷阱

public static void infiniteLoop() {
    int END = Integer.MAX_VALUE;
    int START = END - 2;
    int count = 0;
    for (int i = START; i <= END; i++) count++; // 永不結束!
    System.out.println(count);
}

原因:i 遞增至 MAX_VALUE 後再 ++ 溢出變為 MIN_VALUE,永遠 <= END。

修正

for (int i = START; i < END; i++) // 改為 < 而非 <=
// 或用 long 作為循環變量
for (long i = START; i <= END; i++)

陷阱四:finally 中 return 覆蓋 try return

public static boolean trap() {
    try { return true; }
    finally { return false; } // 直接返回 false,try 的 return 被丟棄
}

規則:finally 中的 return/throw 會覆蓋 try/catch 的返回/異常。編譯器會警告「try 中的 return 被 finally 覆蓋」。

陷阱五:三元運算符類型提升

int a = 5;
System.out.println("value is " + ((a < 5) ? 10.9 : 9)); // 輸出: value is 9.0

原因:三元運算符要求二、三操作數類型一致,9 (int) 提升為 9.0 (double)。

陷阱六:StringBuffer 未重寫 equals

StringBuffer s1 = new StringBuffer("123");
StringBuffer s2 = new StringBuffer("123");
System.out.println(s1.equals(s2)); // false!繼承 Object.equals 比較引用
// 正確:s1.toString().equals(s2.toString())

陷阱七:Float/Double 包裝類比較陷阱


Float f1 = new Float(0.9f);
Float f2 = new Float(0.9f);
Double d = new Double(0.9f);

System.out.println(f1 == f2);        // false (引用比較)
System.out.println(f1.equals(f2));   // true  (值比較)
System.out.println(d.equals(f1));    // false (類型不同直接 false)

規則:equals 先檢查類型,Float 與 Double 永不相等。

總結避坑清單

場景錯誤寫法正確寫法
奇數判斷i % 2 == 1(i & 1) != 0
金額計算double 直接運算BigDecimal / 長整型(分)
邊界循環i <= Integer.MAX_VALUEi < Integer.MAX_VALUE 或用 long
finally 返回finally 中 return避免 finally 中 return/throw
三元運算符混用 int/double統一類型或顯式轉型
StringBuffer 比較equalstoString().equals()
包裝類比較== / 跨類型 equals同類型 equals / compareTo
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved