1L 和(長)1 之間的區別
1. 概述
在本教程中,我們將探討long
類型的文字表示與使用強制轉換運算子將int
值轉換為long
值之間的差異。
2. 文字表示
預設情況下,Java 將所有整數數值視為int
型別。同樣,對於浮點值,預設類型是double.
只有當整數數值包含字母“ L
”或“ l
”作為後綴時,才被認為是long
類型:
long x = 1L;
然而,小寫的「 l
」看起來像數字1
。為了避免混淆,我們應該考慮使用字母的大寫版本。
眾所周知,每個原始資料類型都有其相應的包裝類,它帶有我們可以使用的不同方法,此外,還允許我們在泛型中使用原始值。
由於 Java 自動裝箱功能,我們可以直接將文字值指派給其包裝類別參考:
Long x = 1L;
這裡,Java自動將long
值轉換為Long
物件。
此外,當我們使用文字表示形式定義long
值時,它始終計算為long
資料類型。
3. 顯式類型轉換
接下來,讓我們檢查一下需要使用明確類型轉換的情況。快速回顧一下,強制轉換運算子將一種類型的值轉換為括號內定義的類型。
3.1.原始資料類型
要將值從一種基本類型轉換為另一種基本類型,我們需要對基本資料類型執行加寬或縮小。
此外,要轉換支援更大範圍數字的類型的值,我們不需要執行任何額外的操作:
int x = 1;
long y = x;
然而,為了使值適合具有較小數值範圍的類型,我們需要使用明確類型轉換:
int x = 1;
byte y = (byte) x;
這裡要記住的一件事是,如果數字太大而無法適應新類型,則可能會發生資料外溢。
3.2.包裝類
將原始資料類型轉換為與原始類型不相關的包裝類別的一種方法是使用強制轉換運算子並採用 Java 自動裝箱功能:
int x = 1;
Long y = (long) x;
在這裡,我們首先將int
值轉換為long
值,然後讓 Java 使用自動裝箱將long
類型轉換為Long
類型。
4. 常數表達式
現在我們已經討論了基礎知識,讓我們更深入地了解 Java 如何處理文字值和原始資料類型的轉換。
我們通常使用術語“常數”來描述編譯後不會更改的值。在類別級別,我們使用static
和final
關鍵字定義它們。
然而,除了類別常數之外,Java 還識別可以在編譯時計算的表達式。這些表達式稱為常數表達式。
根據Java 語言規格(JLS),文字原始值和原始資料類型的轉換都被視為常數表達式。
因此,Java 以相同的方式處理long
值的字面表示形式和int
資料型別明確轉換為long
的方式。
5. 1L
與(long) 1
的比較
最後,讓我們看看long
類型的字面表示與將int
值轉換為long
有何不同。
首先,從性能角度來看,這兩種表達方式沒有差別。它們都被視為常數並在編譯時進行評估。
此外,我們可以編譯這兩個語句並使用 javap 等工具來比較它們的字節碼結果。我們會發現它們是相同的。它們都使用lconst_1
將long
常數壓入堆疊。
其次,使用字面量表示可以增加程式碼的可讀性。
最後,當我們使用文字定義常數表達式時,該值將始終是long
類型。但是,當我們使用強制轉換運算子時,我們強制轉換的數字是int
型別。
因此,以下程式碼將無法編譯:
Long x = (long) 123_456_789_101;
儘管我們將值儲存為Long
資料類型,但數字 123_456_789_101 屬於int
類型。該程式碼無效,因為數字超出了整數範圍。
另一方面,文字表示可以成功編譯:
Long x = 123_456_789_101L;
六,結論
在本文中,我們了解了使用文字表示定義long
值和將int
值轉換為long
之間的差異。
綜上所述,從Java的角度來看,它們都是常數表達式。換句話說,在這兩種情況下,實際值都可以在編譯時決定。然而,使用數字的文字表示有一些好處,例如增加可讀性和防止可能的資料溢出。