Java 開發中看似簡單的 API 調用,往往隱藏著令人踩坑的細節。本文精選三個高頻易錯點,通過原理分析與代碼驗證,助你避開陷阱。
String path = "a.b.c";
path.replaceAll(".", "/"); // 結果:"//////"
原因:replaceAll(String regex, String replacement) 第一參數是正則表達式,. 在正則中匹配任意字符,導致所有字符被替換。
正確寫法:轉義點號 path.replaceAll("\\.", "/"),或使用不支援正則的 path.replace(".", "/")。
核心差異:AWT 組件有 Peer(對應系統原生組件),Swing 組件無 Peer,由 Java 2D 繪製。混用時重量級組件永遠覆蓋輕量級組件(Z-order 問題),需注意分層。
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 自動拆箱比值
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);
}
.equals(),或顯式拆箱 .intValue()Method[] getMethods() // 所有 public 方法(含繼承、接口)
Method[] getDeclaredMethods() // 本類聲明的所有方法(含 private,不含繼承)
前者面向「使用者視角」,後者面向「實現者視角」。
細節決定成敗:正則轉義、組件選型、緩存範圍、引用語義,每一個「為什麼」背後都是 JVM 與類庫設計的權衡。理解本質,方能寫出無驚喜的代碼。