HOWTO · Java

Java 中 long 與 int 資料型別的差異

這篇文章解釋了 Java 中 long 和 int 資料型別的區別

本頁內容

當程式預期的數值落在 int 的範圍內時,請使用 int;若數值可能更大,則選擇 long。兩者都是有號原始整數型別。它們的包裝類別 Integer 和 Long 則是物件,適用於使用參考型別的 API 和集合。以下各節會比較兩者的範圍、整數常值語法,以及適合使用包裝類別的情況。

如何選擇 Java 的 int 或 long

int 是 32 位元,可表示 -2,147,483,648 到 2,147,483,647 之間的數值。long 是 64 位元,可表示 -9,223,372,036,854,775,808 到 9,223,372,036,854,775,807 之間的數值。請根據資料可能涵蓋的範圍來選擇;僅憑型別名稱,無法保證每次算術運算的結果都不會超出範圍。

型別 位元寬度 最小值 最大值
int 32 位元 -2,147,483,648 2,147,483,647
long 64 位元 -9,223,372,036,854,775,808 9,223,372,036,854,775,807

未加後綴的十進位整數常值,只要數值符合 int 範圍,通常就會被視為 int。若要讓常值成為 long,請加上 L;當數值超出 int 範圍時尤其需要這麼做。建議使用大寫 L,比較不容易和數字 1 混淆。例如,long population = 9_000_000_000L; 使用了有效的 long 常值。底線只是讓數字更易讀,不會改變數值。

執行下方範例,比較 int 和 long 的值。程式碼與輸出區塊會維持原樣,其中顯示的標籤仍為英文:

public class IntVsLongExample {
    public static void main(String[] args) {
        int count = 120;
        long total = 9_000_000_000L;
        System.out.println("count: " + count);
        System.out.println("total: " + total);
    }
}
count: 120
total: 9000000000

若要比較編譯時的結果,int tooLarge = 2147483648; 無法編譯:這個十進位常值超出 int 的範圍,而且沒有標示為 long。請改寫為 long value = 2147483648L;。編譯器會在程式執行前拒絕第一個宣告,因此不會有執行時輸出。也請記得,除非其中一個運算元或型別轉換讓運算使用 long,否則 int 運算式會以 int 計算;將已經溢位的結果指定給 long,無法還原遺失的數值。

使用 Integer 和 Long 包裝類別

Integer 包裝 int,而 Long 包裝 long。Java 可透過自動裝箱和自動拆箱,在原始型別與其包裝類別之間轉換。例如,Integer score = 42; 會將原始值裝箱;int recordedScore = score; 則會將它拆箱。若明確呈現轉換過程有助於閱讀,也可以使用 intValue() 和 longValue() 方法。

當 API 要求物件時,包裝類別就很實用。例如,List<Integer> 這類泛型集合不能使用原始型別作為型別引數,因此放入其中的值會被裝箱。若要以物件表示 long,例如用於 List<Long>,請選擇 Long。一般的區域變數算術通常使用原始型別較簡單;單純呼叫轉換或工具方法,並不需要包裝類別。

包裝後的值範圍不變:Integer 儲存 int 值,Long 儲存 long 值。包裝類別無法讓數字超出底層原始型別可表示的範圍。無論是指定給 long 變數,還是裝箱為 Long,long 常值都要使用 L。

原始型別與包裝類別物件的差異

原始型別變數會儲存該原始型別的值。包裝類別變數則會持有包裝類別物件的參考,或是 null。這才是實際編程時有用的區別;把包裝類別簡化描述成指向數值儲存位置的指標,是不準確的實體記憶體模型,也無助於選擇型別。

原始型別不能是 null。像 Integer optionalCount = null; 這樣的參考可以表示沒有值;當 API 或資料模型需要區分「未提供」與數值 0 時,這種表示方式很有用。使用前必須先檢查是否為 null。如果 Java 將值為 null 的 Integer 或 Long 自動拆箱,操作會擲出 NullPointerException;只有確認參考指向物件後,才應進行拆箱。

簡而言之,請依所需的數值範圍選擇 int 或 long,再於物件型 API、集合或可空值需要時使用 Integer 或 Long。如此可讓算術運算和缺值表示都保持明確。