【问题标题】:Unexpected result when comparing ints [duplicate]比较整数时出现意外结果[重复]
【发布时间】:2012-08-25 16:38:23
【问题描述】:

可能重复:
Integer wrapper objects share the same instances only within the value 127?
How != and == operators work on Integers in Java?

我尝试将两个整数与以下情况进行比较,得到了意想不到的结果

  1. 当我执行以下操作时,@@@ 被打印出来了。

     class C {
       static Integer a = 127;
       static Integer b = 127;
       public static void main(String args[]){
       if(a==b){
          System.out.println("@@@"); 
       }
       }
     }
    
  2. 当我执行以下操作时,@@@ 没有打印出来。

     class C {
       static Integer a = 145;
       static Integer b = 145;
       public static void main(String args[]){
       if(a==b){
          System.out.println("@@@"); 
       }
       }
     }
    

谁能告诉我可能是什么原因。

【问题讨论】:

标签: java


【解决方案1】:

您正在比较对象的身份。对于低于 128 的值,Integer 类缓存其对象。这就是为什么它在第一个例子中是相等的。另一个例子是没有缓存的更高值。

正如@niklon 指出的那样,缓存的下边界也为-128。

可以使用 VM arg -Djava.lang.Integer.IntegerCache.high=4711 调整上边框。

在 Peter 有趣的博文中进一步阅读: http://vanillajava.blogspot.co.uk/2012/01/surprising-results-of-autoboxing.html

【讨论】:

  • 其他包装类也会发生这种情况吗?
  • 顺便说一下,整数缓存的下限是-128。
  • @niklon,这是一个实现细节。 Javadoc 表示“此方法将始终缓存 -128 到 127(含)范围内的值,并且可能缓存此范围之外的其他值。”
  • 事实上,我认为您可以使用 vm arg 将上边框设置为另一个自定义值。
  • @PhaniRahul Long 和 Short 也有缓存。
【解决方案2】:

使用if(a.equals(b)),不要使用==来比较Object类的子类。

== 运算符仅适用于 int、long 等原始类型。

【讨论】:

    【解决方案3】:

    这里您使用的是Integer 对象,而不是int 原语。因此,您应该将这两个实例与.equals(...) 进行比较,而不是==。如果您改用原始类型,您将使用==。

    请务必注意,在处理对象时,== 会比较两个对象的引用,而不是实际值 - 因此它有时可能会返回看似奇怪的结果。

    【讨论】:

      【解决方案4】:

      您不是在比较 ints,而是在比较对象的引用相等性。使用.equals,或使用int 类型而不是Object。

      【讨论】:

      • /那为什么在第一种情况下打印“@@@”..?
      • @Raghav,因为许多版本的 Java memoize small Integers:“此方法将始终缓存 -128 到 127(含)范围内的值,并可能缓存此范围之外的其他值。”跨度>
      猜你喜欢
      • 2014-01-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-21
      • 1970-01-01
      • 2010-11-09
      • 2021-03-06
      • 2020-02-16
      相关资源
      最近更新 更多