創建後狀態不可修改的對象。String 是典型代表:
String s = "ABC";
s.toLowerCase(); // 返回新對象 "abc",原 "ABC" 不變

String s1 = "abcd";
String s2 = "abcd"; // 指向同一個池對象
String s3 = "ab" + "cd"; // 編譯期優化,同指向 "abcd"
String.intern() 去重、節省記憶體"ab"+"cd" → "abcd")也依賴不可變語義String 大量用作 HashMap/HashSet Key,頻繁計算 hashCode()。
public final class String {
private int hash; // 默認 0,首次計算後緩存
public int hashCode() {
int h = hash;
if (h == 0 && value.length > 0) {
hash = h = computeHashCode(); // 計算並緩存
}
return h;
}
}
hashCode **終身不變**,可安全緩存hashCode 需重算,緩存失效,Map 定位錯誤String 成為 **Map Key 首選** 的關鍵性能優勢| 場景 | 可變風險 | 不可變保護 |
|---|---|---|
| 網絡連接 (URL、Host、Port) | 惡意修改導向釣魚地址 | 參數傳遞過程中不可被篡改 |
| 文件路徑 | 路徑遍歷攻擊 (../../etc/passwd) | 校驗後傳遞,中間不可竄改 |
| 反射參數 (類名、方法名) | 注入任意類/方法 | 類加載器安全加載正確類 |
| 數據庫連接 (用戶名/密碼) | 竄改憑證 | 認證過程不可繞過 |