一、方法定义
Long.valueOf()
是 Java 中 java.lang.Long
类的静态方法,用于将不同类型的值(如字符串、基本类型)转换为 Long
对象(包装类型)。
方法重载定义:
// 1. 从字符串解析为 Long 对象
public static Long valueOf(String s) throws NumberFormatException
// 2. 从字符串按指定进制解析为 Long 对象
public static Long valueOf(String s, int radix) throws NumberFormatException
// 3. 从 long 基本类型转换为 Long 对象(自动装箱)
public static Long valueOf(long l)
二、功能说明
- 字符串转 Long 对象:解析字符串表示的十进制或指定进制的整数。
- long 基本类型转 Long 对象:实现基本类型到包装类的转换(装箱)。
- 内部缓存机制:
Long.valueOf(long)
对于值在 -128 到 127 之间的long
值,会返回缓存对象,避免重复创建,提升性能。 - 异常处理:解析失败时抛出
NumberFormatException
。
三、示例代码
示例 1:字符串转 Long
String str = "12345";
Long num = Long.valueOf(str);
System.out.println(num); // 输出:12345
示例 2:按进制解析(如十六进制)
String hex = "FF";
Long num = Long.valueOf(hex, 16);
System.out.println(num); // 输出:255
示例 3:long 基本类型转 Long 对象
long primitive = 100L;
Long wrapper = Long.valueOf(primitive);
System.out.println(wrapper); // 输出:100
示例 4:使用缓存(性能优化体现)
Long a = Long.valueOf(100);
Long b = Long.valueOf(100);
System.out.println(a == b); // true(缓存对象,引用相同)
Long c = Long.valueOf(200);
Long d = Long.valueOf(200);
System.out.println(c == d); // false(超出缓存范围,新对象)
四、使用技巧
优先使用
valueOf()
而非new Long()
new Long()
每次都创建新对象,而valueOf()
利用缓存,更高效。处理用户输入时使用
try-catch
字符串解析可能失败,应捕获NumberFormatException
。利用进制参数解析不同格式数据
支持 2 到 36 进制,适用于解析二进制、八进制、十六进制等。自动装箱替代写法
Long num = 100L;
实际上编译器会自动调用Long.valueOf(100)
。
五、常见错误
- 空字符串或 null 值
Long.valueOf(null); // 抛出 NullPointerException
Long.valueOf(""); // 抛出 NumberFormatException
- 非法字符
Long.valueOf("abc"); // NumberFormatException
Long.valueOf("12a"); // NumberFormatException
- 超出 long 范围
Long.valueOf("999999999999999999999"); // NumberFormatException(溢出)
- 进制不匹配
Long.valueOf("FF", 10); // NumberFormatException(FF 不是十进制)
六、注意事项
- 大小写不敏感:
Long.valueOf("ff", 16)
合法。 - 允许前导空格和正负号:
Long.valueOf(" +123 "); // 正确,结果为 123
Long.valueOf(" -456 "); // 正确,结果为 -456
- 不能处理浮点字符串:
Long.valueOf("123.45"); // 抛出 NumberFormatException
- 性能敏感场景慎用字符串解析:频繁解析大字符串影响性能。
七、最佳实践
✅ 推荐做法:
始终使用
Long.valueOf()
替代构造函数
避免new Long(100)
,使用Long.valueOf(100)
或直接赋值Long num = 100L;
。输入校验 + 异常处理
public static Long parseSafe(String str) {
if (str == null || str.trim().isEmpty()) {
return null;
}
try {
return Long.valueOf(str.trim());
} catch (NumberFormatException e) {
System.err.println("Invalid long string: " + str);
return null;
}
}
缓存利用意识
在频繁使用小数值(如状态码、ID)时,利用缓存减少 GC 压力。使用
parseLong()
获取基本类型
如果不需要对象,直接使用Long.parseLong(String)
更高效(返回long
,无装箱开销)。
八、性能优化
场景 | 推荐方法 | 原因 |
---|---|---|
字符串转 long 值 | Long.parseLong(str) |
无对象创建,性能更高 |
需要 Long 对象 | Long.valueOf(long) |
利用缓存,避免重复创建 |
小数值频繁使用 | Long.valueOf(100) |
-128~127 范围内共享对象 |
大数值或不确定 | 仍用 valueOf() |
安全且语义清晰 |
⚡ 性能对比(典型场景):
new Long(100)
:每次新建对象 → 慢Long.valueOf(100)
:缓存复用 → 快Long.parseLong("100")
:无对象 → 最快
九、总结
Long.valueOf()
是 Java 中将字符串或 long
基本类型转换为 Long
包装对象的核心方法。掌握其使用,对日常开发至关重要。
✅ 核心要点:
项目 | 说明 |
---|---|
主要用途 | 字符串/基本类型 → Long 对象 |
关键优势 | 支持缓存(-128~127),性能优于 new Long() |
异常处理 | 字符串非法时抛 NumberFormatException |
推荐替代 | Long.parseLong() 用于获取 long 值 |
最佳实践 | 优先使用 valueOf() ,避免构造函数,做好异常处理 |
🚀 实践口诀:
“小数值用 valueOf,大数值用 parseLong;字符串要 try-catch,null 空格要提防。”
通过理解其缓存机制、正确处理异常、选择合适方法,你可以在性能与安全性之间取得最佳平衡,写出高效、健壮的 Java 代码。