我想知道使用Long.valueOf(0);
或0L
的区别。他们是一样的吗?
我知道两者都是Long types,因此在Java 8中它们的内存消耗长为64位。
那么考虑到内存消耗和时间复杂性,最好是初始化一个变量?
Long a = Long.valueOf(0);
或
Long b = 0L;
答案 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
(包装类型)比原始类型使用更多的内存,因为它需要该内存来存储对象相关的东西。