2012-08-30 49 views
5

可能重复:
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("@@@"); 
        } 
        } 
    } 
    

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

+0

如果有人能格式化it..I我不能...... [整数包装对象的 – Rookie

+4

可能重复只能在共享相同的情况下,值127?](http://stackoverflow.com/questions/5117132/integer-wrapper-objects-share-the-same-instances-only-within-the-value-127)和[New Integer vs valueOf]( http://stackoverflow.com/questions/2974561)和[不一致的行为对java的==](http://stackoverflow.com/questions/1148805)和[整数包装对象共享相同的实例,只有值127?] (http://stackoverflow.com/questions/5117132)和... –

+2

更多详细信息,如果你有兴趣http://vanillajava.blogspot.co。uk/2012/01 /令人惊讶的结果 - autoboxing.html –

回答

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

+0

这是否与其他包装类一样? –

+1

顺便说一句,整数缓存的下限是-128。 – niklon

+1

@niklon,这是一个实现细节。 [Javadoc](http://docs.oracle.com/javase/7/docs/api/java/lang/Integer.html#valueOf%28int%29)表示“此方法将始终缓存值范围-128至127,包括**,并且可以缓存在此范围之外的其他值。**“ –

5

你不比较int s,你比较对象的参考平等。使用.equals,或使用int而不是Object

+1

/那么为什么它在第一个案件打印“@@@”..? – Rookie

+2

@Raghav,因为许多版本的Java [记忆小型Integer's](http://docs.oracle.com/javase/7/docs/api/java/lang/Integer.html#valueOf%28int%29) :“此方法将始终缓存范围在-128到127之间的值,并且可能会缓存此范围之外的其他值。” –

1

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

重要的是要指出,当处理对象时,==比较两个对象的引用,而不是实际值 - 因此有时可能返回看似奇怪的结果。

1

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

==运营商只是为基本类型如int,long等等