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()方法

若目标类型是基本longparseLong()是最佳选择:

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仓库获取。


原始标题:Convert String to long or Long in Java | Baeldung