2
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);  
  }  
}

第一个打印语句打印为真,而第二个打印语句为假。为什么?请详细说明。

4

3 回答 3

5

这是因为整数缓存。

来自java 语言规范 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);   

两者都i指向j一个对象。因为值小于 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()检查对象的值(内容)。

回复评论

你有,

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。因为两者都是不同的参考并且有不同的价值。

于 2013-10-19T09:37:00.600 回答
4
   i==j

用于整数缓存true 之间-128127 由于整数缓存的值。

语言规范

如果被装箱的值 p 是真、假、一个字节或 \u0000 到 \u007f 范围内的一个字符,或者一个介于 -128 和 127(含)之间的 int 或短数字,则令 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指向相同的引用。

where askl 指向差异引用,因为它们的值>127

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

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

于 2013-10-19T09:38:45.120 回答
0

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

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

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

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

如果您希望两种情况的结果相同,您可以通过以下方式修复它:

  • 使类型 int
  • 将类型转换为 int 或
  • 使用 .equals()
于 2013-10-19T09:45:44.593 回答