关于整数比较的澄清?

时间:2013-10-19 09:35:25

标签: java integer autoboxing value-of

class Demo{
public static void main(String[] args) {  
     Integer i = Integer.valueOf(127);  
     Integer j = Integer.valueOf(127);        

     System.out.println(i==j);  

     Integer k = Integer.valueOf(128);  
     Integer l = Integer.valueOf(128);        

     System.out.println(k==l);  
  }  
}

第一个print语句打印为true,而第二个打印语句打印为false。为什么? 请详细解释。

3 个答案:

答案 0 :(得分:5)

这是因为整数缓存。

来自java language specification 5.1.7

If the value p being boxed is true, false, a byte, or a char in the range 
\u0000 to \u007f, or an int or short number between -128 and 127 (inclusive), 
then let r1 and r2 be the results of any two boxing conversions of p. 
It is always the case that r1 == r2.  

理想情况下,装箱给定的原始值p,总是会产生相同的参考

Integer i = Integer.valueOf(127);  
Integer j = Integer.valueOf(127);   

ij都指向同一个对象。因为该值小于127.

Integer k = Integer.valueOf(128);  
Integer l = Integer.valueOf(128);   

k& l指向不同的对象。因为该值大于127 因为,您正在使用==运算符检查对象引用,您将得到不同的结果。


更新

您可以使用equals()方法获得相同的结果

System.out.println(i.equals(j));//equals() compares the values of objects not references  
System.out.println(k.equals(l));//equals() compares the values of objects not references 

输出

true
true  
  1. ==运算符检查实际的对象引用。
  2. equals()检查对象的值(内容)。

  3. 回答评论

    你有,

    Integer i = Integer.valueOf(127); 
    

    这里创建了新对象&引用已分配给i

    Integer j = Integer.valueOf(127); //will not create new object as it already exists 
    

    由于整数缓存(数字在-128到127之间),先前创建的对象引用被分配给j,然后ij指向相同的对象。

    现在考虑,

    Integer p = Integer.valueOf(127); //create new object 
    Integer q = Integer.valueOf(126); //this also creates new object as it does not exists  
    

    显然,使用==运算符和equals()方法的两项检查都会生成false。由于两者都是不同的引用并且具有不同的值。

答案 1 :(得分:4)

   i==j
由于整数缓存,

true-128之间的值为127

来自language spec

  

如果装箱的值p为真,假,字节或范围为\ u0000到\ u007f的字符,或者介于-128和127(含)之间的整数或短数,则让r1和r2为p的任意两次拳击转换的结果。始终是r1 == r2。

的情况
   Integer i = Integer.valueOf(127);   // new object
   Integer j = Integer.valueOf(127);   //cached object reference 
   Integer k = Integer.valueOf(128);   // new object
   Integer l = Integer.valueOf(128);   // new object

因为值为127,所以ij指向相同的引用。

kl指向差异引用的位置,因为它们的值为>127

文档中提到了此行为的原因:

这种行为将是理想的行为,而不会造成过度的性能损失,特别是在小型设备上。更少内存限制的实现可能

答案 2 :(得分:0)

valueOf返回一个Integer对象。 Integer是int的包装类。对于你的情况,

Integer == Integer比较实际的对象引用,其中int == int将比较值。

如前所述,缓存了值-128到127,因此返回相同的对象。

如果超出该范围,将创建单独的对象,因此引用将不同。

如果您希望两种情况都有相同的结果,请按以下方式修复:

  • 使类型为int
  • 将类型转换为int或
  • 使用.equals()