考虑以下条件:
if (isCustom() == new Long(1)) {
System.out.println("ok 1");
}
if (1L == new Long(1)) {
System.out.println("ok 2");
}
对于以下定义:
static Long isCustom() {
return 1L;
}
输出是:
ok 2
但是
static long isCustom() {
return 1L;
}
输出是:
ok 1
ok 2
我不明白这一点!
答案 0 :(得分:4)
在前一种情况下,您将返回一个自动装箱的对象。
在后一种情况下,您将返回一个较长的值。
因为后者只是一个值,所以代码正在评估值 1L的等价性和[值为1L的对象的自动装箱值。
在前一种情况下,代码正在评估两个对象的标识的等效性,它们都具有值1L。
答案 1 :(得分:3)
在第一种情况下,您有两个Long
个对象,并且您正在检查它们是否是同一个对象(因为您使用的是==
,而不是.equals
)。它们不是同一个对象。
在第二种情况下,您将long
值与Long
对象进行比较,并将Long
取消装箱到long
值。 ==
适用于long
值。
答案 2 :(得分:2)
在第一个示例中,您的isCustom()
方法返回了Long
- 1L
被装箱到Long
个对象。当您在其上使用==
运算符时,Java使用引用相等性。这两个Long
个对象,即使它们代表相同的long
- 1L
- 也是不同的对象,因此条件为false
且"ok 1"
不是打印。请注意certain Long
s are not required to be cached like certain Integer
s。
请注意,与
Integer
类中的相应方法不同,此方法不需要 来缓存特定范围内的值。
在第二个示例中,您的isCustom()
方法返回long
- 此处未执行任何装箱。然后,==
运算符会将Long(1)
重新打包为1L
,以将其与long
返回的isCustom()
进行比较,条件为true
,{ {1}}已打印。
答案 3 :(得分:1)
这与java原语和盒装类型有关。原始版本long
由java(“boxed”)自动转换为对象版本 - Long
,反之亦然“unboxing”。
在上面的第一个场景中,您将返回一个盒装基元Long
(即一个对象),并进行比较以查看该对象是否与您刚刚创建的新对象具有相同的引用。换句话说,您要将Long
与另一个Long
进行比较。由于您创建了new Long()
,因此对象不同,因此if语句返回false并且不打印“ok 1”。
在第二种情况下,您将返回基元类型,并将基元与对象进行比较 - 即long
与Long
。在这种情况下,对象(Long
)被“取消装箱”到基本类型,并且在将两个基本类型与==
进行比较时,您不是在检查对象引用,而是在检查看看它们是否具有相同的值。
第二种情况(“ok 2”)始终将原始long
与对象Long
进行比较,因此与上述第二种情况相同的原因总是如此。