1. 概述
本文将探讨在Java中将String
转换为基本类型long
或包装类Long
的多种方法。假设我们有一个表示数值的字符串,其值超出了int
的范围(例如Integer.MAX_VALUE + 1
,即2,147,483,648)。
2. 使用Long构造函数
直接使用Long
的构造函数是最简单粗暴的方式:
Long l = new Long("2147483648");
这会创建一个新的Long
对象,可通过longValue()
方法获取基本类型long
。利用自动拆箱特性,还能直接赋值给基本类型:
long l = new Long("2147483648");
⚠️ 踩坑提醒:自Java 9起,该构造函数已被废弃,推荐改用静态工厂方法valueOf()
或parseLong()
。
3. 使用Long.valueOf()方法
当需要获取Long
对象时,推荐使用静态工厂方法valueOf()
:
Long l = Long.valueOf("2147483648");
✅ 优势:该方法会缓存常用值(如-128到127),减少内存开销,性能优于构造函数。
4. 使用Long.parseLong()方法
若目标类型是基本long
,parseLong()
是最佳选择:
long l = Long.parseLong("2147483648");
✅ 优势:直接返回基本类型,避免创建不必要的Long
对象,效率最高。
5. 使用Long.decode()方法
当字符串采用十六进制、八进制等特殊格式时,decode()
方法能自动解析:
Long l = Long.decode("0x80000000"); // 十六进制
Long l2 = Long.decode("010"); // 八进制
⚠️ 注意:该方法会自动识别前缀(0x
/#
表示十六进制,0
表示八进制),需警惕字符串前导零导致的意外解析。
6. 使用Apache Commons的NumberUtils.createLong()
添加Maven依赖:
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.14.0</version>
</dependency>
使用NumberUtils.createLong()
转换:
Long l = NumberUtils.createLong("0x80000000");
✅ 特点:底层调用Long.decode()
,但增加对null
输入的处理(返回null
而非抛异常)。
7. 使用Long.parseUnsignedLong()方法
当字符串表示无符号长整型(范围0到18,446,744,073,709,551,615)时:
long l = Long.parseUnsignedLong("9223372036854775808");
❌ 限制:若字符串首字符是负号(-
),会直接抛出NumberFormatException
。
8. 使用Google Guava的Longs.tryParse()
添加Maven依赖:
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>33.0.0-jre</version>
</dependency>
使用Longs.tryParse()
安全转换:
Long l = Longs.tryParse("2147483648");
✅ 核心优势:解析失败时返回null
而非抛异常,适合容错场景:
@Test
void givenInvalidString_whenUsingGuavaLongs_thenObtainNull() {
assertThat(Longs.tryParse("Invalid String")).isNull();
}
9. 总结
场景 | 推荐方法 | 特点 |
---|---|---|
获取基本long |
parseLong() |
最高效,无对象创建 |
获取Long 对象 |
valueOf() |
缓存优化,内存友好 |
特殊进制字符串 | decode() |
自动识别进制前缀 |
无符号大数 | parseUnsignedLong() |
处理超大正数 |
容错处理 | Guava tryParse() |
失败返回null |
null 安全 |
Apache createLong() |
兼容null 输入 |
本文所有示例代码可在GitHub仓库获取。