为了账号安全,请及时绑定邮箱和手机立即绑定

Java 中的 Long.valueOf(0) 和 0L 有什么区别?

Java 中的 Long.valueOf(0) 和 0L 有什么区别?

BIG阳 2022-12-21 14:34:31
我想知道使用Long.valueOf(0);or之间的区别0L。它们相同吗?我知道两者都是Long 类型,因此它们在 Java 8 中的内存消耗为 64 位长。那么在考虑内存消耗和时间复杂度的情况下,如何初始化一个变量更好呢?Long a = Long.valueOf(0);要么Long b = 0L;
查看完整描述

2 回答

?
慕侠2389804

TA贡献1719条经验 获得超6个赞

没有什么。


Long b = 0L;

将进行自动装箱。编译器将其替换为:


Long b = Long.valueOf(0L);

如果你反编译你的类,你可以看到这一点,例如使用javap.


void a() {

  Long a = Long.valueOf(0);

}


void b() {

  Long b = 0L;

}

反编译为:


  void a();

    Code:

       0: lconst_0

       1: invokestatic  #2                  // Method java/lang/Long.valueOf:(J)Ljava/lang/Long;

       4: astore_1

       5: return


  void b();

    Code:

       0: lconst_0

       1: invokestatic  #2                  // Method java/lang/Long.valueOf:(J)Ljava/lang/Long;

       4: astore_1

       5: return

那么在考虑内存消耗和时间复杂度的情况下,如何更好地初始化一个变量呢?


因为它们在语义上是相同的,所以内存消耗和时间复杂度也相同。


相反,专注于真正重要的东西,即可读性:使用你(和其他人)一目了然会发现最容易理解的。


查看完整回答
反对 回复 2022-12-21
?
catspeake

TA贡献1111条经验 获得超0个赞

正如其他人指出的那样,Long l = Long.valueOf(0)Long l = 0L编译为相同的字节码,唯一的区别是风格和可读性。

此外..

为这样的事情担心时间复杂度有点傻:两个表达式都是常数时间。在处理数据集合而不仅仅是单个数据时,您通常只谈论时间复杂度。

至于内存消耗,他们没有像你说的那样使用64位;long它是通常使用 64 位的原始类型,但Long(包装类型)使用比原始类型更多的内存,因为它需要该内存用于与对象相关的内容。


查看完整回答
反对 回复 2022-12-21
  • 2 回答
  • 0 关注
  • 537 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信