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

Ale*_*sco 5 java types

我想知道使用Long.valueOf(0);或的区别0L。他们是一样的吗?

我知道这两个都是Long类型,因此在Java 8中它们的内存消耗为64位长。

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

Long a = Long.valueOf(0);

要么

Long b = 0L;

And*_*ner 13

没有。

Long b = 0L;
Run Code Online (Sandbox Code Playgroud)

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

Long b = Long.valueOf(0L);
Run Code Online (Sandbox Code Playgroud)

如果您反编译类(例如使用),则可以看到此信息javap

void a() {
  Long a = Long.valueOf(0);
}

void b() {
  Long b = 0L;
}
Run Code Online (Sandbox Code Playgroud)

反编译为:

  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
Run Code Online (Sandbox Code Playgroud)

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

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

相反,请专注于实际重要的内容,即可读性:使用您(和其他人)一眼就会发现最容易理解的内容。


xtr*_*tic 5

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

此外..

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

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