long → int 屬於窄化轉換,可能導致數據截斷溢出。本文對比三種轉換方式並分析風險。
long ll = 300000L;
int ii = (int) ll; // 直接截斷高 32 位
原理:丟棄高 32 位,保留低 32 位。若值超出 Integer.MAX_VALUE (2,147,483,647) 會產生負數或錯誤值。
long ll = 300000L;
int ii = new Long(ll).intValue(); // 內部同樣執行 (int)ll
本質:包裝類委託給強制轉換,多一次對象創建開銷,無額外安全檢查。
long ll = 300000L;
int ii = Integer.parseInt(String.valueOf(ll)); // 可能拋出 NumberFormatException
特點:通過字符串解析,若長整數字符串超出 int 範圍會拋異常,可作為「安全轉換」輔助手段。
long big = 3_000_000_000L; // 30億 > Integer.MAX_VALUE
System.out.println((int) big); // -1294967296 (負數!)
System.out.println(new Long(big).intValue()); // -1294967296
// Integer.parseInt(String.valueOf(big)) // 拋出 NumberFormatException
| 場景 | 推薦方式 | 理由 |
|---|---|---|
| 確信數值在 int 範圍內 | (int) longVal | 零開銷、字節碼單指令 |
| 需顯式檢查溢出 | Math.toIntExact(longVal) (Java 8+) | 溢出拋 ArithmeticException |
| 數值來源不可信 | Integer.parseInt(String.valueOf(val)) | 異常可捕獲,但性能差 |
💡 現代 Java 首選:
Math.toIntExact(long)—— 既安全又語義清晰,JVM 內部優化極佳。![]()