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

Java long 轉 int 三種姿勢與溢出風險防範

     編輯:Java 相關知識

轉換本質:窄化轉型

long (64 位) → int (32 位) 屬於窄化轉型,高 32 位會被直接截斷,可能導致數值溢出、符號翻轉。務必確認數值範圍在 [-2^31, 2^31-1] 內,否則結果不可預期。

三種轉換方式

1. 強制類型轉換(最常用、性能最佳)

long ll = 300_000L;
int ii = (int) ll;           // 300000
// 溢出示例
long big = 3_000_000_000L;   // 超過 Integer.MAX_VALUE
int overflow = (int) big;    // -1294967296 (補碼截斷)

2. Long.intValue()(語義更清晰)

long ll = 300_000L;
int ii = Long.valueOf(ll).intValue(); // 或 new Long(ll).intValue() (已棄用)

本質仍調用 (int) value,編譯器會優化為直接轉換指令。

3. 字符串中轉(靈活但低效)

long ll = 300_000L;
int ii = Integer.parseInt(String.valueOf(ll));
// 或 Integer.valueOf(String.valueOf(ll))
  • 優點:可配合格式化、異進制解析。
  • 缺點:創建字符串對象、解析開銷大,嚴禁用於高頻熱點路徑。

溢出檢測最佳實踐

public static int safeLongToInt(long value) {
    if (value < Integer.MIN_VALUE || value > Integer.MAX_VALUE) {
        throw new ArithmeticException("long 值超出 int 範圍: " + value);
    }
    return (int) value;
}

// Java 8+ 標準庫法
int ii = Math.toIntExact(ll); // 自動檢測溢出並拋出 ArithmeticException

性能對比 (JMH 基準測試參考)

方法吞吐量備註
(int) value最高單條 CPU 指令,JIT 內聯
Long.valueOf().intValue()同最高編譯器優化消除對象創建
Math.toIntExact()略低含範圍檢查分支
String.valueOf + parseInt低 2-3 數量級內存分配、字符串解析開銷

總結建議

  1. 確信數值安全 → 直接 (int) longVal。
  2. 需運行時保護 → Math.toIntExact() (Java 8+)。
  3. 涉及異進制/格式化 → 字符串中轉。
  4. 嚴禁在循環熱點路徑使用字符串中轉。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved