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

8
我想知道使用Long.valueOf(0);0L之间的区别。它们是一样的吗?
我了解到它们都是Long类型,因此在Java 8中它们的内存消耗为64位长。
考虑内存消耗和时间复杂度,哪种方式更好地初始化变量? Long a = Long.valueOf(0); 或者 Long b = 0L;

3
我明白两者都是Long类型 - Long#valueOf 返回一个Long类型的对象,而0L是一个基本类型的long - Jacob G.
1
Long::value 将会给你一个 Object,而 0L 则是一个原始类型(你可以通过 Long b = OL; 进行装箱 - 在内部仍然使用 Long::valueOf)。 - Eugene
1
顺便提一下,在范围[-128,127]内,Long.valueOf(x)将返回相同的实例,而其他所有原始类型都会导致创建一个新实例,也就是说每次都会得到一个new Long(x) - Thomas
1
@Thomas,很有趣...我在哪里可以读到更多相关信息? - lealceldeiro
2
@lealceldeiro,LongIntegerShortByteCharactervalueOf()方法的JavaDoc和源代码可以告诉你一些信息。 :) 这里还可以找到更多信息:https://dev59.com/h2Ei5IYBdhLWcg3w2PSB - Thomas
显示剩余2条评论
2个回答

16

无内容。

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

那么,考虑到内存消耗和时间复杂度,如何更好地初始化变量?

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

相反,应该关注实际上更重要的内容,即可读性:使用你(和其他人)一眼就能理解的那种方式。


5
正如其他人指出的那样,Long l = Long.valueOf(0)Long l = 0L将编译为相同的字节码,唯一的区别在于风格和可读性。
此外...
像这样担心时间复杂度有点傻:两个表达式都是常量时间。您通常只在处理数据集合时才讨论时间复杂度,而不仅仅是单个数据。
至于内存消耗,它们并没有使用您所说的64位;通常使用64位的是原始类型long,但包装器类型Long使用比原始类型更多的内存,因为它需要该内存用于对象相关的事情。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接