在 Java 中將 String 轉換為 long 或 Long
1. 概述
在本教程中,我們將探討如何將String
轉換為long
基元或Long
物件。
假設我們有一個String
,其值反映的數字正好超出有符號int
的範圍。我們選擇Integer.MAX_VALUE + 1
,即 2,147,483,648。
2. 使用Long
的建構函數
給定我們的String
,我們可以使用重載的Long
建構函數,該構造函數將String
作為參數:
Long l = new Long("2147483648");
這將創建一個新的Long
實例,可以透過呼叫longValue()
方法將其轉換為原始long
實例。
或者,我們可以利用拆箱功能,在一個語句中將Long
物件轉換為其基本等價物:
long l = new Long("2147483648");
然而,從 Java 9 開始,不建議使用此建構函數,而是使用Long
類別的靜態工廠方法valueOf()
或parseLong()
。
3.使用Long.valueOf()
方法
當我們想要從String
中取得Long
物件時,建議使用靜態工廠方法valueOf():
Long l = Long.valueOf("2147483648");
此方法是首選方法,因為它會快取常用的Long
實例以提供更好的效能和記憶體開銷。這與建構函式相反,建構函式每次呼叫時都會建立一個新實例。
4.使用Long.parseLong()
方法
當我們想要回傳一個long
原語時,我們可以使用parseLong()
靜態工廠方法:
long l = Long.parseLong("2147483648");
當我們想要得到一個long
原語時,這種方法比建構子和valueOf()
更受歡迎。這是因為它直接傳回一個long
原語,而不會在轉換過程中建立不必要的Long
物件。
5.使用Long.decode()
方法
如果我們的String
是十六進位形式,我們可以使用靜態工廠方法decode()
將其轉換為Long
物件。
因此,假設我們的String
有一個十六進位表示法:
Long l = Long.decode("0x80000000");
值得注意的是,該方法還支援十進制和八進位表示法。因此,在使用此方法時,我們必須警惕String
中的前導零。
6. 使用 Apache Commons 的NumberUtils.createLong()
方法
要使用Apache Commons Lang 3 ,我們將以下相依性加入pom.xml
中:
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.14.0</version>
</dependency>
靜態工廠方法createLong()
將String
轉換為Long
物件:
Long l = NumberUtils.createLong("0x80000000");
它在底層使用了Long.decode()
,並添加了一個重要的內容 - 如果String
參數為null
,則它會傳回null
。
7.使用Long.parseUnsignedLong()
方法
現在,假設我們有一個String
,它表示超出long
原語有符號範圍的值。我們可以使用parseUnsignedLong()
靜態工廠方法來取得 0 到 18,446,744,073,709,551,615 範圍內的 unsigned long
:
long l = Long.parseUnsignedLong("9223372036854775808");
與我們在本文中探討的其他選項相反,如果String
中的第一個字元是 ASCII 負號,則會引發NumberFormatException
。
8.使用Google Guava的Longs.tryParse()
方法
要使用Google Guava ,我們將以下依賴項新增到pom.xml
中:
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>33.0.0-jre</version>
</dependency>
現在,給定我們的String
我們可以使用tryParse()
將其轉換為Long
物件:
Long l = Longs.tryParse("2147483648");
到目前為止所探索的所有選項在出現不可解析的String
時都會拋出NumberFormatException
。因此,如果我們想避免拋出此異常的可能性,我們可以使用傳回null
靜態工廠方法tryParse()
來代替:
@Test
void givenInvalidString_whenUsingGuavaLongs_thenObtainNull() {
assertThat(Longs.tryParse("Invalid String")).isNull();
}
9. 結論
在本文中,我們了解到parseLong()
是取得給定字串的long
原語的首選方法String.
我們也看到valueOf()
是取得給定String
的Long
物件的首選方法。
與往常一樣,本文中使用的程式碼範例可以在 GitHub 上找到。