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

时间:2019-05-28 13:46:06

标签: java types

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

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

那么考虑到内存消耗和时间复杂性,最好是初始化一个变量?

Long a = Long.valueOf(0);

Long b = 0L;

2 个答案:

答案 0 :(得分:13)

没事。

Long b = 0L;

将经历autoboxing。编译器将其替换为:

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
  

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

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

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

答案 1 :(得分:2)

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

另外..

担心诸如此类的时间复杂性有点愚蠢:两个表达式都是恒定时间。您通常仅在处理数据集合而不是单个数据时谈论时间复杂性。

关于内存消耗,它们不使用您所说的64位。这是原始的long类型,通常使用64位,但是Long(包装类型)比原始类型使用更多的内存,因为它需要该内存来存储对象相关的东西。