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

Java 易錯點精選(一):replaceAll 陷阱、AWT/Swing 差異、Integer 緩存機制

     編輯:Java 相關知識

Java 開發中看似簡單的 API 調用,往往隱藏著令人踩坑的細節。本文精選三個高頻易錯點,通過原理分析與代碼驗證,助你避開陷阱。

1. String.replaceAll 的正則陷阱

String path = "a.b.c";
path.replaceAll(".", "/"); // 結果:"//////"

原因:replaceAll(String regex, String replacement) 第一參數是正則表達式,. 在正則中匹配任意字符,導致所有字符被替換。

正確寫法:轉義點號 path.replaceAll("\\.", "/"),或使用不支援正則的 path.replace(".", "/")。

2. AWT vs Swing:重量級 vs 輕量級組件

AWT (Abstract Window Toolkit)

  • 調用作業系統 Native 方法實現,依賴底層圖形庫
  • 跨平台表現不一:Windows 風格 vs Unix XWindow 風格
  • 功能為各平台交集,犧牲豐富性換取「一次編譯,到處運行」
  • 組件稱重量級組件,佔用系統資源多

Swing

  • 純 Java 實現,不依賴 Native 圖形庫
  • 外觀一致性好,支援可換裝 LookAndFeel
  • 大多數組件為輕量級組件,資源佔用少
  • 例外:JWindow、JDialog、JFrame 等頂層容器仍為重量級

核心差異:AWT 組件有 Peer(對應系統原生組件),Swing 組件無 Peer,由 Java 2D 繪製。混用時重量級組件永遠覆蓋輕量級組件(Z-order 問題),需注意分層。

3. Integer 緩存機制與 == 比較陷阱

Integer i1 = 59;           // 自動裝箱調用 valueOf(59)
int i2 = 59;               // 基本類型
Integer i3 = Integer.valueOf(59); // 直接調用 valueOf
Integer i4 = new Integer(59);     // 強制創建新對象

System.out.println(i1 == i2);  // true  自動拆箱比值
System.out.println(i1 == i3);  // true  緩存命中,同一對象引用
System.out.println(i3 == i4);  // false i4 新建對象,地址不同
System.out.println(i2 == i4);  // true  i4 自動拆箱比值

valueOf 源碼邏輯 (JDK 8)

public static Integer valueOf(int i) {
    if (i >= IntegerCache.low && i <= IntegerCache.high)  // 默認 [-128, 127]
        return IntegerCache.cache[i + (-IntegerCache.low)];
    return new Integer(i);
}

關鍵結論

  • 裝箱優先走緩存:-128~127 範圍內自動裝箱復用緩存對象
  • new 總創建新對象:繞過緩存
  • == 比較規則:涉及基本類型自動拆箱比值;雙方均為包裝類型比引用地址
  • 最佳實踐:包裝類型比值務必用 .equals(),或顯式拆箱 .intValue()

4. 反射獲取方法的差異

Method[] getMethods()        // 所有 public 方法(含繼承、接口)
Method[] getDeclaredMethods() // 本類聲明的所有方法(含 private,不含繼承)

前者面向「使用者視角」,後者面向「實現者視角」。

總結

細節決定成敗:正則轉義、組件選型、緩存範圍、引用語義,每一個「為什麼」背後都是 JVM 與類庫設計的權衡。理解本質,方能寫出無驚喜的代碼。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved