在Java中比较长整数到简单整数

时间:2013-11-12 12:46:17

标签: 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!

为什么是这样的?请指出我在官方doc文件中的一些文章阅读更多内容!

6 个答案:

答案 0 :(得分:4)

Integer                       Long
  ^                            ^
  |                            |        auto-boxing/auto-unboxing
  |                            |
  v                            v
 int -----------------------> long

      primitive promotion

此架构显示了Java可以在不同事物之间执行的隐式转换。

在Java中,不幸的是对象和原语是不同的野兽:Longlong不是同一个东西。从longLong的隐式转换称为自动装箱。从Longlong的隐式转换称为自动取消装箱。这种转换在section 5.1.8 of the Java Language Specification中进行了描述。

此外,与许多其他语言一样,Java在数字类型之间进行了隐式转换。如果int在包含其他long的表达式中使用,则long会隐式提升为1section 5.6 of the Java Language Specification中描述了可以进行这些促销的背景。

请注意,Java中的文字int的类型为1L。 litteral long的类型为Long v = ... if(v == -1) ...

v

Long-1int-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

longObject。它被传递给期望Long的方法,因此它被隐式转换(自动装箱)到Long v = ... if(v.longValue() == -1) ... 。测试成功。

v.longValue()

long-1int-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)