考虑下面的代码捕捉。
我们使用equals()
比较对象是否有意义?
这两个值都有意义相等但为什么longWrapper.equals(0)
会返回false
?
当我将这两个值与==
运算符进行比较时,它会返回true
。
Long longWrapper = 0L;
long longPrimitive = 0;
System.out.println(longWrapper == 0L); // true
System.out.println(longWrapper == 0); //true
System.out.println(longWrapper == longPrimitive); //true
System.out.println(longWrapper.equals(0L)); //true
System.out.println(longWrapper.equals(0)); //false
System.out.println(longWrapper.equals(longPrimitive)); //true
答案 0 :(得分:16)
longWrapper.equals(0)
会返回false
,因为0
会自动退回到Integer
,而不是Long
。由于这两种类型不同,.equals()
会返回false
。
与此同时,longWrapper == 0
为true
,因为longwrapper
值已取消装箱至0
,0 == 0
未考虑实际原始类型。< / p>
答案 1 :(得分:4)
因为0不是很长 - 它是一个int,包装器不会将整数转换为Long's
答案 2 :(得分:2)
比较0 == 0L
时,您将int
字面值与long
字面值进行比较。 int
获取promoted到long
,然后比较它们的值。由于两者都是零,因此结果为true
。
当您在混音中添加自动装箱时,情况略有不同。基元始终自动装箱到其包装类型。在这里,0
是一个int
文字,自动装箱到java.lang.Integer
包装器实例。由于java.lang.Long
和java.lang.Integer
是不同的类,因此equals
之间必须返回false
。
答案 3 :(得分:2)
System.out.println(0L == 0)
是True
。
所以longWrapper == 0
取消装箱,结果为True
。
在Long.equals
写成 -
781 public boolean More ...equals(Object obj) {
782 if (obj instanceof Long) {
783 return value == ((Long)obj).longValue();
784 }
785 return false;
786 }
所以System.out.println(longWrapper.equals(0));
返回false,因为0将在Integer
中加框,if (obj instanceof Long)
为false。
答案 4 :(得分:1)
这一个:
System.out.println(longWrapper == 0);
与==
进行比较,因此它会将您的Long
取消装箱,并且您正在比较两个基元,两者都是零。
这一个:
System.out.println(longWrapper.equals(0));
与equals
进行比较,因此它将(int
)零作为Integer
加载。 Long
对象永远不会等于Integer
对象,即使它们保持相同的数字。
答案 5 :(得分:0)
我认为这是因为equals方法中的0是一个整数。将longPrimitive定义为0时,此0将转换为long值。 equals方法接受所有对象,因此0保持整数并且不被转换。我的猜测是,在equals方法中,如果给定对象是long的实例,则会有一个调用,因为这个0是一个Integer,所以它会导致false。 我希望这可以帮助你
答案 6 :(得分:0)
Long的equals方法解释了为什么
那里有线
if (obj instanceof Long) {
longWrapper.equals(0)参数将变为Integer类型。
另一方面,longWrapper.equals(longPrimitive)会将pameter装入Long
答案 7 :(得分:0)
来自Long.java
课程:
public boolean equals(Object obj) {
if (obj instanceof Long) {
return value == ((Long)obj).longValue();
}
return false;
}
因此,当您使用等号将Long
与int
进行比较时,if
条件会失败,并且该方法会返回false
。
true