3

我在写一个简单的条件

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!

为什么会这样?请指向我官方​​文档文件中的一些文章以阅读更多内容!

4

6 回答 6

9
整数长
  ^ ^
  | | 自动装箱/自动拆箱
  | |
  vv
 int ------------------------------------> 长

      原始促销

此模式显示Java 可以在不同事物之间进行哪些隐式转换。

在 Java 中,不幸的是,对象和原语是不同的野兽:Long而且long不是同一种东西。long从to的隐式转换Long称为自动装箱Long从to的隐式转换long称为自动拆箱Java 语言规范的 5.1.8 节描述了这种转换。

此外,与许多其他语言一样,Java 具有数字类型之间的隐式转换。如果 An在包含其他s的表达式中使用,则它会int被隐式提升为 a 。Java 语言规范的第 5.6 节描述了这些提升可能发生的上下文。longlong

请注意,1Java 中的文字有 type int。litteral1L有 type long

Long v = ...
if(v == -1) ...

v是一个Long并且-1是一个int。Java 不知道如何比较对象和原语:它依靠其隐式转换规则来做到这一点。在这里,-1被转换(自动装箱)为Integer. 因此,我们正在比较两个甚至不具有相同类型的对象的引用:测试失败。

Long v = ...
if(v.equals(-1)) ...

这和上面是一样的,只是触发隐式转换的不是比较,而是方法调用。equals将 anObject作为参数,因此-1被转换(自动装箱)为Integer. Java 语言规范的 5.3 节描述了由方法调用触发的隐式转换。

Long v = ...
if(v.equals(new Long(-1))) ...

这里我们Long.equal以a为参数调用方法Long,所以测试成功。

那么,什么比较有效呢?

Long v = ...
if(v.equals(-1L)) ...

-1L是一个long。它被传递给需要 a 的方法Object,因此它被隐式转换(自动装箱)为 a Long。测试成功。

Long v = ...
if(v.longValue() == -1) ...

v.longValue()是一个long-1是一个int。因为运营商-1而被提升为a 。测试成功。long==

于 2013-11-12T13:13:53.923 回答
4
if (path.get(0)!=null && path.get(0).longValue()==-1)
    System.out.println("first condition works");

如果您比较long原语,您可以使用方法longValue()
但是,您应该在调用此方法之前检查Long对象。null

于 2013-11-12T12:48:06.777 回答
3

您的前两个案例是将 Long 与 Integer 进行比较(由于自动装箱),它们永远不可能是同一个对象(自然)。

你的最后一个案例是正确的。比较对象时使用 equals()。

编辑:或者 longValue()/intValue() 等方法,如果你想使用 == 运算符。

于 2013-11-12T12:48:18.303 回答
1

代替if (path.get(0).equals(-1))

if (path.get(0).equals(-1L))

默认情况下,数字在java中被视为整数,因此比较失败。

看看java中的自动装箱以获得更好的理解

于 2013-11-12T12:48:48.540 回答
0

因为,equals()期待Object。您不能在equals()方法中传递 premitive 值。所以,equals(-1)是不正确的。

于 2013-11-12T12:48:43.660 回答
0

采用

  if (path.get(0).equals(-1)) //long value

或者

if (path.get(0).longValue()==-1)

或者

if (path.get(0)==-1L)
于 2013-11-12T12:48:47.090 回答