比较整数时出现意外结果

时间:2012-08-30 21:07:49

标签: java

  

可能重复:
  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("@@@"); 
       }
       }
     }
    
  3. 谁能告诉我可能是什么原因。

4 个答案:

答案 0 :(得分:8)

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

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

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

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

答案 1 :(得分:5)

您不是在比较int,而是在比较对象以获得引用相等性。使用.equals,或使用int类型代替Object

答案 2 :(得分:1)

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

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

答案 3 :(得分:1)

使用if(a.equals(b))并且不要使用==来比较作为Object类的子类的对象。

==运算符仅用于原始类型,如int,long等。