有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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!

为什么?请给我指一些官方文件中的文章来阅读更多


共 (6) 个答案

  1. # 1 楼答案

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

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

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

    看一下auto-boxing in java以便更好地理解

  2. # 2 楼答案

    因为,equals()期望Object。无法在equals()方法中传递前置值。所以,equals(-1)是不正确的

  3. # 3 楼答案

    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在数字类型之间进行隐式转换。如果在包含其他long的表达式中使用int,则会将其隐式提升为long。这些提升可能发生的上下文在section 5.6 of the Java Language Specification中描述

    请注意,Java中的文字1的类型为int。沿岸的1Llong

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

    v是一个Long,而-1是一个int。Java不知道如何比较对象和原语:它依赖于它的隐式表达式和转换规则来进行比较。这里,-1被转换(自动装箱)为Integer。因此,我们正在比较两个甚至没有相同类型的对象的引用:测试失败

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

    这和上面一样,只是触发隐式转换的不是比较,而是方法调用equalsObject作为参数,因此-1被转换(自动装箱)为Integer。由方法调用触发的隐式转换在section 5.3 of the Java Language Specification中描述

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

    在这里,我们使用Long作为参数调用Long.equal方法,因此测试成功

    那么,什么比较有效呢

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

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

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

    v.longValue()long-1int^由于==运算符,将{}提升为long。测试成功了

  4. # 4 楼答案

    使用

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

    或者

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

    或者

    if (path.get(0)==-1L)
    
  5. # 5 楼答案

    if (path.get(0)!=null && path.get(0).longValue()==-1)
        System.out.println("first condition works");
    

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

  6. # 6 楼答案

    你的前两个例子是比较一个长和一个整数(由于自动装箱),它们永远不可能是同一个对象(自然)

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

    如果要使用==运算符,请编辑:或longValue()/intValue()等方法