5

可能重复:
整数包装器对象仅在值 127 内共享相同的实例?
!= 和 == 运算符如何处理 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("@@@"); 
       }
       }
     }
    

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

4

4 回答 4

7

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

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

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

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

于 2012-08-30T21:11:30.440 回答
5

您不是在比较ints,而是在比较对象的引用相等性。使用.equals,或使用 typeint代替Object

于 2012-08-30T21:09:53.557 回答
1

使用if(a.equals(b))和不使用==来比较作为 Object 类的子类的 Object。

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

于 2012-08-30T21:12:05.770 回答
1

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

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

于 2012-08-30T21:10:14.780 回答