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

Java 易錯點精選(一):replaceAll 正則陷阱、AWT/Swing 差異、Integer 緩存與反射方法獲取

     編輯:Java 綜合教學

Java 易錯點精選(一):replaceAll 正則陷阱、AWT/Swing 差異、Integer 緩存與反射方法獲取

本文收錄四個高頻易錯知識點,助力面試與代碼審查。

1. String.replaceAll 參數是正則表達式

String path = "a.b.c";
System.out.println(path.replaceAll(".", "/")); // 輸出 "///" 而非 "a/b/c"
// 原因:'.' 在正則中匹配任意字符
// 正確寫法
System.out.println(path.replaceAll("\\.", "/")); // "a/b/c"
System.out.println(path.replace(".", "/"));      // replace 不用正則,直接替換

2. AWT vs Swing 架構差異

特性AWT (Abstract Window Toolkit)Swing
實現方式調用本地 native 代碼 (Peer 模型)純 Java 實現 (Lightweight)
跨平台外觀隨操作系統:Windows 風格 / Motif 風格可插拔 LookAndFeel,統一外觀
組件豐富度基礎組件豐富組件 (JTable, JTree, JTabbedPane...)
性能/資源重量級,佔用較多系統資源輕量級,佔用較少
混用注意同一窗口避免混用重/輕組件,否則 Z-order 顯示異常

Swing 核心容器 JFrame、JDialog、JWindow 本質仍是重量級 (繼承 AWT 對應類)。

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

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

System.out.println(i1 == i2); // true  → i1 自動拆箱為 int 比較值
System.out.println(i1 == i3); // true  → 緩存 [-128, 127] 返回同一引用
System.out.println(i3 == i4); // false → i4 是新對象
System.out.println(i2 == i4); // true  → i4 自動拆箱比較值

原理:Integer.valueOf(int) 先檢查 IntegerCache.cache[-128~127],命中則返回引用,否則 new Integer(i)。JVM 參數 -XX:AutoBoxCacheMax=size 可調整緩存上限。

4. Class.getMethods() vs getDeclaredMethods()

  • getMethods():返回所有 public 方法,包含繼承自父類/實現的接口方法。
  • getDeclaredMethods():返回類聲明的所有方法(public/protected/default/private),不包含繼承方法,但包含接口默認方法。
public class Base { public void foo() {} protected void bar() {} }
public class Sub extends Base { private void baz() {} }
Sub.class.getMethods()        // [foo] 只有 public 且可見
Sub.class.getDeclaredMethods() // [baz] 只有自身聲明
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved