Java中长整数与简单整数的比较
我写了一个简单的条件
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!
为什么?请给我指一些官方文件中的文章来阅读更多
# 1 楼答案
替换
if (path.get(0).equals(-1))
与
默认情况下,数字在java中被视为整数,因此比较失败
看一下auto-boxing in java以便更好地理解
# 2 楼答案
因为,
equals()
期望Object
。无法在equals()
方法中传递前置值。所以,equals(-1)
是不正确的# 3 楼答案
这个模式显示了Java可以在不同事物之间进行的隐式转换
不幸的是,在Java中,对象和原语是不同的动物:
Long
和long
不是相同的东西。从long
到Long
的隐式转换称为自动装箱。从Long
到long
的隐式转换称为自动取消装箱。这种转换在section 5.1.8 of the Java Language Specification中描述此外,与许多其他语言一样,Java在数字类型之间进行隐式转换。如果在包含其他
long
的表达式中使用int
,则会将其隐式提升为long
。这些提升可能发生的上下文在section 5.6 of the Java Language Specification中描述请注意,Java中的文字
1
的类型为int
。沿岸的1L
有long
型v
是一个Long
,而-1
是一个int
。Java不知道如何比较对象和原语:它依赖于它的隐式表达式和转换规则来进行比较。这里,-1
被转换(自动装箱)为Integer
。因此,我们正在比较两个甚至没有相同类型的对象的引用:测试失败这和上面一样,只是触发隐式转换的不是比较,而是方法调用
equals
将Object
作为参数,因此-1
被转换(自动装箱)为Integer
。由方法调用触发的隐式转换在section 5.3 of the Java Language Specification中描述在这里,我们使用
Long
作为参数调用Long.equal
方法,因此测试成功那么,什么比较有效呢
-1L
是一个long
。它被传递给一个需要Object
的方法,因此它被隐式转换(自动装箱)为Long
。测试成功了v.longValue()
是long
,-1
是int
^由于==
运算符,将{long
。测试成功了# 4 楼答案
使用
或者
或者
# 5 楼答案
如果比较
long
原语,可以使用方法longValue()但是,在调用此方法之前,应该检查
Long
对象中的null
# 6 楼答案
你的前两个例子是比较一个长和一个整数(由于自动装箱),它们永远不可能是同一个对象(自然)
你的最后一个案子是正确的。比较对象时使用equals()
如果要使用==运算符,请编辑:或longValue()/intValue()等方法