使用 Long.parseLong(String s) - 推荐
这是最直接、最常用的方法,它会尝试将给定的 String 参数解析为 long 类型的有符号十进制数。

方法签名
public static long parseLong(String s) throws NumberFormatException
特点
- 返回值:
long原始类型。 - 异常:
String不是有效的数字格式,会抛出NumberFormatException。
示例代码
public class StringToLongExample {
public static void main(String[] args) {
String str1 = "123456789";
String str2 = "-987654321";
String str3 = "1234567890123456789"; // 超过 int 范围,但在 long 范围内
String str4 = "abc"; // 无效数字
String str5 = ""; // 空字符串
String str6 = " 123 "; // 包含前后空格
try {
// 转换有效的数字字符串
long num1 = Long.parseLong(str1);
System.out.println("字符串 '" + str1 + "' 转换为 long: " + num1);
long num2 = Long.parseLong(str2);
System.out.println("字符串 '" + str2 + "' 转换为 long: " + num2);
long num3 = Long.parseLong(str3);
System.out.println("字符串 '" + str3 + "' 转换为 long: " + num3);
// 自动去除前后空格
long num6 = Long.parseLong(str6);
System.out.println("字符串 '" + str6 + "' 转换为 long: " + num6);
// 转换无效的数字字符串
long num4 = Long.parseLong(str4); // 这里会抛出异常
} catch (NumberFormatException e) {
System.err.println("错误: 字符串 '" + str4 + "' 不是有效的 long 格式。");
e.printStackTrace();
}
try {
long num5 = Long.parseLong(str5); // 这里会抛出异常
} catch (NumberFormatException e) {
System.err.println("错误: 字符串 '" + str5 + "' 不能为空。");
e.printStackTrace();
}
}
}
输出结果
字符串 '123456789' 转换为 long: 123456789
字符串 '-987654321' 转换为 long: -987654321
字符串 '1234567890123456789' 转换为 long: 1234567890237695481
字符串 ' 123 ' 转换为 long: 123
错误: 字符串 'abc' 不是有效的 long 格式。
java.lang.NumberFormatException: For input string: "abc"
at java.base/java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
at java.base/java.lang.Long.parseLong(Long.java:702)
at java.base/java.lang.Long.parseLong(Long.java:864)
at StringToLongExample.main(StringToLongExample.java:22)
错误: 字符串 '' 不能为空。
java.lang.NumberFormatException: For input string: ""
at java.base/java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
at java.base/java.lang.Long.parseLong(Long.java:702)
at java.base/java.lang.Long.parseLong(Long.java:864)
at StringToLongExample.main(StringToLongExample.java:31)
使用 Long.valueOf(String s) - 返回包装类
Long.valueOf() 方法也会将 String 解析为 long,但它返回的是一个 Long 对象(long 的包装类)。
方法签名
public static Long valueOf(String s) throws NumberFormatException
特点
- 返回值:
Long对象。 - 异常:同样,
String无效,会抛出NumberFormatException。
何时使用?
当你需要一个 Long 对象而不是原始 long 类型时使用,当这个值需要被放入一个 List<Long> 或其他集合中时,Java 的自动装箱机制会自动处理 long 和 Long 之间的转换,所以很多时候两者可以互换。
示例代码
public class StringToLongWrapperExample {
public static void main(String[] args) {
String str = "987654321";
// 使用 valueOf() 获取 Long 对象
Long longObject = Long.valueOf(str);
System.out.println("转换结果 (Long 对象): " + longObject);
System.out.println("对象类型: " + longObject.getClass().getName());
// 你可以轻松地将其转换回原始类型
long primitiveLong = longObject; // 自动拆箱
System.out.println("转换结果 (原始 long): " + primitiveLong);
}
}
输出结果
转换结果 (Long 对象): 987654321
对象类型: java.lang.Long
转换结果 (原始 long): 987654321
其他重载方法(指定进制)
Long.parseLong 和 Long.valueOf 都有重载版本,允许你指定数字的基数(进制)。
方法签名
public static long parseLong(String s, int radix) throws NumberFormatException public static Long valueOf(String s, int radix) throws NumberFormatException
s: 要解析的字符串。radix: 解析时使用的基数(进制),范围在Character.MIN_RADIX(2) 到Character.MAX_RADIX(36) 之间,如果基数为 10,可以省略。
示例代码(解析二进制、十六进制字符串)
public class StringToLongRadixExample {
public static void main(String[] args) {
// 二进制字符串
String binaryStr = "101010"; // 表示十进制的 42
long fromBinary = Long.parseLong(binaryStr, 2);
System.out.println("二进制 '" + binaryStr + "' 转换为十进制: " + fromBinary);
// 十六进制字符串
String hexStr = "FF"; // 表示十进制的 255
long fromHex = Long.parseLong(hexStr, 16);
System.out.println("十六进制 '" + hexStr + "' 转换为十进制: " + fromHex);
// 八进制字符串
String octalStr = "77"; // 表示十进制的 63
long fromOctal = Long.parseLong(octalStr, 8);
System.out.println("八进制 '" + octalStr + "' 转换为十进制: " + fromOctal);
}
}
输出结果
二进制 '101010' 转换为十进制: 42
十六进制 'FF' 转换为十进制: 255
八进制 '77' 转换为十进制: 63
总结与最佳实践
| 方法 | 返回类型 | 是否抛出异常 | 优点 | 缺点 | 推荐场景 |
|---|---|---|---|---|---|
Long.parseLong() |
long (原始类型) |
是 | 直接返回原始类型,效率高 | 需要手动处理异常 | 大多数情况下的首选,当你需要一个 long 值进行计算时。 |
Long.valueOf() |
Long (包装类) |
是 | 返回对象,方便用于泛型集合 | 涉及对象创建,开销略大 | 当你需要一个 Long 对象时,例如存入 List 或作为 Map 的键。 |
Long.parseLong(s, radix) |
long (原始类型) |
是 | 支持任意进制(2-36) | 需要指定进制参数 | 当需要解析非十进制字符串时(如二进制、十六进制)。 |
最佳实践
- 始终使用
try-catch块:因为你无法保证输入的String一定是有效的数字,直接调用而不处理异常可能会导致程序崩溃。 - 首选
Long.parseLong():除非你有特殊理由需要一个Long对象,否则parseLong()是更高效、更直接的选择。 - 处理空格:
Long.parseLong()会自动忽略字符串前后的空格,但如果字符串中间有空格或包含其他非数字字符(除了符号 或 ),则会抛出异常。 - 考虑数值范围:确保字符串表示的数值在
Long的范围内(-9,223,372,036,854,775,808 到 9,223,372,036,854,775,807),否则会溢出,导致一个不正确的负数,Java 8 之后,可以使用Long.parseUnsignedLong()来处理无符号的过大数字。

