杰瑞科技汇

Java long转long有啥区别?

  • long:是 Java 的基本数据类型 (primitive type),它不是一个对象,只是一个存储64位整数的值。
  • Long:是 long 对应的包装类 (Wrapper Class),它是一个对象,可以包含一个 long 类型的值,并提供了很多有用的方法(如 parseLong, valueOf 等)。

"Java long 转 long" 这个问题,通常指的是将 Long 对象转换成 long 基本类型,这个过程在 Java 中称为拆箱 (Unboxing)

Java long转long有啥区别?-图1
(图片来源网络,侵删)

下面我将详细解释几种常见的转换场景和方法。


Long 对象转 long 基本类型 (最常见)

这是最直接的情况,你有一个 Long 类型的变量,想得到它内部的 long 值。

方法 1:自动拆箱 (推荐)

从 Java 5 开始,Java 引入了自动装箱和拆箱机制,编译器会自动帮你完成转换,非常方便。

Long longObject = 12345L; // 自动装箱
long primitiveLong = longObject; // 自动拆箱
System.out.println("原始 Long 对象: " + longObject);
System.out.println("转换后的 long 值: " + primitiveLong);
System.out.println("类型: " + ((Object)primitiveLong).getClass().getName()); // 输出 java.lang.long

方法 2:使用 .longValue() 方法 (显式拆箱)

这是最传统、最明确的方式,你可以直接在 Long 对象上调用 .longValue() 方法来获取其 long 值,这种方式在代码中意图更清晰。

Java long转long有啥区别?-图2
(图片来源网络,侵删)
Long longObject = 98765L;
long primitiveLong = longObject.longValue();
System.out.println("原始 Long 对象: " + longObject);
System.out.println("转换后的 long 值: " + primitiveLong);

⚠️ 重要:处理 null

这是最需要注意的地方! Long 对象是 null,直接进行自动拆箱或调用 .longValue() 都会抛出 NullPointerException

Long nullLongObject = null;
// 错误示范:会抛出 NullPointerException
// long primitiveLong = nullLongObject; 
// 错误示范:同样会抛出 NullPointerException
// long primitiveLong = nullLongObject.longValue(); 

如何安全地处理 null

  1. 使用 Objects.requireNonNull (Java 7+) 如果你的逻辑认为 null 是一个非法值,应该尽早抛出异常。

    Long nullLongObject = null;
    long primitiveLong = java.util.Objects.requireNonNull(nullLongObject).longValue();
    // 这行代码会立即抛出 NullPointerException
  2. 使用 Optional (Java 8+) (推荐) Optional 是处理可能为 null 的值的现代、安全的方式。

    Long nullableLongObject = null;
    // 创建一个 Optional 对象
    Optional<Long> optionalLong = Optional.ofNullable(nullableLongObject);
    // 如果存在值则转换,否则返回一个默认值 (0L)
    long primitiveLong = optionalLong.orElse(0L);
    System.out.println("转换后的 long 值: " + primitiveLong); // 输出 0
    // 或者,如果不存在值,可以抛出一个自定义异常
    // long value = optionalLong.orElseThrow(() -> new IllegalArgumentException("Long value cannot be null"));
  3. 使用三元运算符 一种简单但略显笨拙的旧方法。

    Long nullableLongObject = null;
    long primitiveLong = (nullableLongObject == null) ? 0L : nullableLongObject;
    System.out.println("转换后的 long 值: " + primitiveLong); // 输出 0

Stringlong

虽然你的问题不是这个,但它与 Long 转换密切相关,非常常见,你需要先将 String 转成 Long 对象,然后再拆箱成 long

String numberString = "123456789";
// 1. 将 String 转换为 Long 对象 (自动装箱)
Long longObject = Long.parseLong(numberString);
// 2. 将 Long 对象转换为 long 基本类型 (自动拆箱)
long primitiveLong = longObject;
// 或者写成一行 (链式调用)
long primitiveLongFromStr = Long.parseLong(numberString);
System.out.println("从 String 转换的 long 值: " + primitiveLongFromStr);

同样需要注意 null 或非法格式字符串的情况:

String invalidString = "not a number";
try {
    long value = Long.parseLong(invalidString);
} catch (NumberFormatException e) {
    System.out.println("捕获到格式异常: " + e.getMessage());
}
String nullString = null;
try {
    // Long.parseLong(null) 也会抛出 NumberFormatException
    long value = Long.parseLong(nullString);
} catch (NumberFormatException e) {
    System.out.println("捕获到格式异常: " + e.getMessage());
}

longLong (装箱)

这是反向操作,将基本类型 long 转换为包装类 Long 对象。

方法 1:自动装箱 (推荐)

long primitiveLong = 55555L;
Long longObject = primitiveLong; // 自动装箱

方法 2:使用 Long.valueOf() (显式装箱)

long primitiveLong = 55555L;
Long longObject = Long.valueOf(primitiveLong);

Long.valueOf() 在某些情况下可能比 new Long() 性能更好,因为它可以利用 Java 的缓存机制(对于 -128127 之间的值)。


转换方向 推荐方法 示例 注意事项
Longlong 自动拆箱 long l = myLongObj; NullPointerException myLongObjnull
.longValue() long l = myLongObj.longValue(); 同上,NullPointerException
Stringlong Long.parseLong() long l = Long.parseLong("123"); NumberFormatException 如果字符串格式不正确或为 null
longLong 自动装箱 Long l = 123L; 无风险。
Long.valueOf() Long l = Long.valueOf(123L); 无风险。

核心要点:

  1. Long 是对象,long 是基本类型。
  2. Longlong 的关键是“拆箱”。
  3. 处理 Long 时,永远要考虑它是否为 null,否则极易导致 NullPointerException
  4. 优先使用 Java 5+ 的自动装箱/拆箱,它让代码更简洁,但在处理 null 时,要格外小心,或使用 Optional 等现代工具来保证安全。
分享:
扫描分享到社交APP
上一篇
下一篇