在这段代码中,(story * 2) == tail
正在获取True
和false
distance + 1 != tail
。
==
检查引用,因为Long是不可变的,对于两个不同的对象它将为false,
此处值story * 2
在引用tail
时相等,但它们是两个不同的对象,而不是用于汇集的编译时常量。
public class Test2
{
public static void main(String [] args) {
Long tail = 2000L;
Long distance = 1999L;
Long story = 1000L;
System.out.println(tail > distance);
System.out.println((story * 2) == tail);
if((tail > distance) ^ ((story * 2) == tail))
System.out.print("1");
System.out.println(distance + 1 != tail);
System.out.println((story * 2) == distance);
if((distance + 1 != tail) ^ ((story * 2) == distance))
System.out.print("2");
}
我查了here,但没有解释。
答案 0 :(得分:7)
当您对包裹的基元(例如Long
)执行算术运算时,它们会自动拆箱为原始基元(例如long
)。
请考虑以下事项:
(story * 2) == tail
首先,story
long
为long
,并乘以2。要将结果Long
与右侧的public static void main(String[] args) {
Long tail = 2000L;
Long story = 1000L;
System.out.println((story * 2) == tail); // prints true
System.out.println(new Long(story * 2) == tail); // prints false
}
进行比较,后者也会自动取消装箱。
这里没有比较参考文献。
以下代码演示了这一点:
{{1}}
答案 1 :(得分:4)
我相信这是由于自动取消装箱(故事* 2)导致原始值2000L。并且当你将它与也保持2000L值的尾部进行比较时,结果是正确的。当一个项目是原始的时,请检查x == y规则。
答案 2 :(得分:0)
只能对基元执行乘法,加法和其他操作......
当您执行这些操作时,所有盒装基元将被取消装箱并视为基本类型。
因此,在您的示例中,==检查长对等而不是对象相等。