一、方法定义

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(超出缓存范围,新对象)

四、使用技巧

  1. 优先使用 valueOf() 而非 new Long()
    new Long() 每次都创建新对象,而 valueOf() 利用缓存,更高效。

  2. 处理用户输入时使用 try-catch
    字符串解析可能失败,应捕获 NumberFormatException

  3. 利用进制参数解析不同格式数据
    支持 2 到 36 进制,适用于解析二进制、八进制、十六进制等。

  4. 自动装箱替代写法
    Long num = 100L; 实际上编译器会自动调用 Long.valueOf(100)


五、常见错误

  1. 空字符串或 null 值
Long.valueOf(null);        // 抛出 NullPointerException
Long.valueOf("");          // 抛出 NumberFormatException
  1. 非法字符
Long.valueOf("abc");       // NumberFormatException
Long.valueOf("12a");       // NumberFormatException
  1. 超出 long 范围
Long.valueOf("999999999999999999999"); // NumberFormatException(溢出)
  1. 进制不匹配
Long.valueOf("FF", 10);    // NumberFormatException(FF 不是十进制)

六、注意事项

  • 大小写不敏感Long.valueOf("ff", 16) 合法。
  • 允许前导空格和正负号
Long.valueOf("  +123  "); // 正确,结果为 123
Long.valueOf("  -456  "); // 正确,结果为 -456
  • 不能处理浮点字符串
Long.valueOf("123.45"); // 抛出 NumberFormatException
  • 性能敏感场景慎用字符串解析:频繁解析大字符串影响性能。

七、最佳实践

推荐做法:

  1. 始终使用 Long.valueOf() 替代构造函数
    避免 new Long(100),使用 Long.valueOf(100) 或直接赋值 Long num = 100L;

  2. 输入校验 + 异常处理

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;
    }
}
  1. 缓存利用意识
    在频繁使用小数值(如状态码、ID)时,利用缓存减少 GC 压力。

  2. 使用 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 代码。