【问题标题】:When does Integer != 1 come true [closed]Integer != 1 什么时候成真[关闭]
【发布时间】:2014-09-17 12:43:40
【问题描述】:

这是经典的,但写信给 Google 并没有给我成功。

我的代码:

Integer i = ..; // Sth is put from database.
if (i != 1) {
   // do sth
} else {
   // do not.
}

案例:

我知道这个比较是不正确的java,我应该比较:

if (i.intValue != 1) {}

if(!i.equals(1)) {}

但是我的代码有第一个,我似乎从某个地方得到了正确的结果,Integer 不是 1,当它是 1 时出现错误。

问题:

周围发生了什么?

【问题讨论】:

  • 一句话,自动装箱...Integer会在需要的时候自动转换成int
  • 整数被自动拆箱
  • 但是请注意,在执行reference comparison 的某些情况下,自动拆箱不会发挥作用。有关更多信息,请参阅此问题:Comparing Integer Values in Java, Strange Behavior

标签: java


【解决方案1】:

但我的代码有第一个,我似乎从某个地方得到了真值,其中整数不是 1,当它是 1 时出现错误。

如果我正确理解您的问题,以下内容可能会解释该行为:

Integer i = 1;
Integer j = new Integer(1);
Integer k = Integer.valueOf(1);

System.out.println(i == j);  // false
System.out.println(i == k);  // true

换句话说,根据Integer 的构造方式,与1 进行比较时,您可以得到真或假。 Integer.valueOf 将重用对象,而 new Integer 不会。

如果您确实使用整数字面量(或int)进行了比较,那么编译器会自动将任何Integer 拆箱,并且您永远不会有任何意外。

【讨论】:

  • 这样的事情可能存在,因为这部分代码的工作方式与我的常识相反,因此我不得不问傻瓜。
  • 是的。自动装箱已经咬了我很多次。 (例如,当试图在 Map<Integer, String> 中查找一个值时,不小心提供了一个 Long 作为键,认为它会将其转换为整数。)
  • 我还记得一些符号 == 与两个整数以某种方式比较对象,而不是值。就像在您和其他答案中指出的那样,情况并非总是如此。
【解决方案2】:

编译器发生变化:

if (i != 1)

if(i.intValue()!=1)

【讨论】:

    【解决方案3】:

    自动装箱是 Java 编译器在原始类型与其对应的对象包装类之间进行的自动转换。例如,将 int 转换为 Integer,将 double 转换为 Double,等等。如果转换方向相反,这称为拆箱。

    See this link

    【讨论】:

      【解决方案4】:

      if (i != 1)if (i.intValue != 1)if(!i.equals(1)) 都相等并且将返回相同的值。编译器会自动将i拆箱,将其转换为原始int

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2010-10-17
        • 1970-01-01
        • 1970-01-01
        • 2012-09-05
        • 2011-05-30
        • 2010-09-20
        • 1970-01-01
        相关资源
        最近更新 更多