直接将原始值分配给Wrapper类型和使用valueOf API有什么区别?即。
Long val = 91l;
和
Long val = Long.valueOf(91l);
这个问题来自于我多年来一直在捣乱的错误。到目前为止,我还没有能够成功地重新创建它并随机出现。我有一些对象是作为处理一些数据的一部分生成的,这些对象有很多字段,其中一些是Long(Wrapper)类型我确信值被分配给所有变量,但在某些情况下它们只是即使没有任何理由,也会出现NULL。
与此问题相关的方式是,这些Long属性的Set方法实际上采用long(primitive)类型的参数,并使用第一种方法进行分配。我不确定这是否会导致它。我已经使用第二种方法修改了我的代码,并等待一些好的测试完成,然后才开始修复它。
我很想知道我提到的上述两种方法是否存在任何理论差异。 (我通常在大多数时间使用第一个。)
答案 0 :(得分:8)
这两行将编译为相同的字节码(至少在我见过的所有编译器中)。目前还不清楚你的问题在哪里,但它并不存在。 (这不是由规范如何创建的,但结果保证是一个对象,使longValue()
方法将返回原始原始值。)
例如,反编译此方法:
static void foo() {
Long val1 = 91L;
Long val2 = Long.valueOf(91L);
}
结束于:
static void foo();
Code:
0: ldc2_w #2; //long 91l
3: invokestatic #4; //Method java/lang/Long.valueOf:(J)Ljava/lang/Long;
6: astore_0
7: ldc2_w #2; //long 91l
10: invokestatic #4; //Method java/lang/Long.valueOf:(J)Ljava/lang/Long;
13: astore_1
14: return
}
(简而言之,我建议您在源代码中使用L
而不是l
作为后缀 - l
看起来非常像1
取决于你的字体。)