我想知道使用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)
那么考虑内存消耗和时间复杂度,如何更好地初始化变量呢?
因为它们在语义上是相同的,所以内存消耗和时间复杂度也相同。
相反,请专注于实际重要的内容,即可读性:使用您(和其他人)一眼就会发现最容易理解的内容。
正如其他人指出的那样,Long l = Long.valueOf(0)并将Long l = 0L编译为相同的字节码,唯一的区别是样式和可读性。
此外..
担心这样的事情的时间复杂度有点愚蠢:两个表达式都是常数时间。通常,您仅在处理数据集合而不是单个数据时才讨论时间复杂度。
至于内存消耗,他们并没有像你说的那样使用64位;long它是通常使用 64 位的基本类型,但Long(包装类型)比基本类型使用更多的内存,因为它需要该内存来存储与对象相关的内容。