我写的是一个简单的条件
List<Long> path = doSomething(); // returns a list of Long and all equal to -1
if (path.get(0)==-1)
sysout("first condition works"); // never executes
if (path.get(0).equals(-1))
sysout("sec condition works"); //never executes
if (path.get(0).equals(new Long(-1)))
sysout("third condition works"); //works!
为什么是这样的?请指出我在官方doc文件中的一些文章阅读更多内容!
答案 0 :(得分:4)
Integer Long ^ ^ | | auto-boxing/auto-unboxing | | v v int -----------------------> long primitive promotion
此架构显示了Java可以在不同事物之间执行的隐式转换。
在Java中,不幸的是对象和原语是不同的野兽:Long
和long
不是同一个东西。从long
到Long
的隐式转换称为自动装箱。从Long
到long
的隐式转换称为自动取消装箱。这种转换在section 5.1.8 of the Java Language Specification中进行了描述。
此外,与许多其他语言一样,Java在数字类型之间进行了隐式转换。如果int
在包含其他long
的表达式中使用,则long
会隐式提升为1
。 section 5.6 of the Java Language Specification中描述了可以进行这些促销的背景。
请注意,Java中的文字int
的类型为1L
。 litteral long
的类型为Long v = ...
if(v == -1) ...
。
v
Long
是-1
,int
是-1
。 Java不知道如何比较对象和基元:它依赖于它的含义转换规则来实现。此处,Integer
被转换(自动装箱)为Long v = ...
if(v.equals(-1)) ...
。因此,我们正在比较两个甚至没有相同类型的对象的引用:测试失败。
equals
这与上面的内容相同,只是它不是触发隐式转换的比较,而是方法调用。 Object
将-1
作为参数,因此Integer
会转换(自动装箱)为Long v = ...
if(v.equals(new Long(-1))) ...
。由方法调用触发的隐式转换在section 5.3 of the Java Language Specification中进行了描述。
Long.equal
在这里,我们使用Long
作为参数调用Long v = ...
if(v.equals(-1L)) ...
方法,因此测试成功。
那么比较有效吗?
-1L
long
是Object
。它被传递给期望Long
的方法,因此它被隐式转换(自动装箱)到Long v = ...
if(v.longValue() == -1) ...
。测试成功。
v.longValue()
long
是-1
,int
是-1
。由于long
运算符,==
被提升为{{1}}。测试成功。
答案 1 :(得分:3)
if (path.get(0)!=null && path.get(0).longValue()==-1)
System.out.println("first condition works");
如果您比较long
原语,则可以使用方法longValue()
但是,在调用此方法之前,您应该检查Long
null
对象。
答案 2 :(得分:3)
你的两个第一个案例是比较Long和Integer(由于自动装箱),它们永远不会是同一个对象(自然)。
你的最后一个案例是正确的。比较对象时使用equals()。
编辑:或者如果你想使用==运算符,可以使用longValue()/ intValue()等方法。
答案 3 :(得分:1)
替换if (path.get(0).equals(-1))
与
if (path.get(0).equals(-1L))
默认情况下,java中的number被视为Integer,因此比较失败。
请查看auto-boxing in java以便更好地理解
答案 4 :(得分:0)
因为,equals()
期待Object
。您无法在equals()
方法中传递预先设定的值。因此,equals(-1)
不正确。
答案 5 :(得分:0)
使用
if (path.get(0).equals(-1)) //long value
或
if (path.get(0).longValue()==-1)
或
if (path.get(0)==-1L)