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。为什么? 请详细解释。
答案 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);
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
==
运算符检查实际的对象引用。 equals()
检查对象的值(内容)。回答评论
你有,
Integer i = Integer.valueOf(127);
这里创建了新对象&引用已分配给i
Integer j = Integer.valueOf(127); //will not create new object as it already exists
由于整数缓存(数字在-128到127之间),先前创建的对象引用被分配给j
,然后i
和j
指向相同的对象。
现在考虑,
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
。
如果装箱的值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,所以i
和j
指向相同的引用。
k
和l
指向差异引用的位置,因为它们的值为>127
文档中提到了此行为的原因:
这种行为将是理想的行为,而不会造成过度的性能损失,特别是在小型设备上。更少内存限制的实现可能
答案 2 :(得分:0)
valueOf返回一个Integer对象。 Integer是int的包装类。对于你的情况,
Integer == Integer比较实际的对象引用,其中int == int将比较值。
如前所述,缓存了值-128到127,因此返回相同的对象。
如果超出该范围,将创建单独的对象,因此引用将不同。
如果您希望两种情况都有相同的结果,请按以下方式修复: