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

Java 不可變類型深度解析:BigInteger、String 與包裝類的特性與最佳實踐

     編輯:Java 相關知識

經典錯誤示例

BigInteger total = BigInteger.ZERO;
total.add(BigInteger.valueOf(5000));
total.add(BigInteger.valueOf(50000));
total.add(BigInteger.valueOf(500000));
System.out.println(total); // 輸出 0,而非預期的 555000

原因:不可變性

BigInteger、String、BigDecimal 及所有包裝類(Integer、Long 等)均為 不可變類型。其方法不會修改原對象,而是返回新對象。

正確用法

BigInteger total = BigInteger.ZERO;
total = total.add(BigInteger.valueOf(5000));
total = total.add(BigInteger.valueOf(50000));
total = total.add(BigInteger.valueOf(500000));
System.out.println(total); // 輸出 555000

不可變類型的優勢

  • 線程安全:狀態不可變,天然免疫競態條件。
  • 可安全共享:常量池、緩存實例(如 Integer.valueOf(-128~127))可放心複用。
  • 簡化設計:無需防御性拷貝,減少副作用 Bug。
  • 支持哈希容器:作為 Map 鍵或 Set 元素時,哈希碼穩定不變。

常見陷阱與對策

錯誤寫法正確寫法說明
s.replace("a", "b") 未賦值s = s.replace("a", "b")String 方法返回新字符串
list.add(1); 對 Integer 修改不可修改,需 new Integer(2)包裝類無 setter
bd.setScale(2) 未接收bd = bd.setScale(2)BigDecimal 同理

自定義不可變類要點

  1. 類聲明 final,防止繼承破壞不變性。
  2. 所有字段 private final。
  3. 不提供任何修改狀態的方法(setter、非最終字段修改)。
  4. 構造器中對可變參數進行防御性拷貝(如 new ArrayList<>(list))。
  5. getter 返回可變對象時亦需拷貝。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved